AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DelphiFan2008,
ich weiß nicht, ob's die irgendwo einzeln gibt. Sie sollte aber in den anderen Jedi-Bibliotheken enthalten sein. P.S.: Ich habe jetzt noch einmal alles getestet: Das Framework Version 1.1 läßt sich unter Delphi XE2 ungeändert sowohl in 32 als auch 64 Bit compilieren. Besser ist natürlich eine aktuelle jedi.inc. Notfalls tut es auch die von mir angepaßte Version im Anhang. Dabei handelt es sich aber um keine offizielle Version und sie erhebt auch keinen Anspruch auf Vollständigkeit. Ich habe nur die vom Framework verwendeten Compilerschalter aktualisiert. Die Demos sollten ebenfalls funktionieren. |
AW: Google Maps über COM (Component Object Model)
Hey Thom,
super cooles Projekt, was Du hier auf die Beine gestellt hast. Ich habe mir Dein Framework in Version 1.1 einmal angesehen und wollte jetzt etwas mit den Directions und Wegpunkten probieren. Allerdings wäre es super zu wissen, wie ich einem DirectionRequest weitere Wegpunkte hinzufügen kann! Das ist mir bisher nicht gelungen:
Delphi-Quellcode:
Vielen Dank und :thumb: für Deine Arbeit hier! Ganz großes Tennis ;-)
var
DirectionsRequest: TDirectionsRequest; WayPoint: TDirectionsWayPoint; begin ... WayPoint := TDirectionsWayPoint.Create; WayPoint.LocationAsString := 'Adresse'; DirectionsRequest.WayPoints.Add(WayPoint); ... |
AW: Google Maps über COM (Component Object Model)
Vielen Dank! :-D
Du mußt einfach einen weiteren Punkt erstellen und dem Array hinzufügen:
Delphi-Quellcode:
Ohne Google's Premier Lizenz ist die Anzahl der Wegpunkte allerdings beschränkt.
[...]
WayPoint:=TDirectionsWaypoint.Create; WayPoint.LocationAsString:='ErsterPunkt'; DirectionsRequest.WayPoints.Add(WayPoint); WayPoint:=TDirectionsWaypoint.Create; WayPoint.LocationAsString:='ZweiterPunkt'; DirectionsRequest.WayPoints.Add(WayPoint); WayPoint:=TDirectionsWaypoint.Create; WayPoint.LocationAsString:='UndNochEiner'; DirectionsRequest.WayPoints.Add(WayPoint); [...] Edit: Sorry: Das funktioniert noch nicht in Version 1.1. :cry: Wenn Du mir Deine Emailadresse per PM mitteilst, würde ich Dir Version 1.3 zusenden. Damit klappt es. :thumb: |
AW: Google Maps über COM (Component Object Model)
Alles klar, es funktioniert. Vielen Dank. :-D
Jetzt würde mich aber noch interessieren, wie ich die Länge der ermittelten Route und der einzelnen Wege, falls Wegpunkte gesetzt sind, auslesen kann. In Deiner Beispiel-Anwendung "Directions" habe ich dazu nichts gefunden. Habe dort nur den Quellcode-Schnipsel der Callback-Funktion:
Delphi-Quellcode:
Außerdem würde mich interessieren, wie ich die Routenanweisungen auf Deutsch und ggf. noch anders formatiert erhalten kann. Gerne auch in dem Layout, welches bei Google Maps zur Darstellung der Routeninformationen genutzt wird - ist das überhaupt möglich? :?:
procedure TForm1.DirectionsCallback(Sender: TObject; Result: TDirectionsResult; Status: String);
var n, r, l, s: Integer; DirectionsRendererOptions: TDirectionsRendererOptions; procedure AddMsg(Msg: String); begin Memo1.Lines.Add(Msg); end; begin with Script do begin Memo1.Lines.Clear; if Status=Google.Maps.DirectionsStatus.Ok then begin for r:=0 to Result.Routes.Count-1 do for l:=0 to Result.Routes[r].Legs.Count-1 do for s:=0 to Result.Routes[r].Legs[l].Steps.Count-1 do AddMsg(Result.Routes[r].Legs[l].Steps[s].Instructions); //Richtungshinweise von Start zum Ziel for n:=0 to Result.Routes[0].Warnings.Count-1 do AddMsg(Result.Routes[0].Warnings[n]); //Warnhinweise zur berechneten Route AddMsg(Result.Routes[0].Copyrights); //Copyright-Informationen zur berechneten Route DirectionsRendererOptions:=TDirectionsRendererOptions.Create; //Darstellung der berechneten Route vorbereiten DirectionsRendererOptions.Directions:=Result; //Ergebnisse übergeben DirectionsRendererOptions.Map:=Maps[0]; //Karte übergeben Google.Maps.DirectionsRenderer(DirectionsRendererOptions); //berechnete Route darstellen end else Memo1.Lines.Add(Status); end; end; Über einen Tipp würde ich mich freuen. Gruß NetSonic |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 3)
Schön, daß es funktioniert! :-D
Die Gesamtlänge eine Strecke bzw. Gesamtreisedauer kann zum Beispiel so ermittelt werden:
Delphi-Quellcode:
Google Maps arbeitet mit den Spracheinstellungen des PC's. Auf meinem sendet der IE also ein 'de' - dementsprechend werden alle Menüs und Ausgaben auf Deutsch angezeigt. Es ist aber auch möglich, eine bestimmte Sprache zu erzwingen. Das geht beim Laden des API's. In der kommenden Version des Frameworks kann sie als Parameter angegeben werden:
TotalDistance:=0;
TotalDuration:=0; with Result.Routes[0] do //<- erste Route for Leg:=0 to Legs.Count-1 do //<- alle Abschnitte durchgehen with Legs[Leg] do begin Inc(TotalDistance,Distance.Value); //<- Länge des Abschnitts Inc(TotalDuration,Duration.Value); //<- Reisedauer für diesen Abschnitt end;
Delphi-Quellcode:
In den älteren Versionen (1.1 - 1.3) muß dafür in der Unit gmAPI die Funktion HTMLPage angepaßt werden:procedure TScript.LoadAPIAsync(InitMapProc: TNotifyEvent; UseSensor: Boolean; Version: String; Language: String; //<- 'de' Libraries: TGoogleLibraries);
Delphi-Quellcode:
So sieht zum Beispiel die Routenplanung mit 'ru' aus:
[...]
Result:=Result+ ' <script type="text/javascript" src="http://maps.google.com/maps/api/js?&sensor='; if UseSensor then Result:=Result+ 'true' else Result:=Result+ 'false'; //zusätzlich: Result:=Result+'&language=de'; [...] Anhang 35161 Anhang 35162 Anhang 35164 Allerdings funktioniert Unicode nur mit den entsprechenden Compilern und erst ab Version 2.0 des Frameworks. Die Routeninformationen werden mit HTML-Tags (zum Beispiel <b></b>) geliefert. Die müßten dann selbst oder durch eine geeignete Komponente geparst und dargestellt werden. |
AW: Google Maps über COM (Component Object Model)
Danke für die ausführliche Info. Ich werde mir das einmal ansehen. Die Ergebnisse der Routenbeschreibung zeige ich mir bereits in einer TWebBrowser-Komponente formatiert an. Ich dachte nur, es gebe ggf. auch über die API und Deine Schnittstelle Layout-Möglichkeiten. :wink:
Wann wirst Du denn die neue Version Deines Frameworks veröffentlichen? Gibt es da ein konkretes Ziel? |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 1)
Nein, leider nicht: Momentan habe ich noch keine spezielle Komponente für die Ausgabe. Aber das wäre eine gute Idee für die Zukunft.
Ich habe mir nämlich überlegt, den Quelltext für etwas umfangreichere Demos und kleine "Helferlein" (wie spezielle Ein- und Ausgabekomponenten) als Dankeschön exklusiv an fleißige Tester und Spender zu vergeben. 8-) Ich babe zur Anzeige einmal TRichView mit einem HTML-Importer verwendet: Anhang 35166 Die Handhabung ist einfach: Alle Ausgaben werden in einer lokalen Stringliste zwischengespeichert und zum Schluß angezeigt:
Delphi-Quellcode:
Man könnte natürlich noch zusätzlich die Entfernung und die Fahrzeit integrieren.
[...]
RichView.Clear; HtmlImporter.LoadHtml(UTF8Encode(Messages.Text)); RichView.Format; [...] Wann die neuen Version fertig ist? :gruebel: Gute Frage... :lol: Die Integration der Google-Bibliotheken, dazugehörige Dokumentation, Demos und Tests haben mich jetzt drei Wochen (3*7*12 also rund 250 Stunden) gekostet. Ich wollte ganz gern noch die Distanz-Matrix und StreetView integrieren. Die XML-Dokumentation wird auf jeden Fall nicht komplett fertig - die wird nach und nach kommen. Ich bin erst einmal froh, daß sich die aktuellen Versionen auch mit XE2 vertragen - und das sogar ohne Änderung. Vielen Dank dabei an DelphiFan2008, der mit XE2 Starter alles - einschließlich der Demos - getestet und nur einige wenige Probleme entdeckt hat. Fazit: Ich beeile mich... :angel: |
AW: Google Maps über COM (Component Object Model)
So - es wird langsam Zeit für die neue Version. Ich hoffe, daß ich das Framework in etwa ein bis zwei Wochen für einen Beta-Test fertig habe. :coder:
Da sich intern einiges getan hat und viele neue Funktionen hinzugekommen sind, wird es nicht - wie angekündigt - die Version 1.4 sondern 2.0. So wurde ein interner Callback-Manager integriert, der es ermöglicht, bei asynchronen Aufrufen des API's neben herkömmlichen Objekt-Methoden auch anonyme Methoden als Callback-Funktion einzusetzen. Damit sind dann auch solche JavaScript-ähnlichen Konstruktionen wie in der Distanz-Matrix-Demo möglich:
Code:
geocoder.geocode({'address': location}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) { bounds.extend(results[0].geometry.location); map.fitBounds(bounds); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location, icon: icon }); } else { alert("Geocode was not successful for the following reason: " + status); } });
Delphi-Quellcode:
Bei den Objektlisten des TScript-Objektes wurden Iteratoren hinzugefügt, die den for-in Syntax unterstützen:
Geocoder.Geocode(TJScriptObject.Create(['address: '+Location]),
procedure(Sender: TObject; Results: TGeocoderResultArray; Status: String) var Opts: TMarkerOptions; begin with Script do begin if Status=Google.Maps.GeocoderStatus.OK then begin Bounds.Extend(Results[0].Geometry.Location); Maps[0].FitBounds(Bounds); Opts:=TMarkerOptions.Create; with Opts do begin Map:=Maps[0]; Position:=Results[0].Geometry.Location; Icon:=MarkerIcon; Title:=Location; end; New(Google.Maps.Marker(Opts)); end else ShowMessage('Geocode was not successful for the following reason: '+Status); end; end);
Delphi-Quellcode:
Zusätzlich wurden alle Units von RTTI-Rückständen befreit und damit ein fertiges Programm um reichlich 300 kByte (Beispiel für Delphi XE) verkleinert, obwohl das Framework selbst beachtlich an Umfang zugelegt hat.
for Marker in Script.Markers do
Marker.Map:=nil; Desweiteren sind Spenden herzlich willkommen. :hello: PayPal |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Hey Markus,
here is a little demo with the framework version 2. Is this what you mean with multiple destinations? Anhang 35241 Diese Demo zeigt übrigens auch die Behandlung der Refresh-Taste F5. |
AW: Google Maps über COM (Component Object Model)
Zitat:
|
AW: Google Maps über COM (Component Object Model)
|
AW: Google Maps über COM (Component Object Model)
Zitat:
Regards and hope to see your framework soon |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Thom,
i will look at the demo. Much appreciated. I am still trying to do proof of concept. Demo 5 is causing me issues. If I do each address one at a time, no issue. if I try to do all of them I get failures. I am attaching my version on unit1 from Demos\5 - Async Callbacks. Markus Can we use email? mrissmann@driftingsands.com or mrissmann@yahoo.com. Zitat:
|
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Hey Markus,
I hope that the mail has arrived. Für alle anderen die Erklärung des Problems: Google limitiert die Anzahl der Geocoding-Anfrage. Nach etwas 13 bis 15 Abfragen senden die Server die Meldung
Code:
Anhang 35296
OVER_QUERY_LIMIT
und es wird für die Callback-Funktion kein Results-Objekt erzeugt. Dummerweise wird in der Unit gmGeocoder in der Methode TGeocoder.Callback dieser Umstand nicht getestet und es kommt im Debug-Modus zu einer Fehlermeldung (keine Exception, da diese unterdrückt werden, weil bei COM keine Exceptions nach außen dringen dürfen). Das heißt: Im Fehlerfall wird das eigene Programm gar nicht darüber informiert. Ganz ungeduldige können das Problem selbst beheben, indem sie die Methode TGeocoder.Callback ändern:
Delphi-Quellcode:
Alle anderen warten einfach auf die neue Version des Frameworks.
procedure TGeocoder.Callback;
begin if assigned(FCallback) then begin try if not VarIsNull(FCallbackFunction.Arguments[0]) then //<- to prevent exception (insert unit Variants in uses list) begin if assigned(FGeocoderResults) then FGeocoderResults.Disp:=FCallbackFunction.Arguments[0] else FGeocoderResults:=TGeocoderResults.Create(Script,FCallbackFunction.Arguments[0]); FCallback(self,FGeocoderResults,FCallbackFunction.Arguments[1]); end else begin FCallback(self,nil,FCallbackFunction.Arguments[1]); end; except {$IFDEF DEBUG} ShowMessage(Exception(ExceptObject).Message); {$ENDIF} end; end; end; Um viele Geocoding-Anfragen ohne Fehlermeldung durchführen zu können hat es sich bewährt, zwischen den einzelnen Abfragen etwas eine Sekunde Zeit zu lassen: Anhang 35297 Eine andere Strategie wäre:
|
AW: Google Maps über COM (Component Object Model)
Hi,
Could you please publish that demo where route internal "over" point can be added? I don't know how to do it. Adding waypoints not working. Thanks, András Zitat:
|
AW: Google Maps über COM (Component Object Model)
Hi András,
yes, you're right. Adding waypoints work in version 1.1 not really (see this post). Give me your email address via PM and I'll send you the current version 1.3. Thom |
AW: Google Maps über COM (Component Object Model)
|
AW: Google Maps über COM (Component Object Model)
|
AW: Google Maps über COM (Component Object Model)
Is on the way.
|
AW: Google Maps über COM (Component Object Model)
Many Thanks Thom. :)
hope to see Framework 2.0 soon Regards |
AW: Google Maps über COM (Component Object Model)
So do I. :lol:
|
AW: Google Maps über COM (Component Object Model)
Kann man auch an Hand einer PLZ einen Punkt in die Deutschlandkarte setzen? Aber das dann für viele PLZ?
|
AW: Google Maps über COM (Component Object Model)
Prinzipiell Ja.
Mit Geocoding können durch
Delphi-Quellcode:
die Koordinaten eines Punktes innerhalb des gewünschten PLZ-Bereiches ermittelt werden. Dieser Punkt liegt dann aber logischerweise irgendwo innerhalb dieses Bereiches.
GeocoderRequest:=TGeocoderRequest.Create; //GeocoderRequest-Objekt anlegen
GeocoderRequest.Address:='Deutschland,01234'; //zu kodierende PLZ Geocoder:=Google.Maps.Geocoder; //-> neu anlegen, falls erforderlich Geocoder.Geocode(GeocoderRequest,GeocoderCallback); //Kodierung vom Server anfordern Sollen mehrere Postleitzahlen untersucht werden, muß die Abfrage wiederholt werden. |
AW: Google Maps über COM (Component Object Model)
Dann werde ich deine Funktionen mal testen.
Danke für die Info. Matthias |
AW: Google Maps über COM (Component Object Model)
It's done. 8-)
|
AW: Google Maps über COM (Component Object Model)
Hi Thom,
ich habe mir die v2.0 mal kurz angeschaut. Beim ersten Demo bin ich direkt gestolpert, konnte das Problem aber schnell finden ;). Ich nutze D7, welches du ja noch nicht testen konntest. In der BrowserTools.pas (Zeile 403) habe ich folgendes geändert:
Delphi-Quellcode:
Gruß
//{$IFNDEF DELPHI6_UP}
{$IFNDEF DELPHI8_UP} const INTERNET_CONNECTION_OFFLINE = 32; INTERNET_CONNECTION_CONFIGURED = 64; {$ENDIF} angos |
AW: Google Maps über COM (Component Object Model)
Vielen Dank angos! :thumb:
Ich habe Deinen Beitrag oben verlinkt. |
AW: Google Maps über COM (Component Object Model)
Habe gerade dies im iX Newsticker gelesen:
iX > News > 2011 > KW 43 > Schluss mit gratis: Google verlangt Geld für Kartennutzung Schluss mit gratis: Google verlangt Geld für Kartennutzung. Könnte für den einen oder anderen von Interesse sein. Shalom Manfred |
AW: Google Maps über COM (Component Object Model)
Danke Manfred für den Hinweis!
Nimm solche Dinge aber nicht zu ernst: Das ist nur eine billige Schlagzeile auf Boulevardblatt-Niveau! :wall: Heise hatte ich bisher als relativ seriös in Erinnerung - mit diese Überschrift erreichen sie aber die geistige Ebene einer Zeitung, die eher mit Bildern hervorsticht, als mit substanziellen Nachrichten. Wahr ist: Die Nutzung der meisten Dienste war schon seit jeher limitiert - selbst mit der Premier License existieren mengenmäßige Grenzen. Daß eine Begrenzung auch beim Abruf von Karten eingeführt wird, ist schon seit Monaten (April 2011) bekannt. Selbst die zitierte Heise Seite räumt ein: Zitat:
Selbst bei der Entwicklung des Frameworks erreichte ich nicht im Entferntesten derartige Quoten - und da habe ich alle paar Minuten compiliert und das API neu geladen. Das Problem bei webbasierenden Karten ist der Referer-Wert, der den Rückschluß auf die zuständige Website zuläßt. Damit kann die Zählung Site-basierend erfolgen. Bei diesem Framework wird die HTML-Seite "synthetisch" erzeugt und damit ist eine Zählung nur über die abrufende IP-Adresse möglich. Zitat:
Zitat:
|
AW: Google Maps über COM (Component Object Model)
Super Sache !
Hätte ich dein Werk einen Monat früher gefunden, hätte ich mir einiges an Arbeit erspart ;-( Hab gleich ein wenig gespendet, so eine Leistung gehört honoriert. Versuche gerade mein (Mach)Werk zu ersezten, und stoße da an meine Grenzen... Hab ein paar Funktionen in eine eigene Komponete X ausgelagert um meine alter Version 1:1 zu ersetzen. Diese Komponente behinhaltet einen TWebBrowser ,eine DBGrid udn noch ein paar andere Komponenten. In der Applikation rufe ich im Onshow
Delphi-Quellcode:
so definiert:
newMap:=TX.create(Frame1);
newMap.parent:=Frame1; newMap.show(); dann
Delphi-Quellcode:
so definiert:
newMap.initMap();
und fliege mit einer Execption da script=nil ist !:roll: Wenn ich "with TScript(Sender) do" wie in einigen Beispielen verwende, wer/was ist dann der sender?? Und kann mir wer die Sysntax in TX.show gerklären ?:oops: Sorry ich steh ein wenig auf dem Schlauch, meine Delphi5(!) Wissen ist ein wenig eingerostet... |
AW: Google Maps über COM (Component Object Model)
Hallo Stefan,
vielen Dank für das Lob und die Spende! Ich werde so schnell wie möglich die Bonus-Units an Dich abschicken.
Delphi-Quellcode:
ist eine Funktion aus der Unit gmAPI, die das aktuelle Script-Objekt liefert (falls der Aufruf ohne Parameter erfolgt - das reicht aus, wenn nur eine TWebBrowser-Komponente verwendet wird) oder das zu einem bestimmten IE-ActiveX gehörende Script-Objekt.
function Script(Browser: TOleControl = nil): TScript;
//... Dadurch braucht dieses Objekt nicht lokal gespeichert zu werden. Wird jetzt
Delphi-Quellcode:
verwendet, darf keine lokale Variable mit diesem Namen existieren oder es muß der Unitname angegeben werden:
if Script=nil then [...];
if assigned(Script(WebBrowser1)) then [...]; //oder Script.xxx;
Delphi-Quellcode:
if gmAPI.Script=nil then [...];
if assigned(gmAPI.Script(WebBrowser1)) then [...]; //oder gmAPI.Script.xxx; Die Methode InitMap (kann auch beliebig anders heißen) ist - zumindest bis Delphi 2007 - ein reguläres TNotifyEvent mit folgendem Aufbau:
Delphi-Quellcode:
Die Funktionsweise kann man sich so vorstellen:
procedure TForm1.InitMap(Sender: TObject);
begin with TScript(Sender) do begin Google.Maps.xxx; //-> Zugriff auf das Script-Objekt end; [...] TScript(Sender).Google.Maps.xxx; //-> Zugriff ohne with-Statement end; Um Zugriff zur JavaScript-Engine des Browsers zu erhalten, muß ein TScript-Objekt angelegt werden. Das geschieht unter Angabe der Browser-Komponente:
Delphi-Quellcode:
Über dieses Script-Objekt erfolgen dann alle weiteren Zugriffe auf das Google Maps API. Das muß aber erst noch geladen werden:
TScript.Create(WebBrowser1);
//... Wird eine der Funktionen LoadAPI(InitMap) oder LoadAPIAsync(InitMap) des Script-Objektes aufgerufen, lädt das Framework das JavaScript-API unter Verwendung der gewünschten Parameter von den Google-Servern. Wurde das API von der Browser-Komponente vollständig geladen, wird vom Framework die angegebene Methode InitMap aufgerufen und als Parameter Sender das Script-Objekt übergeben, damit die Karte erstellt werden kann. Das entspricht zum Beispiel dem Verhalten eines Buttons, wenn durch Doppelklick oder im Objekt-Inspektor eine OnClick-Methode angelegt wurde und der Button zu Laufzeit betätigt wird. |
AW: Google Maps über COM (Component Object Model)
hi,
(sorry in English) where do I find TMapOptions for Delphi? br sterna |
AW: Google Maps über COM (Component Object Model)
Hi sterna,
no problem. See Unit gmMap in folder GoogleMaps\Source\API. |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 3)
Die Version 2.1 des Frameworks steht ab sofort für registrierte Nutzer (Spender, Lizenz) bereit. Sie enthält alle Änderungen in den Versionen 3.6 und 3.7 des API's.
Demo (32 Bit): |
AW: Google Maps über COM (Component Object Model)
Verwende eine TEmbeddedWB in Verbindung mit dem GoogleMapsFramework und möchte die Druckfunktionalität des TEmbeddedWB verwenden.
Meine Map füllt aber den gesamten TEmbeddedWB aus und daher "schnappt" sich das Framework den Rechtsclick...:roll: Wie konfiguriert man das richtig bzw. hatt wer auc schon mal diese Problem ? Ideen/Vorschläge? |
AW: Google Maps über COM (Component Object Model)
Nö - das Framework unterdrückt keinerlei Klicks. Ganz im Gegenteil: Zu jedem Objekt, das Ereignisse unterstützt, werden unzählige Onxxx Handler bereitgestellt - so auch TMap.OnRightClick. Und diese Handler sind ab Delphi 2009 sogar mit anonymen Methoden nutzbar.
Zu den Ereignishandlern gibt es eine ganze Reihe von Demos - sowohl in der Version 1.x als auch in 2.x. |
AW: Google Maps über COM (Component Object Model)
... vielleicht falsch ausgedrückt.:oops:
Lad ich in den Browser(TEmbeddedWB) zb. "www.google.at" komme ich mit einem Rechtsklick in das standard Explorermenue, wo ich unter anderem auch ausdrucken kann. Wenn ich aber mit dem FrameWork eine Karte generiere, komm ich mit dem Rechtsklick in die Map.OnClick Methode :cyclops: Mir fehlt irgendwie eine Idee wie ich das umgehen kann... |
AW: Google Maps über COM (Component Object Model)
Das Browser-Kontextmenü wird von den Karten generell unterdrückt. Diesen Effekt kann man auch auf der Google Maps Seite überprüfen. Dort wird das Kontextmenü des IE's durch ein eigenes ersetzt.
Das Programm muß sich also selbst darum kümmern, die Karte auszudrucken. Dafür gibt es mehrere Möglichkeiten. Die einfachste - aber auch schlechteste - Methode ist folgender Aufruf:
Delphi-Quellcode:
Der IE versucht dann, die Karte formatfüllend (in der Regel A4) zu Papier zu bringen - das Ergebnis ist nicht zu gebrauchen.
var
pvaIn, pvaOut: OleVariant; begin [...] WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER, //mit Druckerdialog {OLECMDEXECOPT_DONTPROMPTUSER,} //ohne Druckerdialog pvaIn,pvaOut); [...] end; Besser ist es, einen Screenshot der Karte als Bitmap anzufertigen und diesen anschließend mit dem eigenen Programm auszudrucken. Druckerkomponenten gibt es reichlich - denkbar ist auch eine Report-Tool. Wie ein Screenshot angefertigt werden kann, zeigt die Demo 5 - Async Callbacks aus der Beispielsammlung zur Version 1.x des Frameworks. Siehe dazu auch den Beitrag zum Beispiel 5. |
AW: Google Maps über COM (Component Object Model)
Hi Thom.
Tell me please how the software can determine whether the marker in the middle of range or beyond. Thank you. |
AW: Google Maps über COM (Component Object Model)
Do you mean in the center of the displayed map? Or you just want to determine whether the marker is visible?
You can instead use the TLatLngBounds object:
Delphi-Quellcode:
if Map.Bounds.Contains(Marker.Position) then
begin //-> Marker is visible end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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