![]() |
AW: Google Maps über COM (Component Object Model)
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
Delphi-Quellcode:
dies schon aufgerufen wurde.
if DM.gpsdata_validate(var_lelat, var_lelng)=true then
Was ich nicht weiss ist wie warte ich bei diesem Aufruf
Delphi-Quellcode:
auf Antwort und mache erst dann weiter.:oops:
Geocoder.Geocode(TGeocoderRequest.Create(Address.Text),GeocoderCallback);
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; |
AW: Google Maps über COM (Component Object Model)
Hallo Manfred,
vielen Dank für das Lob! :-D 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
Delphi-Quellcode:
innerhalb von
if DM.gpsdata_validate() then [...]
Delphi-Quellcode:
stattfinden sollte.
Tfrm_map.GeocoderCallback
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. |
AW: Google Maps über COM (Component Object Model)
Hallo Thom
Danke für den Tipp. Werde dies versuchen umzusetzten. Shalom und noch ein schönes Wochenende Manfred |
AW: Google Maps über COM (Component Object Model)
Hallo Manfred,
viel Erfolg und ebenfalls ein schönes Wochenende! Thomas |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Vielleicht ist es einigen aufgefallen: Seit einigen Tagen (15. August) sehen die Karten von Google etwas anders aus, als gewohnt:
Anhang 39754 Anhang 39755 Das liegt daran, daß nach den Managern von Microsoft und Apple offenbar auch die von Google auf dem Trip "3D-Effekte sind out - es lebe die Flachheit" sind und alles platt machen. In der bis Mitte August als experimentell deklarierten API Version 3.13 konnte auf Wunsch der "fresh new look" aktiviert werden (siehe ![]() Wer also auf schattenlose Marker und Hinweisfenster steht, braucht nicht zu ändern. Möchte man sich allerdings den alten Stil noch etwas erhalten, muß beim Laden des APIs die Versionsnummer 3.13 explizit angegeben werden:
Delphi-Quellcode:
Wird nämlich keine spezielle Version angefordert, liefert Google automatisch das experimentelle API.
if Script=nil then
with TScript.Create(WebBrowser1) do LoadAPIAsync(InitMap,'','',3.13); Anders sieht es bei kommerziellen Nutzern aus, die eine Premier-Lizenz von Google haben: Bei denen wird nämlich immer die Stable-Version geladen. Wollen die also den "fresh new look", müssen sie ihn explizit aktivieren (siehe oben). |
Version 3
Ich werde die diesjährige Community-Veranstaltung in Leipzig nutzen, um die Version 3 des Frameworks offiziell vorzustellen.
Einige Schwerpunkte:
|
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
danke für das super Engagement. Ich freue mich schon auf die V3 um meine Applikationen in der "schlechteren" Jahreszeit ... dunkler und regnerisch :roll: anzupassen. Momentan steht Outdoor, Sport, Familie im Vordergrund - aber der Winter kommt. Mit einer aktualisierten PC-Entwicklungsumgebung auf Basis Haswell und SSD macht das ganze auch noch mehr Spaß. Weiter so! Gruß DelphiFan2008 |
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
Ich habe LoadAPIAsync(InitMap,'','',3.13); Aber dennoch bleiben die Schatten verschwunden! mfg Peter |
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
habe das Framwork auf einem neuen Rechner eingerichtet. Nach Start des Demos kam die Fehlermeldung ... kein gültiger Gleitkommawert ... bei Aufruf der Funktion HTMLPage. Die wird im Demo mit dem Parameter APIVersion = '' bzw. leerem String aufgerufen. In der Funktion
Delphi-Quellcode:
kommt es dann zum Fehler.
StrToFloatDef
Delphi-Quellcode:
Der Ersatz von
function StrToFloatDef(const S: String; Default: Extended; DecimalSeparator: Char): Extended;
var OldDecimalSeparator: Char; begin OldDecimalSeparator:={$IFDEF DELPHIXE_UP}FormatSettings.{$ELSE}SysUtils.{$ENDIF}DecimalSeparator; try {$IFDEF DELPHIXE_UP}FormatSettings.{$ELSE}SysUtils.{$ENDIF}DecimalSeparator:=DecimalSeparator; try Result:=SysUtils.StrToFloat(S); except Result:=Default; end; finally {$IFDEF DELPHIXE_UP}FormatSettings.{$ELSE}SysUtils.{$ENDIF}DecimalSeparator:=OldDecimalSeparator; end; end;
Delphi-Quellcode:
durch
Result:=SysUtils.StrToFloat(S);
Delphi-Quellcode:
vermeidet den Fehler.
Result:=SysUtils.StrToFloatDef(S,0.0);
Ist dies korrekt und ich frage mich warum der Fehler bei meinem alten Rechner nicht auftrat. Gruß DelphiFan2008 |
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
das mit Thema
Delphi-Quellcode:
trat mit "altem" Demo auf
SysUtils.StrToFloat(S);
Gruß DelphiFan2008 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz