Delphi-PRAXiS
Seite 28 von 55   « Erste     18262728 293038     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)

Gruber_Hans_12345 29. Aug 2012 12:06

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;

Thom 29. Aug 2012 12:35

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:
function Encode64(Src, Dest: TStream): Boolean; overload;
). Diese Unit wird auch von der Unit BrowserTools, aus der die von Dir zitierte Funktion
Delphi-Quellcode:
function Encode64(Data: TStream; MediaType: String): String;
stammt, über die uses-Anweisung eingebunden.

Du könntest testhalber einmal versuchen, den Aufruf explizit zu formulieren:
Delphi-Quellcode:
Base64.Encode64(Data,Stream);

Gruber_Hans_12345 29. Aug 2012 12:52

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:
New(Google.Maps.Marker(MarkerOptions));
Die tuen gar nichts eigetnlich, sind die für zukünftige Sachen da, oder braucht es die für etwas?

Thom 29. Aug 2012 13:35

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:
Google.Maps.LatLng(...)
ein neues TLatLng-Objekt, was aber nicht sofort offensichtlich ist.
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:
Google.Maps.LatLng
nur die Klasse und New() erstellt eine Instanz. Das Ganze dient - wie schon erwähnt - der Lesbarkeit des Quelltextes.
Auch Hilfsobjekte werden dann über die New-Funktion erstellt, so daß der Delphi-typische Syntax
Delphi-Quellcode:
TObject.Create
bei der Verwendung des Frameworks überflüssig wird:
Delphi-Quellcode:
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;
Zu beachten ist hier, daß die Objekte nur noch über Interfaces angesprochen werden, was der besseren Speicherverwaltung dient.

Gruber_Hans_12345 30. Aug 2012 09:47

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

Thom 30. Aug 2012 10:56

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:
with Script do
  while Markers.Count>0 do
  begin
    Markers[0].SetMap(TMap(nil));
    Markers.Delete(0);
  end;
Für neuere Delphi-Versionen wird auch der for-in-Syntax unterstützt:
Delphi-Quellcode:
with Script do
begin
  for Marker in Markers do
    Marker.SetMap(TMap(nil));
  Markers.Clear;
end;
In Zukunft wird der Aufruf von
Delphi-Quellcode:
Script.Markers.Clear;
ausreichen. Momentan werden dabei die Marker aber nicht von der Karte entfernt. Deshalb der explizite Aufruf von
Delphi-Quellcode:
SetMap(...)
;

Gruber_Hans_12345 30. Aug 2012 12:33

AW: Google Maps über COM (Component Object Model)
 
Danke hat funktioniert :)

jonathan 31. Aug 2012 12:50

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:
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;
das läuft wunderbar (<1s)


packe ich in die MarkerOptions noch mehr rein:
Code:
      Title:=...;
      zIndex:=...;
      IconImage:=...;
      ShadowImage:=...;
      Shape:=...;
dauert es schon knapp 10s


natürlich würde ich aber auch gerne was mit den Markern machen...
setze ich
Code:
Marker.OnClick:=MarkerClick;
dauert das ganze dann allerdings schlappe 5min !!!
was natürlich nicht mehr bedienbar ist...

irgendwelche tipps oder ideen?
oder mache ich was grundlegendes falsch?
1000 dank!

Thom 31. Aug 2012 19:07

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:
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;
Das Ganze ist zwar kein Wundermittel - brachte aber auf meinem Rechner reichlich 50% Zeitersparnis bei 1000 Markern.

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.

jonathan 2. Sep 2012 11:07

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.
Seite 28 von 55   « Erste     18262728 293038     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