2016-05-10 6 views
0

がどのように私はGoogleマップで場所を表示しない]ボタンをクリックしなくてもTWebBrowser(Googleマップ)での位置を表示して?ユーザーフォームの[場所の表示]ボタンをクリックしたときに、住所に沿って渡そうとしています。現在、ユーザーが「場所の表示」ボタンをクリックすると、アドレスが渡されますが、ViewMapsフォームが開いたときにその場所は表示されません。しかしViewMapsたら(TWebBrowser)フォームが表示され、メモボックスに「1無限ループ、クパチーノ、CA 95014」のアドレスが表示され、ユーザーは「GoToAddressBtn」ボタンをクリックすると、場所が表示されます。は私のDelphi/Windowsのアプリのボタンをクリックしなくても

は、どのように私は場所がViewMapsフォームに「GoToAddressBtn」ボタンをクリックしたユーザーせずにGoogleマップに表示されるのですか?

implementation 

Uses ShredMain, ActiveX; 

{$R *.dfm} 

const 
HTMLStr: AnsiString = 
'<html> '+ 
'<head> '+ 
'<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+ 
//'<meta http-equiv="X-UA-Compatible" content="IE=edge" />'+ 
'<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3"></script> '+ 
'<script type="text/javascript"> '+ 
''+ 
''+ 
' var geocoder; '+ 
' var map; '+ 
//' var address; '+ 
' var trafficLayer;'+ 
' var bikeLayer;'+ 
' var markersArray = [];'+ 
''+ 
''+ 
' function initialize() { '+ 
' geocoder = new google.maps.Geocoder();'+ 
' var latlng = new google.maps.LatLng(40.714776,-74.019213); '+ 
//' var address = "San Diego, CA";'+ 
' var myOptions = { '+ 
'  zoom: 11, '+ 
'  center: latlng, '+ 
'  mapTypeId: google.maps.MapTypeId.ROADMAP '+ 
' }; '+ 
' map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); '+ 
' trafficLayer = new google.maps.TrafficLayer();'+ 
' bikeLayer = new google.maps.BicyclingLayer();'+ 
' 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); '+ 
' }'+ 
''+ 
''+ 
' function TrafficOn() { trafficLayer.setMap(map); }'+ 
''+ 
' function TrafficOff() { trafficLayer.setMap(null); }'+ 
''+''+ 
' function BicyclingOn() { bikeLayer.setMap(map); }'+ 
''+ 
' function BicyclingOff(){ bikeLayer.setMap(null);}'+ 
''+ 
' function StreetViewOn() { map.set("streetViewControl", true); }'+ 
''+ 
' function StreetViewOff() { map.set("streetViewControl", false); }'+ 
''+ 
''+'</script> '+ 
'</head> '+ 
'<body onload="initialize()"> '+ 
' <div id="map_canvas" style="width:100%; height:100%"></div> '+ 
'</body> '+ 
'</html> '; 

procedure TViewMaps.Timer1Timer(Sender: TObject); 
var 
    aStream: TMemoryStream; 
begin 
    Timer1.Enabled:= False; //Disable timer so it doesn't fire again 
    WebBrowser1.Navigate('about:blank'); 
    if Assigned(WebBrowser1.Document) then 
    begin 
    aStream := TMemoryStream.Create; 
    try 
     aStream.WriteBuffer(Pointer(HTMLStr)^, Length(HTMLStr)); 
     //aStream.Write(HTMLStr[1], Length(HTMLStr)); 
     aStream.Seek(0, soFromBeginning); 
     MemoAddress.Lines.Clear; 
     MemoAddress.Lines.Add('1 Infinite Loop. Cupertino, CA 95014'); 
     address := MemoAddress.Lines.Text; 
     address := StringReplace(StringReplace(Trim(address), #13, ' ', [rfReplaceAll]), #10, ' ', [rfReplaceAll]); 
     //HTMLWindow2.execScript(Format('codeAddress(%s)',[QuotedStr(address)]), 'JavaScript'); 
     (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(aStream)); 
    finally 
     aStream.Free; 
    end; 
    HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow; 
    end; 
end; 

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

答えて

1

アドレスをマッピングフォームに渡す場合は、フォームのコンストラクタのパラメータとして渡すことができます。

fAddressという名前のプライベートフォームvarableを作成します。

その後、アドレスを渡し、フォームの公開コンストラクタオーバーライドを追加します。

Public 
    constructor create(AOwner: TComponent; AAddress: string); reintroduce; 

implementation 

constructor TForm1.create(AOwner: TComponent; AAddress: string); 
begin 
    inherited create(AOwner); 
    fAddress := AAddress; // fAddress is now stored to form variable 
end; 

アプリはまた、GoogleのAPIが最初にロードされていることを確認する必要があります。 TTimerを使用する必要はありません.TwebBrowserのREADY_STATEを確認して、Google APIが完全にロードされていることを確認するだけです。ここでは、コードをフォームのOnShowイベント(テスト済み)に移動しました。マッピング・フォームを使用してアドレスを実装し、表示する

procedure TForm1.FormShow(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; 

    while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do // wait for google 
    begin 
    sleep(0); 
    application.processmessages; 
    end; 

    fAddress := StringReplace(StringReplace(Trim(fAddress), #13, ' ', [rfReplaceAll]), #10, ' ', [rfReplaceAll]); 
    HTMLWindow2.execScript(Format('codeAddress(%s)',[QuotedStr(fAddress)]), 'JavaScript'); 
end; 

、あなたは、呼び出し元のフォームから、次を使用したい:

Form1 := TForm1.create(self, '15010 NE 36th St, Redmond, WA 98052'); 
try 
    Form1.showmodal; 
finally 
    Form1.destroy; 
end; 
+0

を私はあなたが提案し何を追加しましたが、私はエラーを取得しています「 Panel1という名前のコンポーネントが既に存在します。呼び出しフォームが 'code'行からフォームを作成しようとするときViewMaps:= ViewMaps.create(self、 '15010 NE 36th St、Redmond、WA 98052'); – Hackbrew

+0

私の例では、form1がマッピングフォームです。本当にマッピングフォームを作成しようとしていますか?自己をNilに置き換えてみてください –

+0

はい、私はマッピングフォームのViewMapsにform1を変更しました。私は何もしなかったし、同じエラーが出た。私の呼び出しフォームコードは次のとおりです: 'プロシージャTMaintForm.ShowMapBitBtnClick(Sender:TObject); = ViewMaps.create(NIL、 '15010 NE 36セント、レドモンド、WA 98052');: はViewMapsを開始します try ViewMaps.showmodal; 最終的に ViewMaps.destroy; end; end; ' – Hackbrew

関連する問題