1

Google Map API for Delphi を使用してマーカーを作成すると、奇妙な動作に気付きました。問題を簡単に再現できますが、説明がありません。

以下のコードには、TButton の OnClick イベントで呼び出す CreatePoint メソッドがあります。マーカーが作成されます。

しかし、その後、IdHTTPServer の OnCommandGet イベントで同じパラメーターを使用して SAME createpoint メソッドを呼び出します。次に、Curl を使用してイベントをトリガーします。しかし、マーカーが作成されず、「モジュール 'mshtml.dll' のアドレス 5548985C でアクセス違反。アドレス 00000144 の読み取り」というメッセージが表示されます。

なぜこれが異なる結果をもたらすのか理解できません。何か案が ?

私は Delphi XE を使用しているので、実行時に TWebBrowser を作成します (XE のツール パレットにないため)。

以下のコード、サンプル プロジェクトはここからダウンロードできます。

    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.
4

2 に答える 2

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 に存在します ;-) )、「マップを実行」するボタン、および同じ結果のマーカーを作成する IdHTTPServer のみでテストを行いました。

そのため、問題は GMLib コンポーネントにあるのではないと推測します。ここからデモをダウンロードできます。

于 2013-11-28T06:43:37.460 に答える