如何使用GMLib和LoadFromDataset

时间:2016-11-15 19:20:10

标签: delphi google-maps-api-3 geocode delphi-10.1-berlin gmlib

我在Windows 10 64位开发机器上使用Delphi Berlin和GMLib v3 Google Map Components。当使用GMMarker组件的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;

然后我可以访问反弹动画方法并在点击标记时使用GMMarker的索引定位Listview,如下所示:

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时,这非常有效。但是,一旦数据库更新,我想通过在谷歌地图上显示某一天的所有交付地点来完成类似的事情。为此,我使用GMMarker的LoadfromDataset函数,如下所示:

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

这也很有效并产生以下地图:

enter image description here

我遇到的问题是,当使用LoadFromDataSet时,即使地图上有许多标记,GMMarker.Count也是1。因此,我假设我必须使用GMMarker的VisualObjects属性。但是,GMMarker.VisualObjects.Count也是1。

我的问题是:

当我使用GMMarkers.LoadFromDataset函数时,如何访问屏幕上标记的Animation.Bounce属性?

非常感谢任何帮助。

伦纳德

1 个答案:

答案 0 :(得分:0)

我解决了我的问题但不知道为什么在提问之前我没有尝试过这个问题。也许我的回答会帮助别人。

为了解决这个问题,我将Marker从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;