我在使用适用于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.
答案 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下载演示。