Einzelnen Beitrag anzeigen

Thom

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

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

  Alt 9. Jan 2011, 15:31
Beispiel 9
Interaktion zwischen zwei Karten innerhalb verschiedenen Browser-Komponenten

Innerhalb einer Browser-Komponente können problemlos mehrere Karten untergebracht werden, die sowohl das selbe Google Maps API als auch die selben JavaScript-Objekte nutzen.
Was ist aber, wenn die Karten in verschiedenen TWebBrowser-Komponenten untergebracht werden sollen? Dann sind nämlich einige Regeln zu beachten, damit alles wie erwartet funktioniert und es zu keinen JavaScript-Fehlern kommt (auch COM-Fehler werden teilweise als JavaScript-Fehler gemeldet, da es sich hierbei um COM-Zugriffe auf die Script-Engine des Browsers handelt).

Wurde bis jetzt immer mit einem Skript-Objekt gearbeitet, muß jetzt für jede verwendete Browser-Komponente ein eigenes erstellt werden:
Delphi-Quellcode:
  Script1:=TScript.Create(WebBrowser1);
  Script2:=TScript.Create(WebBrowser2);
Bei der Erstellung von Objekten muß außerdem immer das Skript-(COM-)Objekt angegeben werden. Bei allen über das Google Maps API erstellten Objekten ist dies automatisch der Fall:
Delphi-Quellcode:
  Map1:=Script1.Google.Maps.Map(...);
  Map2:=Script2.Google.Maps.Map(...);
Werden aber andere Strukturen, wie zum Beispiel Arrays, einfache Objekte oder davon abgeleitet Klassen - wie zum Beispiel TMapOptions - direkt erstellt, muß in ihrem Konstruktor der Skriptkontext angeben werden, in dem die Erstellung erfolgen soll:
Delphi-Quellcode:
  //MapOpts wird in WebBrowser1 erstellt:
  Script1:=TScript.Create(WebBrowser1);
  MapOpts:=TMapOptions.Create(Script1);
In den meisten Fällen wird sicherlich mit einer Browser-Komponente gearbeitet. Dann kann der optionale Skript-Parameter im Konstruktor des zu erstellenden Objektes weggelassen werden und vom Framework wird automatisch ein globales Skript-Objekt verwendet (Variable Script in der Unit JScriptObjects).

Ein Beispiel:
Die Karte 2 soll das selbe Zentrum wie Karte 1 haben, wobei sich beide Karten in unterschiedlichen Browser-Komponenten befinden.
Delphi-Quellcode:
  Map2.Center:=Map1.Center;
  //-> JavaScript-Fehlermeldung
Diese Zuweisung führt zu einem JavaScript-Fehler, da es sich bei den Koordinaten um ein (T)LatLng-Objekt handelt, das nicht einfach von WebBrowser1 an WebBrowser2 übergeben werden kann. Genauer gesagt: Wie in Delphi wird nicht das gesamte Objekt übergeben, sondern nur ein Zeiger (eine Referenz) auf dieses Objekt. Das funktioniert natürlich nicht, da die beiden COM-Server (Browser-Komponenten) nicht ohne weiteres aufeinander zugreifen können.

Als Lösung bietet sich die Erstellung eines neuen Objektes im Kontext von WebBrowser2 an mit anschließender Übertragung der Eigenschaften. Das würde in Delphi etwa einem Assign entsprechen. Im Falle der Übertragung eines LatLng-Objektes könnte das so ablaufen:
Delphi-Quellcode:
  Map2.Center:=Script2.Google.Maps.LatLng(Map1.Center.Lat,Map1.Center.Lng);
  //...
demo_9.jpg

Compilierte Exe:
Angehängte Dateien
Dateityp: zip MultiMaps.zip (278,3 KB, 204x aufgerufen)
Thomas Nitzschke

Geändert von Thom ( 9. Jan 2011 um 15:35 Uhr)
  Mit Zitat antworten Zitat