AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Google Maps über COM (Component Object Model)
Thema durchsuchen
Ansicht
Themen-Optionen

Google Maps über COM (Component Object Model)

Ein Thema von Thom · begonnen am 23. Dez 2010 · letzter Beitrag vom 22. Mai 2022
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

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

  Alt 20. Dez 2012, 16:34
Unter Umständen gibt es dabei den von Dir erwähnten Pixelfehler. Dieser tritt aber in der Regel nur bei älteren IE-Versionen auf. Hast Du Dein Programm in der Registry "freigeschaltet"?
Ich habe Windows 7 mit IE9 und das Programm ist in der Registry freigeschaltet. Na ja, schade, aber nicht so schlimm.

Google gibt etliche Treffer in bezug auf DOCTYPE-Deklarationen, die nötig sind. Das wird doch aber sicherlich von Dir schon gemacht, oder?

Geändert von HJay (20. Dez 2012 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#2

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

  Alt 20. Dez 2012, 18:29
Jaaaaa, die Speicherverwaltung. Das ist ein abendfüllendes Thema.

Prinzipiell arbeiten alle Objekte des Frameworks als "Wrapper" oder "Adapter" für bestehende oder neu zu erstellende JavaScript-Objekte. (siehe Grafik). Die JavaScript-Objekte werden über ihre COM-Interfaces angesprochen, die vom Delphi-Wrapper-Objekt gespeichert werden. Solange das Delphi-Objekt also noch existiert, wird auch nicht die Interface-Referenz auf das JavaScript-Objekt freigegeben (Referenz-Zählung) und damit kann auch die JavaScript-Engine des Internet Explorers das (JavaScript-)Objekt nicht freigeben.

Damit möglichst wenig/nichts verloren geht, werden alle vom Framework erstellten Wrapper-Objekte zentral verwaltet und spätestens beim Beenden des Programmes freigegeben.
Unterscheiden muß man dabei die eigentlichen Karten-(Wrapper-)Objekte wie TMap, TRectangle, TMarker usw. und die "Hilfs"-Objekte wie zum Beispiel TMapOptions oder TRectangleOptions. Die Karten-Objekte werden beim Aufruf der entsprechenden Methoden erstellt (Google.Maps.Map, Google.Maps.Rectangle usw.) und anschließend vom Script-Objekt verwaltet (Script.Maps[...], Script.Rectangles[...] usw.).

In JavaScript werden neue Objekte mit der Anweisung "new" erstellt:
Code:
var latLng = new google.maps.latLng(10,20);
[...]
Damit ist auch ersichtlich, daß hier ein neues Objekt angelegt wird. Delphi bietet so etwas nicht, so daß das neue Objekt einfach mit
Delphi-Quellcode:
var LatLng: TLatLng;
  [...]
  LatLng:=Google.Maps.LatLng(10,20);
  [...]
erstellt wird. Viele (Delphi-)Programmierer halten das aber für eine unsaubere Programmierung: Es wird aufgrund des Syntax nicht deutlich, daß an dieser Stelle ein neues Objekt entsteht, wem es "gehört" und wer für dessen Freigabe zuständig ist. Deshalb wurde in der Version 2 des Frameworks die New-Funktion eingeführt, die vom programmtechnischen Standpunkt eigentlich vollkommen überflüssig ist:
Delphi-Quellcode:
function New(Value: Txxx): Txxx;
begin
  Result:=Value;
end;
Sie kann also ohne Probleme weggelassen werden und dient lediglich der besseren Lesbarkeit des Quelltextes:
Delphi-Quellcode:
  Map:=Google.Maps.Map;
  //hat die selbe Funktion wie
  Map:=New(Google.Maps.Map);
Das wird sich in der Version 3 des Frameworks radikal ändern: Die Maps-Methoden liefern dann nur noch eine Objekt-Klasse und erst die New-Funktion erstellt das eigentliche (Wrapper-)Objekt. Damit wird dann die Verwendung der New-Funktion obligatorisch.
Zusätzlich wird es auch für alle "Hilfs"-Objekte (wie TRectangleOptions) Konstruktor-Methoden im entsprechenden Namespace geben:
Delphi-Quellcode:
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  [...]
Die direkte Erstellung über
Delphi-Quellcode:
  RectangleOptions:=TRectangleOptions.Create;
  [...]
wird dann nicht mehr möglich sein, da die entsprechenden Konstruktor-Methoden nicht mehr public sind.

Was auf den ersten Blick wie eine Bevormundung des Programmierers aussieht, hat aber mehrere Gründe. Zum einen zählt dazu die bessere Lesbarkeit und die einheitliche Strukturierung des Quelltextes. Zum anderen gibt es den technischen Aspekt, wenn mehrere Browser-Komponenten verwendet werden: Jedes Objekt muß nämlich im entsprechenden Browser-Kontext erstellt werden und das geht nur, wenn dem neu zu erstellenden Objekt das entsprechende Script-Objekt übergeben wird.
Momentan muß das so geschehen:
Delphi-Quellcode:
  RectangleOptions:=TRectangleOptions.Create(Script(WebBrowser1));
  [...]
Das sieht nicht nur bescheiden aus, sondern ist auch im Gegensatz zum neuen Syntax wesentlich komplizierter:
Delphi-Quellcode:
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  [...]
Da das Objekt Maps "weiß", in welchem Kontext es existiert, kann demzufolge auch das Objekt RectangleOptions korrekt erstellt werden.

Obwohl - wie schon erwähnt - alle Objekte automatisch freigegeben werden (alle Karten-Objekte zum Beispiel auch bei einem Refresh mit der Taste F5) ist es mitunter sinnvoll, sie manuell im Quelltext freizugeben. Das betrifft allerdings in der Regel nur die "Hilfsobjekte" (TxxxOptions).

Trotzdem würde ich Dir empfehlen, momentan keine "Hilfsobjekte" manuell freizugeben, da die neue Frameworkversion nach außen hin ausschließlich mit Interfaces arbeitet und damit eine explizite Freigabe überflüssig wird. (Falls jetzt jemand von den Delphi-Profis kommt und sagt "Interfaces werden nicht freigegeben" - dooooooch, auch das wird gehen. Korrekterweise wird natürlich nicht das Interface freigegeben, sondern das dahinterliegende Objekt.)

Wird allerdings ein Rechteck nicht mehr benötigt, kann es selbstverständlich mit Free in den (digitalen) Mülleimer befördert werden. Es meldet sich dann automatisch bei allen internen Listen ab.
Delphi-Quellcode:
var
  Rectangle: IRectangle;
  RectangleOptions: IRectangleOptions;
begin
  [...]
  RectangleOptions:=New(Google.Maps.RectangleOptions);
  RectangleOptions.xxx;
  [...]
  Rectangle:=New(Google.Maps.Rectangle(RectangleOptions));
  [...]
end; //<- hier wird RectangleOptions automatisch freigegeben, Rectangle bleibt selbstverständlich erhalten
Das Speichermanagement-Problem wird sich also mit der Umstellung auf die kommende Version quasi von selbst erledigen. Um darauf gerüstet zu sein, sollte man keine harten Typumwandlungen mehr vornehmen, sondern jetzt schon den as-Operator verwenden:
Delphi-Quellcode:
  //schlecht:
  TRectangle(Sender).xxx;
  //besser:
  (Sender as TRectangle).xxx;
Damit ist dann die Umstellung schnell erledigt:
Delphi-Quellcode:
  //geht nicht:
  IRectangle(Sender).xxx;
  //geht:
  (Sender as IRectangle).xxx;
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (20. Dez 2012 um 22:27 Uhr)
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#3

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

  Alt 28. Dez 2012, 20:48
Wie kann man den Text eines GoogleMaps-Controls ändern?

Derzeit lautet der Text zum Beispiel "Text" in Fettdruck und ich möchte je nach Bool-Zustand den Text entweder in normal oder in fett ausgeben.

Derzeit ändert sich beim Click folgendes:
+ vorher: weiße Box mit Rahmen und dem Text "Text"
+ nachher: keine Box mehr, nur noch der Text "XXX"

Wie kann man die weiße Box erhalten und einfach nur '<b>Text</b>' durch 'Text' ohne Fettdruck ersetzen?

Wahrscheinlich greife ich auf das falsche InnerHTML-Objekt zu.

Vielen Dank im voraus!

Code:
procedure TGoogleMap.InitMap(Sender: TObject);
  var
    MyOptions        : TMapOptions;
    MyMap            : TMap;
    AControlDiv      : TNode;
    AControl         : TJScriptObject;
begin
  with Script(WebBrowser) do begin
    MyOptions := TMapOptions.Create(Script(WebBrowser));
    with MyOptions do begin
      Zoom := 12;
      Center := New(Google.Maps.LatLng(53.250249,9.835209));
      MapTypeID := Google.Maps.MapTypeID.Roadmap;
    end;
    MyMap := New(Google.Maps.Map(MyOptions));

    MyMap.OnZoomChanged := MapZoomChanged;
    MyMap.OnDragEnd    := MapDragEnd;

    { add button control }
    AControlDiv := Document.CreateDivNode;
    AControl   := TJScriptObject.Create;
    InitControl(AControlDiv);
    MyMap.Controls[Google.Maps.ControlPosition.TopLeft].Push(AControlDiv);
  end;

  if Assigned(Callback) then Callback(Sender);
end;

procedure TGoogleMap.InitControl(AControlDiv: TNode);
  var AControlUI, AControlText: TNode;
begin
  with Script(WebBrowser) do begin
    AControlDiv.Style.Padding := '5px';
    AControlUI := Document.CreateDivNode;
    with AControlUI do
    begin
      with Style do
      begin
        BackgroundColor :=clWhite;
        BorderStyle    :='solid';
        BorderWidth    :='1px';
        Cursor         :='pointer';
        TextAlign      :='center';
      end;
      Title:='a hint to pop up';
    end;
    AControlDiv.AppendChild(AControlUI);

    AControlText := Document.CreateDivNode;
    with AControlText do begin
      with Style do begin
        FontFamily  := 'Arial,sans-serif';
        FontSize    := '12px';
        PaddingLeft := '4px';
        PaddingRight := '4px';
      end;
      InnerHTML := '<b>Text</b>';
    end;
    AControlUI.AppendChild(AControlText);

    Google.Maps.Event.AddDomListener(AControlUI, 'click', NewFunction(ControlClick));
  end;
end;

procedure TGoogleMap.ControlClick;
begin
  with Script(Webbrowser) do Maps[0].Controls[Google.Maps.ControlPosition.TopLeft].Items[0].InnerHTML := 'XXX';
end;

Geändert von HJay (20. Jan 2013 um 12:37 Uhr)
  Mit Zitat antworten Zitat
swaters

Registriert seit: 28. Jul 2011
6 Beiträge
 
#4

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

  Alt 31. Dez 2012, 09:01
Thom,
I would like to get the Result for a request as a xml. Is it possible?
My idea is to edit my series of roots and then create one gpx file and then load it to my gps and hopefully be talked through my journey by my iphone.

Thanks.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
DELPHI | (google maps) This thread Refback 11. Nov 2011 09:07
Twebbrowser HTML tag to UniHTMLFrame1 - uniGUI Discussion Forums This thread Refback 4. Nov 2011 06:52
DoraDev1975: google maps This thread Refback 23. Sep 2011 08:18
delphi osm - Google Search Post #0 Refback 19. Sep 2011 09:02
DoraDev1975: ?&#3636;????? 2011 This thread Refback 11. Sep 2011 16:39
DoraDev1975 This thread Refback 30. Aug 2011 10:13
Untitled document This thread Refback 25. Jun 2011 19:57
Interact with Google Maps in a TWebBrowser from Delphi | Ramblings This thread Refback 26. Jan 2011 05:12
google maps mit delphi link - Google Search This thread Refback 24. Jan 2011 14:24
google maps mit delphi - Google Search This thread Refback 24. Jan 2011 14:20
Untitled document This thread Refback 19. Jan 2011 21:49

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr.
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