我注意到在使用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.
如果未調用構造函數,您甚至不會看到地圖或表單上的其他任何內容。 – TLama
地圖顯示正常。只要我使用TButton創建標記,應用程序就會工作。 – Soitjes