AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Google Maps über COM (Component Object Model)
Thema durchsuchen
Ansicht
Themen-Optionen

Google Maps über COM (Component Object Model)

Ein Thema von Thom · begonnen am 23. Dez 2010 · letzter Beitrag vom 22. Mai 2022
Antwort Antwort
Thom

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

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

  Alt 19. Jun 2013, 20:24
Irgend eine Idee?
Nö...

Lade mal bitte ein kompilierbares Projekt hoch, damit ich mir das Problem im Debugger anschauen kann.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
mischo22

Registriert seit: 23. Mär 2006
9 Beiträge
 
#2

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

  Alt 20. Jun 2013, 16:49
Habs per Mail gesendet.
  Mit Zitat antworten Zitat
Thom

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

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

  Alt 20. Jun 2013, 18:23
Hallo Michael,

ist angekommen und auch schon angeschaut.

Das Problem liegt bei der VCL bzw. dem TWebBrowser: Solange dieser nicht sichtbar ist, hat er eine Größe von 0x0 (oder 1x1) Pixeln. Damit liegt das Kartenzentrum (in Deinem Fall (0,0)) in der linken oberen Ecke.
Mein Vorschlag wäre, nur die Karte zu laden, die am Anfang sichtbar ist und alle anderen erst dann, wenn die entsprechende Seite angeklickt wird:
Delphi-Quellcode:
procedure TForm1.PageControl1Change(Sender: TObject);
  procedure InitMap(WebBrowser: TWebBrowser);
  begin
    if Script(WebBrowser)=nil then
      with TScript.Create(WebBrowser) do
        LoadAPIAsync(Self.InitMap);
  end;
begin
  if PageControl1.ActivePage=TabSheet1 then InitMap(WebBrowser_T1);
  if PageControl1.ActivePage=TabSheet2 then InitMap(WebBrowser_T2); //bzw. Tracker2, da Du das umbenannt hattest
  if PageControl1.ActivePage=TabSheet3 then InitMap(WebBrowser_T3);
  if PageControl1.ActivePage=TabSheet4 then InitMap(WebBrowser_T4);
  if PageControl1.ActivePage=TabSheet5 then InitMap(WebBrowser_T5);
end;
Das würde auch die Startzeit des Programmes spürbar verkürzen, da jetzt nicht mehr alle Karten im OnShow-Ereignis geladen werden müssen.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (20. Jun 2013 um 22:28 Uhr)
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#4

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

  Alt 4. Jul 2013, 13:59
Hallo Thom

seit einiger Zeit setzt ich Deine super Komponente in einer freien Software ein.
Habe aber leider Probleme eine Geocode Funktion zu erstellen.

Das Problem ist das die Rückmeldung von Tfrm_map.GeocoderCallback erst kommt wenn
if DM.gpsdata_validate(var_lelat, var_lelng)=true then dies schon aufgerufen wurde.
Was ich nicht weiss ist wie warte ich bei diesem Aufruf
Geocoder.Geocode(TGeocoderRequest.Create(Address.Text),GeocoderCallback); auf Antwort und mache erst dann weiter.

Habe auch schon eine ganze weile im Forum nach einer Möglichkeit gesucht...

Bin Dankbar für Tipps oder wonach ich im Forum suchen könnte.

Shalom
Manfred

Delphi-Quellcode:
procedure Tfrm_test.btn_geocodeClick(Sender: TObject);
begin
  if POS_LAT.Field.Text = 'then
  begin
    frm_map.Address.Text:= CITY.Field.DisplayText +', '+ STR.Field.DisplayText;
    frm_map.btn_GeocodeClick(Sender);
  end
  else
  case MessageDlg('Would you like to update the GPS-Data?', mtConfirmation, [mbYes, mbNo], 0)
  of
    mrYes:
    begin
      frm_map.Address.Text:= CITY.Field.DisplayText +', '+ STR.Field.DisplayText;
      frm_map.btn_GeocodeClick(Sender);
    end;
    mrNo:
    begin
      abort;
    end;
  end;
  if DM.gpsdata_validate(var_lelat, var_lelng)=true then
  begin
    DM_hotel.hotel.Edit;
    POS_LAT.Field.Text := var_lelat;
    POS_LNG.Field.Text := var_lelng;
    DM_hotel.hotel.Post;
  end;
end;
Delphi-Quellcode:
procedure Tfrm_map.btn_GeocodeClick(Sender: TObject);
begin
  Geocoder.Geocode(TGeocoderRequest.Create(Address.Text),GeocoderCallback);
end;
Delphi-Quellcode:
procedure Tfrm_map.GeocoderCallback(Sender: TObject; Results: TGeocoderResultArray; Status: String);
var
  MarkerOptions: TMarkerOptions;
begin
  with Script do
  begin
    if Status=Google.Maps.GeocoderStatus.OK then
    begin
      Maps[0].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));
      var_lelat:= FloatToStr(Results[0].Geometry.Location.lat);
      var_lelng:= FloatToStr(Results[0].Geometry.Location.lng);
    // only for debug
      POS_LAT.Text := var_lelat;
      POS_LNG.Text := var_lelng;
    //
    end else ShowMessage('Geocode was not successful for the following reason: '+Status);
  end;
end;
  Mit Zitat antworten Zitat
Thom

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

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

  Alt 5. Jul 2013, 14:51
Hallo Manfred,

vielen Dank für das Lob!

Das Google Maps API arbeitet komplett asynchron. Alle Callbackmethoden werden also irgendwann - nämlich dann, wenn die Kommunikation mit den Servern von Google abgeschlossen wurde - aufgerufen. Deshalb sollten sämtliche Aufgaben, die auf derartigen Rückgabewerten basieren, in diesen Callbackmethoden abgearbeitet werden. In Deinem Fall bedeutet das, daß die Überprüfung der Werte mittels if DM.gpsdata_validate() then [...] innerhalb von Tfrm_map.GeocoderCallback stattfinden sollte.

Alternativ könnte man natürlich auch in den Callbackmethoden ein Flag setzen, das dann innerhalb einer Timermethode ausgewertet wird. Das wäre aber nicht besonders elegant und würde - wie alle Pollingverfahren - Rechenzeit verschwenden.

Ab Delphi 2009 lassen sich für derartige Callbackmethoden übrigens auch anonyme Methoden einsetzten, was den Code kompakter und - meiner Meinung nach - besser lesbar macht. In den Demos sind dazu etliche Beispiele enthalten.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#6

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

  Alt 5. Jul 2013, 17:02
Hallo Thom

Danke für den Tipp.
Werde dies versuchen umzusetzten.

Shalom und noch ein schönes Wochenende
Manfred
  Mit Zitat antworten Zitat
Thom

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

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

  Alt 5. Jul 2013, 17:09
Hallo Manfred,

viel Erfolg und ebenfalls ein schönes Wochenende!

Thomas
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
DELPHI | (google maps) This thread Refback 11. Nov 2011 09:07
Twebbrowser HTML tag to UniHTMLFrame1 - uniGUI Discussion Forums This thread Refback 4. Nov 2011 06:52
DoraDev1975: google maps This thread Refback 23. Sep 2011 08:18
delphi osm - Google Search Post #0 Refback 19. Sep 2011 09:02
DoraDev1975: ?ิ????? 2011 This thread Refback 11. Sep 2011 16:39
DoraDev1975 This thread Refback 30. Aug 2011 10:13
Untitled document This thread Refback 25. Jun 2011 19:57
Interact with Google Maps in a TWebBrowser from Delphi | Ramblings This thread Refback 26. Jan 2011 05:12
google maps mit delphi link - Google Search This thread Refback 24. Jan 2011 14:24
google maps mit delphi - Google Search This thread Refback 24. Jan 2011 14:20
Untitled document This thread Refback 19. Jan 2011 21:49

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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