![]() |
AW: Google Maps über COM (Component Object Model)
Anmerkung, du kannst auch aus einer lokalen Datei laden, hierzu ein Beispiel
Delphi-Quellcode:
Gruß DelphiFan2008MarkerImage MarkerOptions := TMarkerOptions.Create; with MarkerOptions do begin Position := Script.Google.Maps.LatLng( x,y ); Title := 'Ich bin ein Marker aus einer Datei'; IconImage := Google.Maps.MarkerImage( Filename,Google.Maps.Size(32,32),Google.Maps.Point(0,0),Google.Maps.Point(16,32)); end; Marker := New( Google.Maps.Marker( MarkerOptions )); Marker.SetMap( Maps[0] ); |
AW: Google Maps über COM (Component Object Model)
Zitat:
entschuldige bitte, war wohl schon etwas zu spät... In der Formular-Unit hatte ich's noch geändert, aber in der dpr-Datei vergessen. Das ist die neue Konfigurationsdatei für Version 3 - diesen Eintrag mußt Du lediglich durch gmConfig.inc ersetzen. Zitat:
wie DelphiFan2008 schon schrieb, akzeptiert TWebBrowser auch Base64-codierte Daten und eignet sich damit hervorragend dazu, Bilder direkt vom Programm an Marker zu übergeben. Das geht sogar so schnell, daß das Marker-Bild quasi in "Echtzeit" ohne Flackern aktualisiert werden kann. Die zur Codierung notwendige Unit Base64.pas befindet sich im Unterverzeichnis JScript des Frameworks. Allerdings muß man dabei beachten, daß mindestens der IE7 installiert und das codierte Bild nicht zu groß ist (ab IE9 werden auch größere Bilder akzeptiert). Die zweite Möglichkeit besteht natürlich darin, eine lokale Datei anzugeben (siehe letzten Beitrag von DelphiFan2008). |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Thom,
habe gerade in einer anderen Applikation das Problem, dass wenn ich einem Marker eine .OnClick Routine zuordnen möchte, folgende Fehlermeldung kommt.
Delphi-Quellcode:
Komisch! Gruss DelphiFan2008
private
{ Private-Deklarationen } procedure MarkerClick(Sender: TObject; Event: TEvent); ... MarkerOptions := TMarkerOptions.Create; with MarkerOptions do begin Map := Self.Map; Position := Results[0].Geometry.Location; end; Marker := New( Google.Maps.Marker( MarkerOptions )); Marker.OnClick := MarkerClick; // ====> Hier erscheint die Fehlermeldung LB.Items.AddObject( Results[0].FormattedAddress,Marker ); ... Übrigens, nach dem Ersatz {$INCLUDE gmConfig.inc} lief dein Demo inkl. Drag&Zoom als auch Kreis/Linie war zu sehen - wo da der Fehler liegt? |
AW: Google Maps über COM (Component Object Model)
Schön, daß die Demo bei Dir funktioniert!
Allerdings kann ich Dir nicht sagen, weshalb das in Deinem Programm nicht funktioniert. Hier bleibt Dir wohl nur übrig, Schritt für Schritt zu testen. Liest Du die Daten im Hauptformular ein oder in einer anderen Unit? Compilierst Du im Debug- oder Release-Modus? Im Release-Modus werden nämlich an vielen Stellen keine Exceptions ausgelöst - hier muß dann im Programmcode getestet werden, ob die vorherige Funktion erfolgreich war. Werden Events genutzt, muß die Unit gmEvents in der Uses-Anweisung eingebunden werden. Das liegt an der unterschiedlichen Deklaration des Typs TEvent. Unter Umständen muß explizit angegeben werden, welcher TEvent-Typ verwendet werden soll:
Delphi-Quellcode:
procedure MarkerClick(Sender: TObject; Event: gmEvents.TEvent);
[...] |
AW: Google Maps über COM (Component Object Model)
Hallo Delphifan2008 und Thom,
ich lade die PNGs jetzt direkt aus einer PNGImageList in die Encode64()-Funktion, funktioniert ohne Probleme. Danke für die Tipps und Grüße, Stefan Zitat:
|
AW: Google Maps über COM (Component Object Model)
:thumb:
|
AW: Google Maps über COM (Component Object Model)
Ertsmal ein Kompliment für die tolle Arbeit.
Ich bin jetzt zunächst mal durch die Demos durch, und komme langsam klar. Ein Problem, wurde hier auch schon mal angesprochen:
Delphi-Quellcode:
Wenn ich das API im onShow oder onCreate initialisiere, und dann einen Moment warte, bis ich den Rest aufrufe, läuft alles. Durch die Umstellung auf LoadAPI, sollte aber doch sichergestellt sein, dass das API vollständig geladen ist.if Script = nil then with TScript.Create(WebBrowser1) do LoadAPI(InitMap); //<--- habe ich von LoadApiAsync in LoadApi geändert with Script do begin Geocoder.Geocode(TGeocoderRequest.Create(s), //<----- hier Zugriffsverletzung procedure(Sender: TObject; Results: TGeocoderResultArray; Status: String) var MarkerOptions: TMarkerOptions; I: Integer; idx : Integer; abort : Boolean; begin abort := false; if Status = Google.Maps.GeocoderStatus.OK then begin Map.SetCenter(Results[0].Geometry.Location); MarkerOptions := TMarkerOptions.Create; with MarkerOptions do begin Map := self.Map; Position := Results[0].Geometry.Location; end; New(Google.Maps.Marker(MarkerOptions)); end else ShowMessage('Karte kann nicht angezeigt werden. ' + 'Originalmeldung: ' + Status); end); end; end; Freu mich auf Deine Antwort. Viele Grüße Sebastian |
AW: Google Maps über COM (Component Object Model)
Hallo Sebastian,
vielen Dank für das Lob! :-D Die Methode InitMap wird sowohl bei LoadAPI als auch LoadAPIAsync garantiert erst nach der kompletten Initialisierung des API's aufgerufen. Der einzige - nach außen sichtbare - Unterschied liegt darin, ob der Hauptthread in der Zwischenzeit blockiert wird oder nicht. Du brauchst also nicht künstlich eine Warteschleife einbauen. Das Problem liegt also an anderer Stelle. Wo kommt das Geocoder-Objekt her, auf das Du zugreifst?
Delphi-Quellcode:
with Script do
begin Geocoder.Geocode(TGeocoderRequest.Create(s), //<- ??? [...] |
AW: Google Maps über COM (Component Object Model)
Hallo Thomas,
danke für die schnelle Antwort :-D
Delphi-Quellcode:
Viele Grüße
procedure TFormAdressen.InitMap(Sender: TObject);
var LatLng: TLatLng; MapOptions: TMapOptions; begin with TScript(Sender) do begin Geocoder := New(Google.Maps.Geocoder); //<----------- Hier LatLng := New(Google.Maps.LatLng(-34.397, 150.644)); MapOptions := TMapOptions.Create; with MapOptions do begin Zoom := 15; Center := LatLng; MapTypeID := Google.Maps.MapTypeID.Roadmap; end; Map := New(Google.Maps.Map(MapOptions)); end; end; Sebastian |
AW: Google Maps über COM (Component Object Model)
Gern geschehen!
Aha. Danke für den Quelltext. Allerdings kann ich nicht nachvollziehen, weshalb Du die Initialisierung der Karte auf mehrere Methoden verteilst - einmal OnCreate/OnShow und dann InitMap. Das geht spätestens dann schief, wenn der Browserinhalt (zum Beispiel mit F5) neu geladen wird. Dann wird nämlich nur die Methode InitMap aufgerufen und der ganze Teil in OnCreate/OnShow bleibt unberücksichtigt. Das nächste Problem besteht darin, daß die Methode OnShow durchaus auch mehrfach aufgerufen werden kann. Grundsätzlich kann ich nur wärmstens empfehlen, den gesamten Initialisierungsteil in der Methode InitMap unterzubringen - dafür ist sie gedacht. Dann spielt es auch keine Rolle, ob das API synchron oder asynchron geladen wird. Für die Verwendung des synchronen Laden mittels LoadAPI besteht eigentlich nie eine zwingende Notwendigkeit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz