Delphi-PRAXiS
Seite 32 von 55   « Erste     22303132 333442     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)

DelphiFan2008 11. Nov 2012 12:08

AW: Google Maps über COM (Component Object Model)
 
Anmerkung, du kannst auch aus einer lokalen Datei laden, hierzu ein Beispiel
Delphi-Quellcode:
   
    MarkerImage  
    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] );
Gruß DelphiFan2008

Thom 11. Nov 2012 12:14

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

Zitat von DelphiFan2008 (Beitrag 1190678)
Jedoch funktioniert das Demo aufgrund des Fehlers bei
Delphi-Quellcode:
{$INCLUDE Maps4Delphi.cfg}
nicht. diese Datei gibt es bei mir nicht.

Hallo DelphiFan2008,

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:

Zitat von GPRSNerd (Beitrag 1190697)
[...] wie kannst du selbst erstellte Marker auf der Karte anzeigen? Ich hatte das auch mal versucht und ein wenig recherchiert, die Essenz war, dass die Marker eine Internet-URL haben müssen, lokale Dateien gehen nicht.

Hallo Stefan,

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

DelphiFan2008 11. Nov 2012 16:00

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:
  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 );
    ...
Komisch! Gruss DelphiFan2008

Ü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?

Thom 11. Nov 2012 17:20

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);
[...]

GPRSNerd 14. Nov 2012 20:04

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:

Zitat von DelphiFan2008 (Beitrag 1190698)
Hallo GPRSNerd,

mit folgendem Code habe ich die Marker direkt im Programm erzeugt
Delphi-Quellcode:
        PNG := TPNGImage.Create;

        CreateMarkerDistancePoint( PNG,<Parameter> );

        MarkerOptions := TMarkerOptions.Create;
        with MarkerOptions do
        begin
          IconImage:=New( Google.Maps.MarkerImage( Encode64(PNG),
                          New(Google.Maps.Size(PNG.Width,PNG.Height)),
                          New(Google.Maps.Point(0,0)),
                          New(Google.Maps.Point(PNG.Width/2,PNG.Height/2)) ));
          Position := Script.Google.Maps.LatLng( x,y );
        end;
        Marker := New( Google.Maps.Marker( MarkerOptions ));

        Marker.SetMap( Maps[0] );

        PNG.Free;
Gruss DelphiFan2008


Thom 14. Nov 2012 20:14

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

Sebastian78 15. Nov 2012 20:24

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:
 
    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;
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.

Freu mich auf Deine Antwort.

Viele Grüße

Sebastian

Thom 15. Nov 2012 21:01

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), //<- ???
    [...]

Sebastian78 15. Nov 2012 21:16

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

danke für die schnelle Antwort :-D

Delphi-Quellcode:
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;
Viele Grüße

Sebastian

Thom 15. Nov 2012 21:40

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.
Seite 32 von 55   « Erste     22303132 333442     Letzte »    

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