Einzelnen Beitrag anzeigen

Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#402

AW: Google Maps über COM (Component Object Model)

  Alt 19. Jun 2013, 13:08
Hallo mischo22,

Du speicherst die Script-Objekte nicht in den Variablen:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if MapScript1=nil then
      TScript.Create(WebBrowser1).LoadAPIAsync(InitMap); //<- Script wird erstellt, aber nicht in MapScript1 gespeichert

  if MapScript2=nil then
    TScript.Create(WebBrowser2).LoadAPIAsync(InitMap); //<- selbe Problem
end;
Die Lösung sollte sein:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if MapScript1=nil then
  begin
    MapScript1:=TScript.Create(WebBrowser1);
    MapScript1.LoadAPIAsync(InitMap);
  end;
  if MapScript2=nil then
  begin
    MapScript2:=TScript.Create(WebBrowser2);
    MapScript2.LoadAPIAsync(InitMap);
  end;
end;
Allerdings kannst Du Dir auch das Speichern der Script-Objekte sparen - das erfolgt schon frameworkintern:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if Script(WebBrowser1)=nil then
    with TScript.Create(WebBrowser1) do
      LoadAPIAsync(InitMap);
  if Script(WebBrowser2)=nil then
    with TScript.Create(WebBrowser2) do
      LoadAPIAsync(InitMap);
end;
Um später auf das Objekt zugreifen zu können, reicht
Delphi-Quellcode:
  with Script(WebBrowser1) do
  begin
    Maps[0].Zoom:=17;
    Maps[0].Center:=New(Google.Maps.LatLng(50,10)); //<- New-Funktion verwenden
    Maps[0].MapTypeID:=Google.Maps.MapTypeId.SATELLITE;
  end;
Wer Angst vor dem angeblich bösen "with" hat, macht es so:
Delphi-Quellcode:
  Script(WebBrowser1).Maps[0].Zoom:=17;
  Script(WebBrowser1).Maps[0].Center:=New(Script(WebBrowser1).Google.Maps.LatLng(50,10)); //<- New-Funktion verwenden
  Script(WebBrowser1).Maps[0].MapTypeID:=Script(WebBrowser1).Google.Maps.MapTypeId.SATELLITE;
Allerdings mußt Du bei der Erstellung von Hilfsobjekten momentan noch beachten, daß dabei ebenfalls das Script-Objekt als Parameter angegeben wird:
Delphi-Quellcode:
procedure TForm1.InitMap(Sender: TObject);
var
  Map: TMap;
  MapOptions: TMapOptions;
  MarkerOptions: TMarkerOptions;
begin
  with Sender as TScript do //<- hier eventuell schon einmal den harten Cast für Version 3 vermeiden (das geht nicht gut mit Interfaces)
  begin
    MapOptions:=TMapOptions.Create(Sender as TScript); //<- hier das Script-Objekt als Parameter angeben
    with MapOptions do
    begin
      DisableDefaultUI:=true;
      DisableDoubleClickZoom:=true;
      Draggable:=false;
      ScrollWheel:=false;
      KeyboardShortcuts:=false;
      MapTypeID:=Google.Maps.MapTypeId.Roadmap;
      Zoom:=1;
      Center:=New(Google.Maps.LatLng(0,0)); //<- New-Funktion verwenden
    end;
    Map:=New(Google.Maps.Map(MapOptions)); //<- Karte für den Marker merken

    // Marker Zeichnen
    MarkerOptions:=TMarkerOptions.Create(Sender as TScript); //<- hier ebenfalls das Script-Objekt angeben
    MarkerOptions.Map:=Map; //<- hier die Variable Map verwenden - sonst wird noch eine weitere Karte angelegt
    MarkerOptions.Position:=New(Google.Maps.LatLng(53,8)); //<- New-Funktion verwenden
    MarkerOptions.Title:='Letzte Position';
    New(Google.Maps.Marker(MarkerOptions));
  end;
end;
In der Version 3 wird es für diese Hilfsobjekte ebenfalls eine passende New-Funktion geben, so daß dann die Sache noch etwas einfacher wird:
Delphi-Quellcode:
  with Sender as IScript do
  begin
    MapOptions:=New(Google.Maps.MapOptions);
    [...]
  end;
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (19. Jun 2013 um 13:11 Uhr)
  Mit Zitat antworten Zitat