Delphi-PRAXiS
Seite 42 von 55   « Erste     32404142 434452     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Google Maps über COM (Component Object Model) (https://www.delphipraxis.net/157004-google-maps-ueber-com-component-object-model.html)

manfred_h 4. Jul 2013 13:59

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:
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
Delphi-Quellcode:
Geocoder.Geocode(TGeocoderRequest.Create(Address.Text),GeocoderCallback);
auf Antwort und mache erst dann weiter.:oops:

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;

Thom 5. Jul 2013 14:51

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:
if DM.gpsdata_validate() then [...]
innerhalb von
Delphi-Quellcode:
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.

manfred_h 5. Jul 2013 17:02

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

Thom 5. Jul 2013 17:09

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

viel Erfolg und ebenfalls ein schönes Wochenende!

Thomas

Thom 18. Aug 2013 16:18

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 hier). Diese wurde jetzt zur Stable-Version und in der neuen experimentellen Version 3.14 kann dieser Effekt nicht mehr deaktiviert werden.
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:
  if Script=nil then
    with TScript.Create(WebBrowser1) do
      LoadAPIAsync(InitMap,'','',3.13);
Wird nämlich keine spezielle Version angefordert, liefert Google automatisch das experimentelle API.

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).

Thom 4. Sep 2013 00:10

Version 3
 
Ich werde die diesjährige Community-Veranstaltung in Leipzig nutzen, um die Version 3 des Frameworks offiziell vorzustellen.
Einige Schwerpunkte:
  • Nutzungsbedingungen von Google für kostenlose und kommerzielle Anwendungen
  • Probleme bei der Einbindung von Google Maps in Delphi-Programme
  • Übersicht über vorhandene kostenlose und kommerzielle Komponenten
  • Einblick in die Techniken und Möglichkeiten der neuen Delphi-To-JavaScript-Bridge
  • Vorstellung des neuen Frameworks, Besonderheiten im Vergleich zu komponentenbasierenden Lösungen, Veränderungen und Erweiterungen, Tipps für die Umstellung von Version 2 auf Version 3
Am Community-Abend und in den Pausen am Tag der Hauptveranstaltung wird es sicher auch die eine oder andere Gelegenheit geben, um Fragen zu beantworten und über die Umsetzung von Projekten zu diskutieren.

DelphiFan2008 4. Sep 2013 21:45

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

Peter.Stadler 6. Sep 2013 05:21

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

Ich habe
LoadAPIAsync(InitMap,'','',3.13);

Aber dennoch bleiben die Schatten verschwunden!

mfg Peter

DelphiFan2008 14. Sep 2013 12:53

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:
StrToFloatDef
kommt es dann zum Fehler.

Delphi-Quellcode:
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;
Der Ersatz von
Delphi-Quellcode:
Result:=SysUtils.StrToFloat(S);
durch
Delphi-Quellcode:
Result:=SysUtils.StrToFloatDef(S,0.0);
vermeidet den Fehler.

Ist dies korrekt und ich frage mich warum der Fehler bei meinem alten Rechner nicht auftrat.

Gruß DelphiFan2008

DelphiFan2008 14. Sep 2013 13:05

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

das mit Thema
Delphi-Quellcode:
SysUtils.StrToFloat(S);
trat mit "altem" Demo auf

Gruß DelphiFan2008


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 Uhr.
Seite 42 von 55   « Erste     32404142 434452     Letzte »    

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