Javascript调用Google地图在Delphi应用程序中不起作用
这是我之前在同一份申请中遇到的问题的延续。当我在下面添加Javascript时,我得到一个脚本错误。我猜我没有用GrabDistSWFObject行正确返回值Javascript调用Google地图在Delphi应用程序中不起作用,javascript,delphi,google-maps-api-3,Javascript,Delphi,Google Maps Api 3,这是我之前在同一份申请中遇到的问题的延续。当我在下面添加Javascript时,我得到一个脚本错误。我猜我没有用GrabDistSWFObject行正确返回值 const HTMLStr: AnsiString = '<html> '+ '<head> '+ '<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+ ''+ '<script type="text
const
HTMLStr: AnsiString =
'<html> '+
'<head> '+
'<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+
''+
'<script type="text/javascript" src="http://maps.google.com/maps/api/js? v=3.24"></script> '+
'<script type="text/javascript"> '+
''+
''+
' var geocoder; '+
' var map; '+
' var trafficLayer;'+
' var bikeLayer;'+
' var markersArray = [];'+
' var GrabDistSWFObject;'+
''+
''+
' function initialize() { '+
' geocoder = new google.maps.Geocoder();'+
' var latlng = new google.maps.LatLng(40.714776,-74.019213); '+
' 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);'+
' var myLatlng = new google.maps.LatLng( results[0].geometry.location.lat(), results[0].geometry.location.lng()); '+
' var marker = new google.maps.Marker({ '+
' position: myLatlng, '+
' title: "", '+
' map: map '+
' }); '+
' markersArray.push(marker); '+
' document.getElementById("hiddenlat").value = myLatlng.lat(); '+
' document.getElementById("hiddenlng").value = myLatlng.lng(); '+
' '+
' } else {'+
' document.getElementById("hiddenlat").value = "error"; '+
' document.getElementById("hiddenlng").value = "error"; '+
' 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 GrabDist() { '+
' alert("I reached GrabDist"); '+
' } '+
''+
''+
' function distance(lat1, lon1, lat2, lon2, unit) { '+
' alert("I reached distance"); '+
' var radlat1 = Math.PI * lat1/180; '+
' var radlat2 = Math.PI * lat2/180; '+
' var radlon1 = Math.PI * lon1/180; '+
' var radlon2 = Math.PI * lon2/180; '+
' var theta = lon1-lon2; '+
' var radtheta = Math.PI * theta/180; '+
' var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); '+
' dist = Math.acos(dist); '+
' dist = dist * 180/Math.PI; '+
' dist = dist * 60 * 1.1515; '+
' if (unit=="K") { dist = dist * 1.609344 }; '+
' if (unit=="N") { dist = dist * 0.8684 }; '+
' return GrabDist().set("dist", dist); '+
'} '+
''+
''+
' 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> '+
'<input type="hidden" id="hiddenlat" value="0" />'+
'<input type="hidden" id="hiddenlng" value="0" />'+
'</body> '+
'</html> ';
下面是显示语法错误的脚本错误。
我认为您的函数GrabDist和函数调用编码不正确,可能不需要。相反,将返回的值保存到隐藏字段,如下所示 为了将javascript距离结果传递回delphi应用程序,请在正文标记之间的html页面中添加一个隐藏字段-函数将在此处存储结果:
'<input type="hidden" id="hiddendistance" value="0" />'+
最后,您的delphi代码应该类似于:
procedure TForm1.ExecuteScript(AScript: string);
begin
HTMLWindow2.execScript(AScript, 'JavaScript');
end;
procedure TForm1.btnTestDistanceClick(Sender: TObject);
const
lat1 = '47.6740243';
lng1 = '-122.1220361';
Lat2 = '34.0691975';
Lng2 = '-117.2141603';
var
s: string;
begin
s := Format('distance(%s,%s,%s,%s,%s)', [lat1, lng1, Lat2, Lng2, '"N"']);
ExecuteScript(s);
showmessage('Distance: '+GetElementValue('hiddendistance'));
end;
“我得到一个脚本错误”那么,你得到了什么错误?你的问题是什么?我得到了一个语法错误,我的问题是为什么,或者我的代码有什么错误?是的,但是读者看不到你的屏幕。您在哪里得到错误,错误消息说什么?第一个错误是N未定义,用双引号括起来。之后的下一个错误是由GrabDist()引起的。set(“dist”,dist)。您可以发布包含GrabDistswFobObject定义的html吗?始终确保发布所有相关代码。@MartynA-我添加了脚本错误供您查看。当我插入变量时,我得到了相同的javascript语法错误。但当我用你的常数时,效果很好。所以我猜我的变量输入错误了。谢谢
' function distance(lat1, lon1, lat2, lon2, unit) '+
' { '+
' var R = 6371; '+
' var dLat = deg2rad(lat2-lat1); '+
' var dLon = deg2rad(lon2-lon1); '+
' var a = '+
' Math.sin(dLat/2) * Math.sin(dLat/2) + '+
' Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * '+
' Math.sin(dLon/2) * Math.sin(dLon/2); '+
''+
' var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); '+
' var d = R * c; '+
' if (unit=="N") d /= 1.60934; '+
' document.getElementById("hiddendistance").value = d; '+
' return d; '+
'} '+
''+
' function deg2rad(deg) { '+
' return deg * (Math.PI/180) '+
' } '+
procedure TForm1.ExecuteScript(AScript: string);
begin
HTMLWindow2.execScript(AScript, 'JavaScript');
end;
procedure TForm1.btnTestDistanceClick(Sender: TObject);
const
lat1 = '47.6740243';
lng1 = '-122.1220361';
Lat2 = '34.0691975';
Lng2 = '-117.2141603';
var
s: string;
begin
s := Format('distance(%s,%s,%s,%s,%s)', [lat1, lng1, Lat2, Lng2, '"N"']);
ExecuteScript(s);
showmessage('Distance: '+GetElementValue('hiddendistance'));
end;