2013-11-26 86 views
1

我注意到在使用Delphi的Google Map API創建標記時出現了一些奇怪的行爲。我可以很容易地重現問題,但沒有解釋。在GMMap上創建標記失敗

在下面的代碼中,您將看到一個CreatePoint方法,我在TButton的OnClick事件中調用該方法。標記是按照它應該創建的。

但是,然後我在IdHTTPServer的OnCommandGet事件中使用相同的參數調用SAME createpoint方法。然後我用Curl觸發事件。但是,然後標記不會創建,我得到的消息:「地址5548985C模塊'mshtml.dll'中的訪問衝突。閱讀地址00000144」

我不明白爲什麼這可能會給出不同的結果。任何想法 ?我正在使用Delphi XE,因此我在運行時創建TWebBrowser(因爲它不在XE的工具面板中)。

代碼如下,示例項目可以下載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. 

回答

0

確保你的構造(TModWallyForm.FormCreate)調用之前OnCommandGet否則你的「標記」是零

+0

如果未調用構造函數,您甚至不會看到地圖或表單上的其他任何內容。 – TLama

+0

地圖顯示正常。只要我使用TButton創建標記,應用程序就會工作。 – Soitjes

0

我做了一些測試,我看到,當嘗試執行的AV升高加載HTML頁面的JavaScript函數。組件的代碼是這樣

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存在;-)),一個按鈕「做地圖」和IdHTTPServer創建該標記具有相同的結果。

爲此,我推斷問題不在GMLib組件中。您可以從here下載演示。

+0

有效!它仍然讓我不知道爲什麼發生這種情況,以及是否有解決方法。 TWebBrowser中可能存在一個錯誤? – Soitjes

+0

至於工具選項板中的TWebBrowser:我必須糾正我的陳述,因爲我使用的是Delphi XE Starter,它在工具選項板中沒有TWebBrowser。 – Soitjes

+0

我想我必須發表一個新的問題來重述這個問題?因爲它與GMLib組件無關。 – Soitjes