在GMMap上创建标记失败

时间:2013-11-26 19:05:48

标签: delphi gmlib

我在使用适用于Delphi的Google Map API创建标记时发现了一些奇怪的行为。我可以很容易地重现问题,但没有解释。

在下面的代码中,您将看到一个CreatePoint方法,我在TButton的OnClick事件中调用该方法。标记是按原样创建的。

但是我在IdHTTPServer的OnCommandGet事件中使用相同的参数调用SAME createpoint方法。然后我使用Curl触发事件。但是后来没有创建标记,我收到消息:“模块'mshtml.dll'中地址为5548985C的访问冲突'。读取地址00000144”

我不明白为什么这会产生不同的结果。有什么想法吗?

我正在使用Delphi XE,所以我在运行时创建了TWebBrowser(因为它不在XE的Tool Palette中)。

下面的代码,示例项目可以下载here

    unit main;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdCustomHTTPServer,
      IdHTTPServer, GMClasses, GMMap, GMMapVCL, ExtCtrls,
      OleCtrls, SHDocVw, StdCtrls, GMLinkedComponents, GMMarker, GMMarkerVCL,
      GMConstants, IdContext;

    type
      DeviceRange = 0..15;

      TModWallyForm = class(TForm)
        Panel1: TPanel;
        GMMap1: TGMMap;
        IdHTTPServer1: TIdHTTPServer;
        GMMarker1: TGMMarker;
        Button4: TButton;
        procedure FormCreate(Sender: TObject);
        procedure GMMap1AfterPageLoaded(Sender: TObject; First: Boolean);
        procedure Button4Click(Sender: TObject);
        procedure IdHTTPServer1CommandGet(AContext: TIdContext;
          ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
      private
        { Private declarations }
        WebBrowser1 : TWebBrowser;
        Marker : TGMMarker;
        procedure CreatePoint(DeviceID : String; Longitude, Latitude : Real);
      public
        { Public declarations }
      end;

    var
      ModWallyForm: TModWallyForm;

    implementation

    {$R *.dfm}

    procedure TModWallyForm.FormCreate(Sender: TObject);
    var
      i : Integer;
    begin
      WebBrowser1 := TWebBrowser.Create(Panel1);
      TControl(WebBrowser1).Parent := Panel1;
      WebBrowser1.Align := alClient;
      GMMap1.WebBrowser := WebBrowser1;
      // Instantiate Markers
      Marker := TGMMarker.Create(nil);
      Marker.Map := GMMap1;
      IdHTTPServer1.Active := True;
    end;

    procedure TModWallyForm.GMMap1AfterPageLoaded(Sender: TObject; First: Boolean);
    begin
      if First then
      begin
        GMMap1.DoMap;
      end;
    end;

    procedure TModWallyForm.Button4Click(Sender: TObject);
    begin
      CreatePoint('15',4.77,50.55900);
    end;

    procedure TModWallyForm.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      CreatePoint('15',4.77,50.55900);
    end;

    procedure TModWallyForm.CreatePoint(DeviceID: string; Longitude: Real; Latitude: Real);
    begin
      with Marker.Add(Latitude, Longitude) do
        begin
          MarkerType := mtColored;
          InfoWindow.HTMLContent := DeviceID;
          ColoredMarker.Width := 48+(Index*20);
          ColoredMarker.Height := 48;
          ColoredMarker.PrimaryColor := clBlack;
          ColoredMarker.StrokeColor := clBlack;
          Title := '';  // Avoid showing the title when the mouse hovers over the marker
        end;
      GMMap1.RequiredProp.Center.Lat := Latitude;
      GMMap1.RequiredProp.Center.Lng := Longitude;
      GMMap1.RequiredProp.Zoom := 8;
    end;

    end.

2 个答案:

答案 0 :(得分:0)

确保在OnCommandGet之前调用了构造函数(TModWallyForm.FormCreate),否则您的“Marker”为nil

答案 1 :(得分:0)

我做了一些测试,我发现在尝试从加载的HTML页面执行JavaScript函数时会引发AV。组件代码是这个

function TGMMap.ExecuteScript(NameFunct, Params: string): Boolean;
var
  Doc2: IHTMLDocument2;
  Win2: IHTMLWindow2;
begin
  Result := Check;

  if not (FWebBrowser is TWebBrowser) then Exit;

  if not Result then Exit;

  Doc2 := TWebBrowser(FWebBrowser).Document as IHTMLDocument2;
  Win2 := Doc2.parentWindow;  // <==== FAIL ON THIS LINE

  Win2.execScript(NameFunct + '(' + Params + ')', 'JavaScript');

  if MapIsNull then
    raise Exception.Create(GetTranslateText('El mapa todavía no ha sido creado',     Language));
end;

我做了一个没有任何GMLib组件的测试,只有一个TWebBrowser(是的,它存在于XE中;-)),一个“do map”按钮和一个IdHTTPServer来创建具有相同结果的标记。

为此,我推断问题不在于GMLib组件。您可以从here下载演示。