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);
//...
Compilierte Exe: