![]() |
AW: Google Maps über COM (Component Object Model)
Hi
Wollte es auch gerade ausprobieren, alles runtergeladen, suchpfade und co aber beim compilieren bringt er mir einen fehler
Code:
DCC Fehler BrowserTools.pas(266): E2250 Es gibt keine überladene Version von 'Encode64', die man mit diesen Argumenten aufrufen kann
Delphi-Quellcode:
function Encode64(Data: TStream; MediaType: String): String;
var Stream: TStringStream; begin Result:=''; if not assigned(Data) then Exit; Stream:=TStringStream.Create('data:'+MediaType+';base64,'); try Stream.Seek(0,soFromEnd); Encode64(Data,Stream); <<< Hier Stream.Seek(0,soFromBeginning); Result:=Stream.DataString; finally Stream.Free; end; end; |
AW: Google Maps über COM (Component Object Model)
Doch:
Diese Funktion mit zwei Streams als Parameter gibt es. Sie befindet sich in der Unit Base64 (
Delphi-Quellcode:
). Diese Unit wird auch von der Unit BrowserTools, aus der die von Dir zitierte Funktion
function Encode64(Src, Dest: TStream): Boolean; overload;
Delphi-Quellcode:
stammt, über die uses-Anweisung eingebunden.
function Encode64(Data: TStream; MediaType: String): String;
Du könntest testhalber einmal versuchen, den Aufruf explizit zu formulieren:
Delphi-Quellcode:
Base64.Encode64(Data,Stream);
|
AW: Google Maps über COM (Component Object Model)
ah, habe es gefunden, ich habe ein anderes Base64 das auch im suchpfad ist, und das nimmt er als erstes her ...
eine andere Frage was bedeuten all diese New `?
Delphi-Quellcode:
Die tuen gar nichts eigetnlich, sind die für zukünftige Sachen da, oder braucht es die für etwas?
New(Google.Maps.Marker(MarkerOptions));
|
AW: Google Maps über COM (Component Object Model)
Ja, Du hast vollkommen Recht:
Momentan hat die New-Funktion keinerlei Bedeutung - sie gibt lediglich den Eingangsparameter als Resultat zurück. Sie dient hier nur dazu, den Quelltext etwas leserlicher zu gestalten, indem darauf hingewiesen wird, daß ein neues Objekt angelegt wird/wurde. So erstellt die Funktion
Delphi-Quellcode:
ein neues TLatLng-Objekt, was aber nicht sofort offensichtlich ist.
Google.Maps.LatLng(...)
Insofern kann die New-Funktion momentan auch ohne Bedenken weggelassen werden. Das wird sich aber in der kommenden Version grundlegend ändern: Dann wird das Objekt wirklich erst von der New-Funktion erstellt, die dann etwa wie der New-Operator in JavaScript arbeitet. So liefert - um bei dem Beispiel zu bleiben -
Delphi-Quellcode:
nur die Klasse und New() erstellt eine Instanz. Das Ganze dient - wie schon erwähnt - der Lesbarkeit des Quelltextes.
Google.Maps.LatLng
Auch Hilfsobjekte werden dann über die New-Funktion erstellt, so daß der Delphi-typische Syntax
Delphi-Quellcode:
bei der Verwendung des Frameworks überflüssig wird:
TObject.Create
Delphi-Quellcode:
Zu beachten ist hier, daß die Objekte nur noch über Interfaces angesprochen werden, was der besseren Speicherverwaltung dient.
procedure TForm1.FormShow(Sender: TObject);
begin with Script(WebBrowser1) do if not APILoaded then LoadAPIAsync(InitMap); end; procedure TForm1.InitMap(Sender: IObject); var MapOptions: IMapOptions; begin with Sender as IScript do begin MapOptions:=New(Google.Maps.MapOptions); with MapOptions do begin Zoom:=8; Center:=New(Google.Maps.LatLng(-34.397,150.644)); MapTypeID:=Google.Maps.MapTypeID.Roadmap; end; New(Google.Maps.Map(MapOptions)); end; end; |
AW: Google Maps über COM (Component Object Model)
Hallo
Gibt es eine möglichkeit alle Marker zu lsöchen und / oder einen spezifischen Ich finde irgendwie noch nicht das richtige ;) |
AW: Google Maps über COM (Component Object Model)
Jedes Objekt auf der Karte wird in einer entsprechenden Liste des Script-Objektes gespeichert und verwaltet.
Delphi-Quellcode:
Für neuere Delphi-Versionen wird auch der for-in-Syntax unterstützt:
with Script do
while Markers.Count>0 do begin Markers[0].SetMap(TMap(nil)); Markers.Delete(0); end;
Delphi-Quellcode:
In Zukunft wird der Aufruf von
with Script do
begin for Marker in Markers do Marker.SetMap(TMap(nil)); Markers.Clear; end;
Delphi-Quellcode:
ausreichen. Momentan werden dabei die Marker aber nicht von der Karte entfernt. Deshalb der explizite Aufruf von
Script.Markers.Clear;
Delphi-Quellcode:
;
SetMap(...)
|
AW: Google Maps über COM (Component Object Model)
Danke hat funktioniert :)
|
AW: Google Maps über COM (Component Object Model)
hallo,
gibt es eine möglichkeit, das erstellen vieler Custom-Marker mit OnClick-Event zu beschleunigen? beispiel:
Code:
das läuft wunderbar (<1s)
MarkerArray:=TMarkerArray.Create;
for n:=1 to 3000 do begin newMarkerPos:=New(Script.Google.Maps.LatLng(... , ...)); MarkerOptions:=TMarkerOptions.Create; with MarkerOptions do begin Position:=newMarkerPos; end; Marker:=New(Script.Google.Maps.Marker(MarkerOptions)); MarkerArray.Push(Marker); end; MarkerClusterer.AddMarkers(MarkerArray,true); MarkerClusterer.Repaint; packe ich in die MarkerOptions noch mehr rein:
Code:
dauert es schon knapp 10s
Title:=...;
zIndex:=...; IconImage:=...; ShadowImage:=...; Shape:=...; natürlich würde ich aber auch gerne was mit den Markern machen... setze ich
Code:
dauert das ganze dann allerdings schlappe 5min !!!
Marker.OnClick:=MarkerClick;
was natürlich nicht mehr bedienbar ist... irgendwelche tipps oder ideen? oder mache ich was grundlegendes falsch? 1000 dank! |
AW: Google Maps über COM (Component Object Model)
Ja, was soll ich sagen: JavaScript bleibt nun mal JavaScript - und darauf muß das Framework leider aufbauen (Lizenzbestimmungen von Google).
Ich habe Deine Aussagen untersucht und mußte feststellen, daß die Zuweisung von Ereignishandlern tatsächliche überproportional viel Zeit kostet. Ein kleiner Patch in der Unit JScriptObjects sollte etwas Entspannung bringen:
Delphi-Quellcode:
Das Ganze ist zwar kein Wundermittel - brachte aber auf meinem Rechner reichlich 50% Zeitersparnis bei 1000 Markern.
procedure TCustomScript.MakeFunctionNameUnique(var FunctionName: String);
var s: String; GUID: TGUID; begin if Assigned(FExternalMethods) then begin if FExternalMethods.IndexOf(FunctionName)>=0 then begin CreateGuid(GUID); s:=GUIDToString(GUID); s:=StringReplace(s,'{','',[rfReplaceAll]); s:=StringReplace(s,'}','',[rfReplaceAll]); s:=StringReplace(s,'-','',[rfReplaceAll]); FunctionName:=FunctionName+s; if AnsiChar(FunctionName[1]) in ['0'..'9'] then FunctionName:='_'+FunctionName; end; end; end; Um für die Marker nicht die ganze Oberfläche zu blockieren, könntest Du deren Erstellung auch in das OnIdle-Ereignis der Anwendung auslagern oder zwischendurch Application.ProcessMessages aufrufen. Die Auslagerung in einen Thread geht leider nicht, da Microsoft's JavaScript-Engine nicht threadsicher ist. Es wäre schön, wenn Du den Patch testen und mir mitteilen könntest, wie viel er gebracht hat. Wenn ich wieder etwas mehr Zeit habe, werde ich das Ganze noch einmal intensiver untersuchen und finde vielleicht noch die eine oder andere Optimierungsmöglichkeit. |
AW: Google Maps über COM (Component Object Model)
vielen dank, der patch funktioniert soweit - das ganze ist jetzt DEUTLICH schneller.
der schlimmste "zeitfresser" scheint wohl mit der GUID-methode behoben zu sein... wobei ein wenig weitere optimierung natürlich nie schaden kann ;-) falls du den patch in deine "offiziellen sourcen" übernehmen möchtest, müsstest du beachten, dass CreateGUID unter Delphi 5 noch CoCreateGUID heisst und in der unit ActiceX deklariert ist... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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