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
Benutzerbild von beeglext
beeglext

Registriert seit: 26. Dez 2011
Ort: Днепропетровск
2 Beiträge
 
Delphi 7 Enterprise
 
#1

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

  Alt 27. Dez 2011, 06:13
error inslal TWebBrowser Delphi7
http://s47.radikal.ru/i116/1112/bc/2b5714883b81.jpg
help please
Дмитрий(Dmitriy)
  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 27. Dez 2011, 20:25
Hi Azrin,

thank you very much! Unfortunately I have only Delphi and not RAD Studio, so I could test it yet. If there are problems again, please tell about it!


Hi Дмитрий,

Delphi 7 has a integrated TWebBrowser component (dclie70.bpl). You do not need a additional component.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (27. Dez 2011 um 23:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von beeglext
beeglext

Registriert seit: 26. Dez 2011
Ort: Днепропетровск
2 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 27. Dez 2011, 23:22
Thom, спасибо (thank you)
Дмитрий(Dmitriy)
  Mit Zitat antworten Zitat
azrin.aris

Registriert seit: 25. Dez 2011
3 Beiträge
 
#4

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

  Alt 28. Dez 2011, 15:15
Hi Azrin,

thank you very much! Unfortunately I have only Delphi and not RAD Studio, so I could test it yet. If there are problems again, please tell about it!
Hi Thom,

I mange to port 2 of your samples int C++ Builder. Now I'm trying to port one of Events sample - the DOMListener sample. Unfortunately, I stuck

here is the code in Delphi (from your sample)
Delphi-Quellcode:
    {$IFDEF USE_ANONYMOUS_METHODS}
    Google.Maps.Event.AddDomListener(Map.Container,'click',NewFunction(
      procedure(Sender: TObject)
      var
        Event: TJScriptObject;
      begin
        //'Sender' is the TJScriptObject that was created with 'NewFunction()'
        //The 'click' event has one parameter - a object with the x and y
        //position of the click.
        Event:=TJScriptObject(CreateObjectWrapper(Script,TJScriptObject,
                                                  TJScriptFunction(Sender).Arguments[0]));
        ShowMessage('DIV clicked'+', ('+
                    'x: '+IntToStr(Event.Properties['x'])+', '+
                    'y: '+IntToStr(Event.Properties['y'])+')');
      end));
    {$ELSE}
    Google.Maps.Event.AddDomListener(Map.Container,'click',NewFunction(DIVClick));
    {$ENDIF}
I also attached here are the C++ codes that I manage to port and compile and is working
Angehängte Dateien
Dateityp: zip Control Options-CBXE2.zip (76,2 KB, 55x aufgerufen)
Dateityp: zip Icon Complex-CBXE2.zip (76,8 KB, 56x aufgerufen)
  Mit Zitat antworten Zitat
azrin.aris

Registriert seit: 25. Dez 2011
3 Beiträge
 
#5

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

  Alt 28. Dez 2011, 22:17
Hi all,

Here is another stumbling block that I encounter

the delphi code is:
Delphi-Quellcode:
procedure TForm1.InitMap(Sender: TObject);
var
  Marker: TMarker;
  MarkerOptions: TMarkerOptions;
  MyMap: TMap;
  MyOptions: TMapOptions;
begin
  with TScript(Sender) do
  begin
    MyOptions:=TMapOptions.Create;
    with MyOptions do
    begin
      Zoom:=4;
      Center:=New(Google.Maps.LatLng(-25.363882,131.044922));
      MapTypeID:=Google.Maps.MapTypeID.Roadmap;
    end;
    MyMap:=New(Google.Maps.Map(MyOptions));
    MarkerOptions:=TMarkerOptions.Create;
    with MarkerOptions do
    begin
      Position:=MyMap.GetCenter;
      Map:=MyMap;
      Title:='Click to zoom';
    end;
    Marker:=New(Google.Maps.Marker(MarkerOptions));
    {$IFDEF USE_ANONYMOUS_METHODS}
    Marker.OnClick:=
      procedure(Sender: TObject; Event: TEvent)
      begin
        if MyMap.GetZoom=8
          then MyMap.SetZoom(4)
          else MyMap.SetZoom(8);
        MyMap.SetCenter(Marker.GetPosition);
      end;
    {$ELSE}
    Marker.OnClick:=MarkerClick;
    {$ENDIF}
  end;
end;

{$IFNDEF USE_ANONYMOUS_METHODS}
procedure TForm1.MarkerClick(Sender: TObject; Event: TEvent);
begin
  with Script do
  begin
    if Maps[0].GetZoom=8
      then Maps[0].SetZoom(4)
      else Maps[0].SetZoom(8);
    Maps[0].SetCenter(TMarker(Sender).GetPosition);
  end;
end;
{$ENDIF}
and the C++ code is:
Code:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <SHDocVw.hpp>
#include <Vcl.OleCtrls.hpp>
#include "gmAPI.hpp"
#include "gmMap.hpp"
#include "gmOverlaysMarker.hpp"
#include "gmEvents.hpp"
#include "HTMLObjects.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
    TWebBrowser *WebBrowser1;
    void __fastcall FormCreate(TObject *Sender);
private:   // User declarations
    TScript *Script;
    void __fastcall InitMap(TObject *Sender);

public:       // User declarations
    __fastcall TForm1(TComponent* Owner);

    void __fastcall MarkerClick(TObject* Sender, Gmevents::TEvent Event);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



//Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#pragma link "gmMap"
#pragma link "winInet.lib"

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Script = new TScript(WebBrowser1);
   Script->LoadAPIAsync(InitMap);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::InitMap(TObject *Sender)
{

   int n;
   TMarker *Marker;
   TMarkerOptions *MarkerOptions;
   TLatLng *MyLatLng;
   TMap *MyMap;

   TScript *Script = dynamic_cast<TScript*>(Sender);

   TMapOptions *MyOptions = new TMapOptions;

   MyOptions->Zoom = 4;
   MyOptions->Center = Script->Google->Maps->LatLng(-25.363882,131.044922);
   MyOptions->MapTypeID = Script->Google->Maps->MapTypeID->Roadmap;

   MyMap = Script->Google->Maps->Map(MyOptions);

   MarkerOptions = new TMarkerOptions;

   MarkerOptions->Position = MyMap->GetCenter();
   MarkerOptions->Map      = MyMap;
   MarkerOptions->Title   = "Click to Zoom";
   Marker = Script->Google->Maps->Marker(MarkerOptions);
   Marker->OnClick = MarkerClick;  //[BCC32 Error] Member function must be called or its address taken

   delete MyOptions;
   delete MarkerOptions;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::MarkerClick(TObject* Sender, Gmevents::TEvent Event)
{
   if(Script->Google->Maps[0]->GetZoom==8) // Error :E2288 Pointer to structure required on left side of -> or ->*
   {

   }
}
//---------------------------------------------------------------------------

I could not get the MarkerClick to be assigned to Marker->OnClick.

Also I could not find the Script->Google->Maps[0]->GetZoom() function.

Attached is the hpp file converted by C++ Builder


Anyhelp would be very much appreciated.

Thank you
Angehängte Dateien
Dateityp: zip gmAPI.zip (6,1 KB, 57x aufgerufen)

Geändert von azrin.aris (28. Dez 2011 um 22:34 Uhr)
  Mit Zitat antworten Zitat
Thom

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

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

  Alt 30. Dez 2011, 13:34
Hi Azrin,

Thank you for your work!
Unfortunately I have no C++ or RAD Studio, so that I can not do this test. My trial version of XE2 has also expired.

I suspect that C++ does not can handle anonymous methods from Delphi. Please turn off the use of anonymous methods in the file gmConfig.inc
Delphi-Quellcode:
{.$DEFINE USE_ANONYMOUS_METHODS}
//...
and remove all sections from demos, where anonymous methods were used.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Thom

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

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

  Alt 4. Jan 2012, 15:07
Auf Grund einer Anfrage bezüglich drehbarer Marker habe ich zu diesem Thema einmal eine kleine Demo erstellt.

Prinzipiell bieten sich dafür vier Wege an:
  1. Drehung per CSS mit Hilfe von Filtern.
    Dazu ist der Zugriff auf das IMG- bzw. DIV-Element notwendig, der jedoch vom (JavaScript-) Marker-Objekt nicht unterstützt wird. Die Ermittlung des Bild-Containers ist über Umwege zwar möglich, aber umständlich und es ist nicht sicher, ob derartige "Hacks" auch mit zukünftigen API-Versionen kompatibel sind.
  2. Drehung mit dem Canvas-Element von HTML 5.
    Auch hier existieren die selben Probleme wie bei der ersten Lösung. Ein weiteres Gegenargument ist der Umstand, daß damit automatisch Windows XP (und älter) ausgeschlossen wird, da für diese Betriebssysteme kein HTML 5 fähiger IE angeboten wird.
  3. Erstellung einer entsprechenden Anzahl gedrehter Icons (zum Beispiel mit einem Bildbearbeitungsprogramm) und Zuweisung des gewünschten Bildes zum Marker.
    Auch diese Methode hat einen gravierenden Nachteil: Das schlechte Speichermanagement des IE's, auf das man leider keinen Einfluß hat. Dadurch wächst der Speicherverbrauch schnell um zahlreiche Megabyte.
  4. Drehung des Bildes mit Delphi und Übergabe an das Marker-Objekt.
    Dieser Weg bietet die meisten Vorteile, da er die größtmögliche Kontrolle über den Vorgang zuläßt. Das beginnt mit der Optimierung der Bildrotation (Schnelligkeit, Qualität des Antialiasing), geht über die Kontrolle des Speicherverbrauch (direkte Freigabe nicht mehr benötigter Objekte, kein Warten auf eine Garbage Collection und kein Cache, auf den man keinen Einfluß hat - wer kennt das nicht: Man hat 10 Seiten geöffnet und der Taskmanager bescheinigt dem IE einen Speicherverbrauch von einem GByte).

Als Marker-Icon wird ein Png-Bild mit Transparenz verwendet. Deshalb setzt die Demo die Unit PNGImage voraus. Ab Delphi 2009 ist diese Bestandteil der Bibliothek, bei älteren Versionen muß sie nachträglich installiert werden. Zu finden ist sie zum Beispiel hier.
Desweiteren muß in diesem Fall die Verwendung von Png-Bildern in der Datei gmConfig.inc per Compilerschalter aktiviert werden, um die entsprechenden Funktionen im Framework nutzbar zu machen:
Delphi-Quellcode:
{$DEFINE USE_PNGIMG} //<- Punkt nach '{' entfernen
//...
Dadurch, daß die Bezeichnung von TPNGObject in TPNGImage geändert wurde, sind auch die dfm-Dateien nicht kompatibel. In älteren Delphi-Versionen müssen deshalb die Picture-Eigenschaften der Image-Komponenten neu geladen werden. Ansonsten wurde die Demo mit Delphi 5 und XE getestet und sollte auch mit anderen Delphi-Versionen funktionieren.

Gedreht wird das Bild mit Hilfe von SmoothRotate - einer Prozedur von Gustavo Daud, dessen Beispiele leider nur noch sehr schwer zu finden sind. Nach langer Suche wurde ich auf CodeCentral von Embarcadero fündig, wo unter PNGDelph Method Shop Code Samples auch einige Demos von Gustavo enthalten sind. Leider liegen die Dateien dort nur im txt-Format vor und enthalten einige Bugs. Deshalb wurden die benötigten Methoden von mir in eine Unit gepackt, ein Speicherleck beseitigt und um die Möglichkeit, beim gedrehten Bild die Größe des Originalbildes beizubehalten, erweitert.
Nach der Drehung wird das Bild Base64 kodiert und an den Marker übergeben.

Der gesamte Vorgang (Drehung, Antialiasing, Kodierung, Übergabe und Anzeige im Browser) geschieht in Echtzeit und führt auch auf einem Netbook zu keinem Ruckeln oder Flackern.

Das Ergebnis sieht dann so aus:
screenshot_markerrotation_1.jpg screenshot_markerrotation_2.jpg
Angehängte Dateien
Dateityp: zip MarkerRotation.zip (839,0 KB, 107x aufgerufen)
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom ( 5. Jan 2012 um 00:51 Uhr)
  Mit Zitat antworten Zitat
movnet

Registriert seit: 8. Jan 2011
4 Beiträge
 
#8

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

  Alt 5. Jan 2012, 22:38
Hi Thom.
How can I get gmOverlaysMarker.pas?
Thank you.
  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 09:46 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