2016-11-15 12 views
0

Я использую Delphi Berlin с компонентами Google Map GMLib v3 на 64-разрядной машине разработки Windows 10. Я хотел бы иметь возможность анимировать местоположения при нажатии на маркер или сетку при использовании функции LoadFromDataSet компонента GMMarker. Я не уверен, как это сделать.Как оживить маркеры с использованием GMLib и LoadFromDataset

Приложение моего ERP пытается проверить введенный адрес путем геокодирования введенного адреса и захвата возвращаемой широты и долготы, а затем сохранить эти значения в базе данных. Когда геокодирование возвращает несколько значений, я показываю экран с сеткой и карту, показывающую местоположения результатов геокодирования.

enter image description here

выполнить это, сначала добавляя все результаты к компоненту Listview, а затем обрабатывать каждый ListView пункт и добавить GMMarker для каждого случая следующим образом:

for I := 0 to ListView.Items.Count-1 do 
begin 
GMMarker1.Add(StrToFloat(ListView.Items[I].SubItems[2]),StrToFloat(ListView.Items[I].SubItems[1]),ListView.Items[I].Caption); 
end; 

Я тогда в состоянии получить доступ к методу анимации bounce и поместить Listview с помощью индекса GMMarker при нажатии маркера следующим образом:

procedure TfrmGeoCodeAdd.GMMarker1Click(Sender: TObject; LatLng: TLatLng;Index: Integer; LinkedComponent: TLinkedComponent); 
begin 
    inherited; 

    if ListView.ItemIndex = Index then 
    HandleAnimation(Index) 
    else 
    ListView.ItemIndex := Index; 
end; 

procedure TfrmGeoCodeAdd.HandleAnimation(Index: integer); 
begin 
    inherited; 

    if (AnimationIndex >= 0) then 
    begin 
    GMMarker1[AnimationIndex].Animation.Bounce := False; 
    end; 

    if (AnimationIndex = index) then 
     AnimationIndex := -1 
    else 
    begin 
    if GMMarker1[Index].Animation.Bounce then 
     GMMarker1[Index].Animation.Bounce := False 
    else 
     GMMarker1[Index].Animation.Bounce := True; 

    AnimationIndex := Index; 
    end; 
end; 

Это очень хорошо работает, когда я загружаю места в отдельные GMMarkers. Однако, как только база данных будет обновлена, я хочу выполнить аналогичную задачу, показывая все местоположения доставки на определенный день на карте google. Для этого я использую функцию LoadfromDataset в GMMarker следующим образом:

GMMarker1.LoadFromDataSet(cdsDeliveries, 'Latitude', 'Longitude', 'SO_NO', 'Marker', True); 
GMMarker1.ZoomToPoints; 

Это также работает очень хорошо, и производит следующую карту:

enter image description here

У меня есть проблема, что когда LoadFromDataSet является используемый, GMMarker.Count равен 1, хотя на карте есть множество маркеров. Поэтому я предполагаю, что должен использовать свойство VisualObjects GMMarker. Однако GMMarker.VisualObjects.Count также 1.

Мой вопрос:

Как я могу получить доступ к Animation.Bounce свойству маркеров на экране, когда я использую функцию GMMarkers.LoadFromDataset?

Любая помощь очень ценится.

Леонард

ответ

0

я решил мою проблему, но не знаю, почему я не пробовал это, прежде чем задавать вопрос. Может быть, мой ответ поможет кому-то еще.

Чтобы решить эту проблему, я прошел по маркерам от события OnClick к моей функции HandleAnimation и использовал переданный параметр для доступа к методам анимации следующим образом:

procedure TfrmDeliveryMap.GMMarker1Click(Sender: TObject; LatLng: TLatLng; Index: Integer; LinkedComponent: TLinkedComponent); 
begin 
    inherited; 

    if cdsDeliveries.RecNo = Index then 
    HandleAnimation((Sender as TGMMarker), Index) 
    else 
    cdsDeliveries.RecNo := Index; 
end; 

procedure TfrmDeliveryMap.HandleAnimation(Marker: TGMMarker; Index: integer); 
begin 
    inherited; 

    if (AnimationIndex >= 0) then 
    Marker[AnimationIndex].Animation.Bounce := False; 

    if (AnimationIndex = index) then 
     AnimationIndex := -1 
    else 
    begin 
    if Marker[Index].Animation.Bounce then 
     Marker[Index].Animation.Bounce := False 
    else 
     Marker[Index].Animation.Bounce := True; 

    AnimationIndex := Index; 
    end; 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^