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:
Was mache ich falsch?
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; |
AW: Google Maps über COM (Component Object Model)
Hallo mischo22,
Du speicherst die Script-Objekte nicht in den Variablen:
Delphi-Quellcode:
Die Lösung sollte sein:
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;
Delphi-Quellcode:
Allerdings kannst Du Dir auch das Speichern der Script-Objekte sparen - das erfolgt schon frameworkintern:
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;
Delphi-Quellcode:
Um später auf das Objekt zugreifen zu können, reicht
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;
Delphi-Quellcode:
Wer Angst vor dem angeblich bösen "with" hat, macht es so:
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;
Delphi-Quellcode:
Allerdings mußt Du bei der Erstellung von Hilfsobjekten momentan noch beachten, daß dabei ebenfalls das Script-Objekt als Parameter angegeben wird:
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;
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
with Sender as IScript do
begin MapOptions:=New(Google.Maps.MapOptions); [...] end; |
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:
Leider kann ich mittels der Zeilen
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;
Code:
Nicht auf die Map nachträglich zugreifen. Es kommt beim Compilieren die Fehlermeldung: "Undeklarierter Bezeichner: Maps"
// Map aktualisieren
with Script(WebBrowser_T1) do begin Maps[0].Zoom:=17; ... end; |
AW: Google Maps über COM (Component Object Model)
Auf welche Funktion/Unit kommst Du, wenn Du mit Strg auf die Funktion Script klickst?
|
AW: Google Maps über COM (Component Object Model)
Ich komme auf die datei BrowserTools.pas
Code:
function Script(WebBrowser: TOleControl): IDispatch;
|
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.
|
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? |
AW: Google Maps über COM (Component Object Model)
Zitat:
Lade mal bitte ein kompilierbares Projekt hoch, damit ich mir das Problem im Debugger anschauen kann. |
AW: Google Maps über COM (Component Object Model)
Habs per Mail gesendet.
|
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:
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.
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; |
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 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:
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 |
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 |
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:
|
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:
|
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 |
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. |
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. |
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! |
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:
Mit dem Ergebnis kann ich erkennen ob ich Online bin oder nicht. Nun kann ich vor jede GoogleMap Aktivität
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;
Delphi-Quellcode:
bzw. das Ergbnis der einmaligen Abfrage
IsOnline
Delphi-Quellcode:
setzten, erscheint jedoch nicht sehr elegant. Gibt es aus deiner Sicht eine einfache Möglichkeit?
bOnline := IsOnline
Gruß DelphiFan2008 |
AW: Google Maps über COM (Component Object Model)
Hallo DelphiFan,
brobier's mal mit
Delphi-Quellcode:
.
Script.Navigator.OnLine
Viele Grüße Thomas |
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:
Benutze XE4 und habe die globalen Biblio/Suchpfade wie beschrieben gesetzt.
[dcc32 Fehler] gmOverlaysMarker.pas(21): E2003 Undeklarierter Bezeichner: 'TMap'
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 |
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 |
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. |
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. |
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 |
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
Würde mich auch interessieren! mfg Peter |
AW: Google Maps über COM (Component Object Model)
Hallo Thomas,
*push* kommt da noch was? Gruß, Stefan |
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 |
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 |
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:
Anhang 40537
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); |
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:
aber ich finde keine Möglichkeit den Klick zu erkennen bzw. Event auszulösen ... evntl. mit Listener?!?
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 Kannst du mir weiterhelfen? Gruß DelphiFan2008 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 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