2016-12-12 8 views
0

うまく動作するGoogleマップを表示するシンプルなカスタムブラウザがあります。私がしたいことは、開かれた個人の位置を地図上にプロットするターンキーフォームにすることです。ターンキーシステムとして地図上に位置をプロットすることができません

これは概念を証明するための小さなテストプログラムです。

フォームを表示して編集ボックスに値を追加し、ButtonGotoLocationプロシージャを実行して位置を追加すると、毎回動作します。

I、すなわちHTMLWindow2.execScript(Format('GotoLatLng(%s,%s)',['34','-84.00']), 'JavaScript');

を呼び出して、ターンキーシステムとしてこれを設定した場合私もフォームを作成し、それを表示した後、呼び出し元のフォームからプロシージャをコールしようとしています。同じ結果。

これは奇妙な並行性の問題ですか?だから、私は外部の手続きを使ったが、役に立たなかった。

unit uStreetMap; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls, XPMan, ComCtrls,MSHTML; 

type 
    TfrmMain = class(TForm) 
    WebBrowser1: TWebBrowser; 
    LabelAddress: TLabel; 
    PanelHeader: TPanel; 
    ButtonGotoLocation: TButton; 
    XPManifest1: TXPManifest; 
    MemoAddress: TMemo; 
    ButtonGotoAddress: TButton; 
    LabelLatitude: TLabel; 
    LabelLongitude: TLabel; 
    Longitude: TEdit; 
    Latitude: TEdit; 
    ButtonClearMarkers: TButton; 

    procedure FormCreate(Sender: TObject); 
    procedure ButtonGotoAddressClick(Sender: TObject); 
    procedure ButtonGotoLocationClick(Sender: TObject); 
    procedure ButtonClearMarkersClick(Sender: TObject); 

    procedure FormActivate(Sender: TObject); 
    private 
    { Private declarations } 
    HTMLWindow2: IHTMLWindow2; 
    function UTCToSystemTime(UTC: TDateTime): TDateTime; 
    public 
    { Public declarations } 
    end; 

var 
    frmMain: TfrmMain; 

implementation 

uses 
    ActiveX, DateUtils; 


{$R *.dfm} 

const 
HTMLStr: AnsiString = 
'<html> '+ 
'<head> '+ 
'<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+ 
'<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.24&amp;libraries=geometry"></script> '+ 
'<script type="text/javascript"> '+ 
''+ 
''+ 
' var geocoder; '+ 
' var map; '+ 
' var markersArray = [];'+ 
''+ 
''+ 
' function initialize() { '+ 
' geocoder = new google.maps.Geocoder();'+ 
' var latlng = new google.maps.LatLng(40.714776,-74.019213); '+ 
' var myOptions = { '+ 
'  zoom: 13, '+ 
'  center: latlng, '+ 
'  mapTypeId: google.maps.MapTypeId.ROADMAP '+ 
' }; '+ 
' map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); '+ 
' map.set("streetViewControl", false);'+ 
' } '+ 
''+ 
''+ 
' function codeAddress(address) { '+ 
' if (geocoder) {'+ 
'  geocoder.geocode({ address: address}, function(results, status) { '+ 
'  if (status == google.maps.GeocoderStatus.OK) {'+ 
'   map.setCenter(results[0].geometry.location);'+ 
'   PutMarker(results[0].geometry.location.lat(), results[0].geometry.location.lng(), results[0].geometry.location.lat()+","+results[0].geometry.location.lng());'+ 
'  } else {'+ 
'   alert("Geocode was not successful for the following reason: " + status);'+ 
'  }'+ 
'  });'+ 
' }'+ 
' }'+ 
''+ 
''+ 
' function GotoLatLng(Lat, Lang) { '+ 
' var latlng = new google.maps.LatLng(Lat,Lang);'+ 
' map.setCenter(latlng);'+ 
' PutMarker(Lat, Lang, Lat+","+Lang);'+ 
' }'+ 
''+ 
''+ 
'function ClearMarkers() { '+ 
' if (markersArray) {  '+ 
' for (i in markersArray) { '+ 
'  markersArray[i].setMap(null); '+ 
' } '+ 
' } '+ 
'} '+ 
''+ 
' function PutMarker(Lat, Lang, Msg) { '+ 
' var latlng = new google.maps.LatLng(Lat,Lang);'+ 
' var marker = new google.maps.Marker({'+ 
'  position: latlng, '+ 
'  map: map,'+ 
'  title: Msg+" ("+Lat+","+Lang+")"'+ 
' });'+ 
' markersArray.push(marker); '+ 
' }'+ 
''+ 
''+ 
''+'</script> '+ 
'</head> '+ 
'<body onload="initialize()"> '+ 
' <div id="map_canvas" style="width:100%; height:100%"></div> '+ 
'</body> '+ 
'</html> '; 

スクリプトエラー 'GotoLatLng' は、この手順を使用し

procedure TfrmMain.FormActivate(Sender: TObject); 
begin 
    HTMLWindow2.execScript(Format('GotoLatLng(%s,%s)',['34.00','-84.00']), 'JavaScript'); 
end; 

コンストラクタ

procedure TfrmMain.FormCreate(Sender: TObject); 
var 
    aStream  : TMemoryStream; 
begin 
    WebBrowser1.Navigate('about:blank'); 
    if Assigned(WebBrowser1.Document) then 
    begin 
     aStream := TMemoryStream.Create; 
     try 
     aStream.WriteBuffer(Pointer(HTMLStr)^, Length(HTMLStr)); 
     aStream.Seek(0, soFromBeginning); 
     (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(aStream)); 
     finally 
     aStream.Free; 
     end; 
     HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow; 

    end; 
end; 

が正常に動作未定義であるので、これは例外が発生します。私は、テキストボックスに緯度/経度を入力し、ボタンをクリックするとすべてがうまくいきます。

procedure TfrmMain.ButtonGotoLocationClick(Sender: TObject); 
begin 
    HTMLWindow2.execScript(Format('GotoLatLng(%s,%s)',[Latitude.Text,Longitude.Text]), 'JavaScript'); 
end; 

しかし、フォームにマップ上の位置を(ターンキーとして)表示させようとすると、エラーが発生します。

procedure TfrmMain.ButtonClearMarkersClick(Sender: TObject); 
begin 
    HTMLWindow2.execScript('ClearMarkers()', 'JavaScript') 
end; 

procedure TfrmMain.ButtonGotoAddressClick(Sender: TObject); 
var 
    address : string; 
begin 
    address := MemoAddress.Lines.Text; 
    address := StringReplace(StringReplace(Trim(address), #13, ' ', [rfReplaceAll]), #10, ' ', [rfReplaceAll]); 
    HTMLWindow2.execScript(Format('codeAddress(%s)',[QuotedStr(address)]), 'JavaScript'); 
end; 


end. 

答えて

1

これはわたしがやったことです。私は、GotoLatLngを呼び出すためのスクリプトを実行するためのフォームにTTimerを投げました。 WaitForSingleObjectシグナルを使用するハンドルを見つけることができなかったので、これは私ができる最高のものでした。私は1700ミリ秒としてそれを設定し、それは十分な時間のようです。 また、ユニットコンストラクターからFormコンストラクターにマップの作成を移動しました。

すべてです。

関連する問題