Delphi-PRAXiS
Seite 11 von 14   « Erste     91011 1213     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)

mischo22 19. Jun 2013 08:23

AW: Google Maps über COM (Component Object Model)
 
Ich habe mal eine kurze Frage:
Wie kann ich mehrere Maps in einer Anwendung verwenden.

Im Moment habe ich das so probiert:

Code:
type
  TForm1 = class(TForm)
    ...
    WebBrowser1: TWebBrowser;
    WebBrowser2: TWebBrowser;
    ...
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    MapScript1: TScript;
    MapScript2: TScript;
    procedure InitMap(Sender: TObject);
end;


procedure TForm1.FormShow(Sender: TObject);
begin
    // Einmalig die Maps initialisieren
    if MapScript1=nil then
        TScript.Create(WebBrowser1).LoadAPIAsync(InitMap);

    if MapScript2=nil then
        TScript.Create(WebBrowser2).LoadAPIAsync(InitMap);
end;



procedure TForm1.InitMap(Sender: TObject);
var
   MapOptions: TMapOptions;
   MarkerOptions: TMarkerOptions;
begin
    with TScript(Sender) do
    begin
        MapOptions:=TMapOptions.Create;
        with MapOptions do
        begin
            DisableDefaultUI:=true;        //alle Kontrollelemente ausschalten
            DisableDoubleClickZoom:=true;  //kein Zoom per Doppelklick
            Draggable:=false;              //Karte nicht verschiebbar
            ScrollWheel:=false;            //kein Zoom über Mausrad
            KeyboardShortcuts:=false;      //keine Tastenkürzel
            MapTypeID:=Google.Maps.MapTypeId.Roadmap; //Kartentyp (roadmap oder satellite)

            Zoom:=1;                       //Zoom
            Center:=Google.Maps.LatLng(0,0); //Kartenzentrum
        end;
        New(Google.Maps.Map(MapOptions));

        // Marker Zeichnen
        MarkerOptions:=TMarkerOptions.Create;
        MarkerOptions.Map:=Google.Maps.Map(MapOptions);
        MarkerOptions.Position:=Google.Maps.LatLng(53,8);
        MarkerOptions.Title:='Letzte Position';
        New(Google.Maps.Marker(MarkerOptions));
    end;
end;

Wenn ich aber später die Parameter ändern möchte, schmiert das Programm mit einer Schutzverletzung ab:

Code:
MapScript1.Maps[0].Zoom:=17;
MapScript1.Maps[0].Center:=MapScript_T1.Google.Maps.LatLng(50,10); //Kartenzentrum
MapScript1.Maps[0].MapTypeID:=MapScript_T1.Google.Maps.MapTypeId.SATELLITE;
Was mache ich falsch?

Thom 19. Jun 2013 12:08

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

Du speicherst die Script-Objekte nicht in den Variablen:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if MapScript1=nil then
      TScript.Create(WebBrowser1).LoadAPIAsync(InitMap); //<- Script wird erstellt, aber nicht in MapScript1 gespeichert

  if MapScript2=nil then
    TScript.Create(WebBrowser2).LoadAPIAsync(InitMap); //<- selbe Problem
end;
Die Lösung sollte sein:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if MapScript1=nil then
  begin
    MapScript1:=TScript.Create(WebBrowser1);
    MapScript1.LoadAPIAsync(InitMap);
  end;
  if MapScript2=nil then
  begin
    MapScript2:=TScript.Create(WebBrowser2);
    MapScript2.LoadAPIAsync(InitMap);
  end;
end;
Allerdings kannst Du Dir auch das Speichern der Script-Objekte sparen - das erfolgt schon frameworkintern:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  // Einmalig die Maps initialisieren
  if Script(WebBrowser1)=nil then
    with TScript.Create(WebBrowser1) do
      LoadAPIAsync(InitMap);
  if Script(WebBrowser2)=nil then
    with TScript.Create(WebBrowser2) do
      LoadAPIAsync(InitMap);
end;
Um später auf das Objekt zugreifen zu können, reicht
Delphi-Quellcode:
  with Script(WebBrowser1) do
  begin
    Maps[0].Zoom:=17;
    Maps[0].Center:=New(Google.Maps.LatLng(50,10)); //<- New-Funktion verwenden
    Maps[0].MapTypeID:=Google.Maps.MapTypeId.SATELLITE;
  end;
Wer Angst vor dem angeblich bösen "with" hat, macht es so:
Delphi-Quellcode:
  Script(WebBrowser1).Maps[0].Zoom:=17;
  Script(WebBrowser1).Maps[0].Center:=New(Script(WebBrowser1).Google.Maps.LatLng(50,10)); //<- New-Funktion verwenden
  Script(WebBrowser1).Maps[0].MapTypeID:=Script(WebBrowser1).Google.Maps.MapTypeId.SATELLITE;
Allerdings mußt Du bei der Erstellung von Hilfsobjekten momentan noch beachten, daß dabei ebenfalls das Script-Objekt als Parameter angegeben wird:
Delphi-Quellcode:
procedure TForm1.InitMap(Sender: TObject);
var
  Map: TMap;
  MapOptions: TMapOptions;
  MarkerOptions: TMarkerOptions;
begin
  with Sender as TScript do //<- hier eventuell schon einmal den harten Cast für Version 3 vermeiden (das geht nicht gut mit Interfaces)
  begin
    MapOptions:=TMapOptions.Create(Sender as TScript); //<- hier das Script-Objekt als Parameter angeben
    with MapOptions do
    begin
      DisableDefaultUI:=true;      
      DisableDoubleClickZoom:=true;
      Draggable:=false;            
      ScrollWheel:=false;          
      KeyboardShortcuts:=false;    
      MapTypeID:=Google.Maps.MapTypeId.Roadmap;
      Zoom:=1;                      
      Center:=New(Google.Maps.LatLng(0,0)); //<- New-Funktion verwenden
    end;
    Map:=New(Google.Maps.Map(MapOptions)); //<- Karte für den Marker merken

    // Marker Zeichnen
    MarkerOptions:=TMarkerOptions.Create(Sender as TScript); //<- hier ebenfalls das Script-Objekt angeben
    MarkerOptions.Map:=Map; //<- hier die Variable Map verwenden - sonst wird noch eine weitere Karte angelegt
    MarkerOptions.Position:=New(Google.Maps.LatLng(53,8)); //<- New-Funktion verwenden
    MarkerOptions.Title:='Letzte Position';
    New(Google.Maps.Marker(MarkerOptions));
  end;
end;
In der Version 3 wird es für diese Hilfsobjekte ebenfalls eine passende New-Funktion geben, so daß dann die Sache noch etwas einfacher wird:
Delphi-Quellcode:
  with Sender as IScript do
  begin
    MapOptions:=New(Google.Maps.MapOptions);
    [...]
  end;

mischo22 19. Jun 2013 18:46

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

Ich habe nun den OnShow bereich entsprechend angepasst und meine eigenen Script-Variablen entfernt.

Dies sieht nun so aus:

Code:
procedure TForm1.FormShow(Sender: TObject);
begin
    // Einmalig die Maps initialisieren
    if Script(WebBrowser_T1)=nil then
         with TScript.Create(WebBrowser_T1) do
            LoadAPIAsync(InitMap);

    if Script(WebBrowser_T2)=nil then
         with TScript.Create(WebBrowser_T2) do
            LoadAPIAsync(InitMap);

    if Script(WebBrowser_T3)=nil then
         with TScript.Create(WebBrowser_T3) do
            LoadAPIAsync(InitMap);

    if Script(WebBrowser_T4)=nil then
         with TScript.Create(WebBrowser_T4) do
            LoadAPIAsync(InitMap);
end;
Leider kann ich mittels der Zeilen
Code:
// Map aktualisieren
            with Script(WebBrowser_T1) do
            begin
                Maps[0].Zoom:=17;
                ...
            end;
Nicht auf die Map nachträglich zugreifen. Es kommt beim Compilieren die Fehlermeldung: "Undeklarierter Bezeichner: Maps"

Thom 19. Jun 2013 19:02

AW: Google Maps über COM (Component Object Model)
 
Auf welche Funktion/Unit kommst Du, wenn Du mit Strg auf die Funktion Script klickst?

mischo22 19. Jun 2013 19:18

AW: Google Maps über COM (Component Object Model)
 
Ich komme auf die datei BrowserTools.pas

Code:
function Script(WebBrowser: TOleControl): IDispatch;

Thom 19. Jun 2013 19:24

AW: Google Maps über COM (Component Object Model)
 
Hatte ich schon vermutet. Ändere mal bitte die Reihenfolge der Units in der uses-Anweisung: gmAPI muß nach (!) BrowserTools kommen.

mischo22 19. Jun 2013 20:08

AW: Google Maps über COM (Component Object Model)
 
Ok, das war schon mal der Fehler.
Perfekt ist es aber noch immer nicht.
Map1 (Webbrowser_T1) scheint alle Befehle aus dem Init-Map korrekt zu verarbeiten.
Bei den Maps 2-4 werden die festgelegten Center-Koordinaten nicht korrekt angewendet.
Die Karten liegen nicht bei LatLng(0,0) sondern bei LatLng(-90,0).

Irgend eine Idee?

Thom 19. Jun 2013 20:24

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

Zitat von mischo22 (Beitrag 1219119)
Irgend eine Idee?

:gruebel::wiejetzt::glaskugel: Nö...

Lade mal bitte ein kompilierbares Projekt hoch, damit ich mir das Problem im Debugger anschauen kann.

mischo22 20. Jun 2013 16:49

AW: Google Maps über COM (Component Object Model)
 
Habs per Mail gesendet.

Thom 20. Jun 2013 18:23

AW: Google Maps über COM (Component Object Model)
 
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.

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

Thom 15. Sep 2013 15:14

AW: Google Maps über COM (Component Object Model)
 
Hallo DelphiFan, hallo Peter -

bitte entschuldigt die späte Antwort. Ich bin nämlich voll im Vorbereitungsstreß für die Delphi-Tage...

Vielen Dank für das Lob - da macht die Arbeit gleich wieder viel mehr Spaß! :-D
Meinetwegen können die schönen Tage auch noch eine Weile bleiben. Leider sagt der Wetterbericht für kommende Woche nur Regenwetter voraus. Allerdings soll's am Community-Tag in Leipzig wieder etwas freundlicher sein. :thumb:

SSD: Oh ja - das ist bestimmt nicht schlecht. Als ich vor einem halben Jahr die Qual der Wahl hatte, mich beim neuen Laptop zwischen einer (bezahlbaren) 256 GB SSD und einer 1 TB Festplatte entscheiden zu müssen, hatte ich die größere Festplatte gewählt und bisher nicht bereut: Die SSD wäre jetzt schon voll... :lol:

Das Problem mit dem StrToFloat() kommt daher, daß Steinalt-Delphi-Versionen noch kein StrToFloatDef() kannten und deshalb eine Exception generieren, falls der String nicht in eine Gleitkommazahl umgewandelt werden kann. Diese wird aber im Except-Block abgefangen. Deshalb siehst Du die Exception nur, wenn Du das Programm im Debugger laufen läßt. Du kannst aber in den Debuggereinstellungen festlegen, daß dieser Exceptiontyp ignoriert werden soll.

Damit bin ich bei einem generellen Problem: Anstatt moderne Delphi-Features - wie zum Beispiel Generics, anonyme Methoden und die erweiterte RTTI - zu nutzen, muß ich alles x mal neu schreiben, nur weil sich irgendein Typ geändert hat. Auch sind die vielen Kompilerfehler in älteren Versionen einfach nur nervig und ich investiere unzählige Stunden, um Strukturen für diese veralteten Delphiversionen verarbeitbar zu machen. Das ist unterm Strich ein überproportional hoher Aufwand.
Die Version 3.0 wird trotzdem noch (mit einigen Einschränkungen) ab Delphi 5 einsetzbar sein (ich habe diese Entscheidung schon mehr als ein mal bereut :roll:). Aber spätestens dann, wenn ARC auch bei der Entwicklung für Windows Einzug hält, wird es einen Schnitt geben.

Bezüglich der Schatten:
Ich hatte das gerade noch mal mit der Demo InfoWindowSimple probiert: Das Einfügen von ",'','',3.13" bei LoadAPIAsync funktioniert. Probiere das mal bitte mit dieser Demo und lies bei Deinem Programm die Versionsnummer des APIs aus.

Viele Grüße
Thomas

Thom 17. Sep 2013 13:02

AW: Google Maps über COM (Component Object Model)
 
Konfigurationsdatei für Delphi XE5 im ersten Beitrag hinzugefügt. Damit sollte das Framework auch mit der neuen Delphiversion funktionieren. :thumb:

Thom 18. Sep 2013 16:13

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe für die diesjährigen Delphi-Tage mal ein kleines Programm (nennt man heutzutage wohl "Äpp" :wink:) mit der Version 3 geschrieben. Enthalten sind die Veranstaltungsorte, ein Routenplaner sowie die Wettervorhersage und Stauinformationen. Alles nichts weltbewegendes - aber die erste "offizielle" Demo unter Verwendung der neuen Version. :lol:

Anhang 39880

Einige der verwendeten Neuerungen:
  • Vollbildmodus (F11)
  • Optischer Zoom (Strg+Mausrad, Strg+0)
  • Kontextmenus für einzelne Objekte (hier Karte und Marker)
  • Aufruf von Delphi-Code beim Klick auf HTML-Links

DelphiFan2008 25. Sep 2013 20:28

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

dein Demo: ein kleiner Schritt für den Ersteller/Author ein großer für die Google-Map-"COM/Delphi"-Community. Ich warte sehnsüchtig auf die V3 :lol:

Gruß DelphiFan2008

pustekuchen 26. Sep 2013 07:07

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo thom,

wenn man mit STRG(optischer Zoom) zu weit herrauszoomt kommt es zu sehr langen Ladezeiten bzw. teilweilse gefühltem stehenbleiben der App.

hathor 26. Sep 2013 08:26

AW: Google Maps über COM (Component Object Model)
 
Nur mal so kurz "in die Runde geworfen":
Kann es sein, dass irgendwo ein Speicher vollläuft?
Die Programme hängen alle, wenn mehrmals der Inhalt des Fensters wechselt durch zoomen oder verschieben.

Thom 26. Sep 2013 12:10

AW: Google Maps über COM (Component Object Model)
 
Hallo pustekuchen, hallo hathor,

vielen Dank für Euer Interesse und für's Testen!

Eine Karte besteht aus Bildern (PNG, JPG) im Format 256x256 Pixel. Zoomt man heraus (wie in Deinem Screenshot), hat man dann schnell ein Bild aus 75x44 Kacheln. Das wären dann (75x256)x(44x256)=19200x11265=216268800 Pixel - ein 216 Megapixel-Bild. Und das muß dann auch erst einmal durch die Leitung gequält und per JavaScript aufbereitet werden. Ich denke, das erklärt alles... :lol:

Der optische Zoom sollte also mit der entsprechenden Überlegung angewendet werden. Ich finde ihn eher beim Vergrößern sinnvoll, da dann auch die Steuerelemente vergrößert werden und von Menschen mit einer Sehschwäche besser erkannt und bedient werden können. Auch in Leitzentralen oder bei Präsentationen könnte eine vergrößerte Darstellung hilfreich sein.

Anwender des Frameworks können den optischen Zoom komplett deaktivieren oder über das Event OnBeforeOpticalZoom einschränken.


@DelphiFan,

vielen Dank!

DelphiFan2008 5. Okt 2013 11:47

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

ich möchte eine Anwendung mit deinem Framework erstellen, bei der GoogleMaps im Wesentlichen zur Visualisierung verwendet wird. Sprich nicht zwingend wegen notwendiger Internet-Anbindung erforderlich ist. D.h. das Programm soll auch ohne Internet funktionieren.

Die Abfrage nach Internet erfolgt mit folgendem Code.
Delphi-Quellcode:
function IsOnline:Boolean;
const WininetDLL = 'wininet.dll';
var  hWininetDLL: THandle;
      lpdwFlags : DWORD;
      dwReserved: DWORD;
      fn_InternetGetConnectedState: function( lpdwFlags:LPDWORD;dwReserved:DWORD ):BOOL; stdcall;
begin
  lpdwFlags := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;

  Result := False;
  dwReserved := 0;
  hWininetDLL := LoadLibrary( WininetDLL );
  if( hWininetDLL > 0 )then
  begin
    @fn_InternetGetConnectedState := GetProcAddress( hWininetDLL,'InternetGetConnectedState' );
    if Assigned( fn_InternetGetConnectedState )then
    begin
      Result := fn_InternetGetConnectedState( @lpdwFlags,dwReserved );
    end;
    FreeLibrary( hWininetDLL );
  end
  else
    raise Exception.Create('Unable to locate function InternetGetConnectedState in library ' + WininetDLL);
end;
Mit dem Ergebnis kann ich erkennen ob ich Online bin oder nicht. Nun kann ich vor jede GoogleMap Aktivität
Delphi-Quellcode:
IsOnline
bzw. das Ergbnis der einmaligen Abfrage
Delphi-Quellcode:
bOnline := IsOnline
setzten, erscheint jedoch nicht sehr elegant. Gibt es aus deiner Sicht eine einfache Möglichkeit?

Gruß DelphiFan2008

Thom 5. Okt 2013 12:15

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

brobier's mal mit
Delphi-Quellcode:
Script.Navigator.OnLine
.

Viele Grüße
Thomas

pretep 12. Okt 2013 12:38

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

bin absoluter newbie auf diesem Gebiet, habe mich heute erstmals mit dieser Theamtik beschäftigt.
Ich habe versucht, einige Demos zu kompilieren, bekomme aber immer Fehler:
z.B:
Code:
[dcc32 Fehler] gmOverlaysMarker.pas(21): E2003 Undeklarierter Bezeichner: 'TMap'
Benutze XE4 und habe die globalen Biblio/Suchpfade wie beschrieben gesetzt.
Was mache ich grundsätzlich falsch?:pale:

Peter


Ergänzung:

Ah, ok! Mir fehlen die Units im Verzeichnis /Api.
Kann man die eventuell irgendwie (wenigstens erst einmal) testweise erhalten?
PP

hathor 12. Okt 2013 14:48

AW: Google Maps über COM (Component Object Model)
 
Die sind hier enthalten: GoogleMaps_2.0_Source&Demos
-> 1.Thread
http://www.delphipraxis.net/attachme...urce-demos.zip

pretep 12. Okt 2013 15:52

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

sorry, da lieg ich wohl falsch. Die *.pas Dateien habe ich. Es werden aber keine *.dcu erzeugt.
Das scheint das Problem zu sein. Nur zwei dcu's (GMAdditionalConstants und GMAdditionalMessages) werden erzeugt!
Und dann, wie gesagt, die Fehlermeldung!

Grüße
P.


Nachtrag: das hat mir keine Ruhe gelassen! Folgendes führte schließlich zu einer Lösung:
Der Pfad in den globalen Optionen war sowohl als Bibliothek als auch als Suchpfad eingetragen. Ich habe den Pfad zur API zusätzlich
noch einmal in die Projektoptionen eingetragen, und siehe da, es funktionierte!

Phu!?
P.

Thom 14. Okt 2013 11:06

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

schön, daß es jetzt bei Dir funktioniert!
Ich hatte das nämlich gerade mit XE5 noch einmal getestet und konnte keine Probleme feststellen. Ich hätte empfohlen, die drei benötigten Verzeichnisse dem globalen Suchpfad hinzuzufügen. Alternativ könnte man auch die Config-Datei mit in einem der beiden anderen Verzeichnisse unterbringen, so daß man eine Angabe spart. Bei mir mache ich das momentan nicht global, sondern in den jeweiligen Projektoptionen, damit es beim Test mit verschiedenen Frameworkversionen möglichst keine "Mißverständnisse" seitens des Compilers gibt.

Falls es jemand ausdrücklich wünscht, könnte ich auch statt der Zip-Datei einen Installer bereitstellen, der dann die Suchpfade automatisch bei den jeweiligen Delphi-Versionen hinzufügt.

GPRSNerd 27. Okt 2013 16:52

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

wann gibt es denn jetzt die Version 3.0, die seit gefühlten Jahren angekündigt worden ist und seit der XE5-Präsi veröffentlicht worden sein sollte? :?
Nicht das ich als Unterstützer drängeln möchte, hätte ich aber schon ganz gerne...

Gruß,
Stefan

Peter.Stadler 28. Okt 2013 18:28

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

Würde mich auch interessieren!

mfg Peter

GPRSNerd 27. Nov 2013 13:19

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

*push*

kommt da noch was?

Gruß,
Stefan

DelphiFan2008 9. Dez 2013 21:52

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Thom,

ich glaube ich hatte mich schon mal zu folgendem Sachverhalt bei dir gemeldet. Bisher jedoch keine Lösung. Habe wieder ein wenig mit dem Demo "Directions Draggable" experimentiert und möchte die Funktion zur Festlegung einer Strecke und nachfolgend zur Wandlung in einen GPS-Track verwenden. Mir ist jedoch unklar, wie ich auf den "Druck" einer eingeführten Richtungsänderung reagieren kann. Sprich ich lege eine Strecke an, verschiebe dazwischen einige Punkte - manche falsch - dann löschen, aber wie. Google-Maps übernimmt ja die Verschiebung eines solchen Punktes - wie ich ihn jedoch z.B. löschen kann ist mir unklar. Auf der Homepage "Motoplaner" ist es mit einem Dialog und Button gelöst - ein Popup wäre auch in den meisten Fällen ausreichend. Kennst du eine einfache Lösung?

Gruß DelphiFan2008

P.S. Warte auch sehnsüchtig auf das Framework V3 :-D

JonnyR 12. Jan 2014 17:02

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

Please forgive me not asking this question in German, however, my German is very poor.

May I ask if you have a demo available to show how to use your framework to create a heatmap, like this ...

http://api.ning.com/files/7TmaLfpwq1...1d/heatmap.jpg

Thanks for you time and a really great component.
Jonny

Thom 14. Jan 2014 22:12

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Dear Jonny,

Thank you very much! No problem. If you understand my bad english... :lol:

A unit for the visualization library is planned in version 3.0 of the framework. But I'm doing a non-public version 2.2 and have this unit adapted in accordance to your question to the old engine. This version will contain four demos to use the visualization library (including one with the heatmap layer). If you are a commercial user or a donor, you will receive version 2.2 in the next few days.

Many greetings
Thomas

Delphi-Quellcode:
  if Script(WebBrowser1)=nil then
    with TScript.Create(WebBrowser1) do
      LoadAPIAsync(InitMap,[libVisualization]);
Delphi-Quellcode:
  TaxiData:=TLatLngMVCArray.Create;
  with TaxiData do
  begin
    Push(New(Google.Maps.LatLng(37.782551,-122.445368)));
    Push(New(Google.Maps.LatLng(37.782745,-122.444586)));
    Push(New(Google.Maps.LatLng(37.782842,-122.443688)));
    [...]
  end;
  HeatmapLayerOptions:=New(Google.Maps.Visualization.HeatmapLayerOptions);
  HeatmapLayerOptions.Data:=TaxiData;
  HeatmapLayer:=New(Google.Maps.Visualization.HeatmapLayer(HeatmapLayerOptions));
  HeatmapLayer.SetMap(Map);
Anhang 40537

DelphiFan2008 9. Feb 2014 15:32

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Thom,

melde mich nochmals wegen dem Punkt - Event erkennen, wenn man per Maus auf den "Richtungsänderungskreis/ViaWayPoints" klickt.

Den Zugriff auf die ViaWayPoints bekomme ich in über...
Delphi-Quellcode:
    MyRoute := DirectionsRenderer[0].Directions.Routes[0];
    // BEGIN ViaWayPoints
    // Zugriff auf die Zwischen-Punkte, "kreisrund" über Route-Drag
    for i := 0 to MyRoute.Legs.Count-1 do
    begin
      for j := 0 to MyRoute.Legs[i].ViaWayPoints.Count-1 do
      begin
        sLAT := Format( '%2.8f',[MyRoute.Legs[i].ViaWayPoints[j].LAT] );
        sLNG := Format( '%2.8f',[MyRoute.Legs[i].ViaWayPoints[j].LNG] );
        LBViaWayPoints.Items.Add( Format( '[Leg:%d|ViaW:%d][%s/%s]',[i,j,sLAT,sLNG] ));
      end;
    end;
    // END ViaWayPoints
aber ich finde keine Möglichkeit den Klick zu erkennen bzw. Event auszulösen ... evntl. mit Listener?!?

Kannst du mir weiterhelfen?

Gruß DelphiFan2008


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Seite 11 von 14   « Erste     91011 1213     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