0

Windows 10 64 ビット開発マシンで GMLib v3 Google マップ コンポーネントを使用して Delphi ベルリンを使用しています。GMMarker コンポーネントの LoadFromDataSet 関数を使用しているときに、マーカーまたはグリッドをクリックしたときに位置をアニメーション化できるようにしたいと考えています。これについてどうすればよいかわかりません。

私の ERP アプリケーションは、入力された住所をジオコーディングし、返された緯度と経度を取得して、それらの値をデータベースに保存することにより、入力された住所を検証しようとします。ジオコーディングが複数の値を返す場合、グリッドとジオコーディング結果の場所を示すマップを含む画面を表示します。

ここに画像の説明を入力

これを実現するには、最初にすべての結果を 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 のインデックスを使用してリストビューを配置できます。

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;

これは、場所を個々の GMMarker にロードするときに非常にうまく機能します。ただし、データベースが更新されたら、特定の日のすべての配達場所を Google マップに表示することで、同様のことを実現したいと考えています。これを行うには、次のように GMMarker の LoadfromDataset 関数を使用します。

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

これも非常にうまく機能し、次のマップが生成されます。

ここに画像の説明を入力

私が抱えている問題は、LoadFromDataSet を使用すると、マップ上に多数のマーカーがあるにもかかわらず、GMMarker.Count が 1 になることです。したがって、GMMarker の VisualObjects プロパティを使用する必要があると思います。ただし、GMMarker.VisualObjects.Count も 1 です。

私の質問は:

GMMarkers.LoadFromDataset 関数を使用するときに、画面上のマーカーの Animation.Bounce プロパティにアクセスするにはどうすればよいですか?

どんな助けでも大歓迎です。

レナード

4

1 に答える 1

0

問題は解決しましたが、質問する前になぜこれを試さなかったのかわかりません。多分私の答えは他の誰かを助けるでしょう。

この問題を解決するために、OnClick イベントから HandleAnimation 関数に Marker を渡し、渡されたパラメーターを使用して次のようにアニメーション メソッドにアクセスしました。

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;
于 2016-11-15T20:46:08.377 に答える