Hace unos días, Luis María Guayán publicó el artículo Google Maps en un formulario de VFP que mostraba un ejemplo de como acceder a diferentes localizaciones en Google Maps mediante sus coordenadas terrestres
Al ver y probar el código publicado, enseguida me surgió la inquietud de adaptarlo a una búsqueda por la dirección postal en lugar de por sus coordenadas que, normalmente, no conozco.
Luis María me remitió a otro artículo Integrando VFP con Microsoft Virtual Earth que mostraba un ejemplo muy completo de como realizar búsquedas (y muchas más cosas) sobre Virtual Earth.
Como el código de Luis María era más sencillo (y se ajustaba mejor a mis necesidades), decidí revisar la API de Google Maps para implementar la búsqueda por la dirección postal.
Antes de pasar al código, debo hacer varias aclaraciones sobre éste:
En primer lugar, este código puede ser ejecutado con do "MiPrograma.prg" con lo que, al abrirse el formulario, podremos introducir la dirección a buscar, o bien podremos ejecutarlo con do "MiPrograma.prg" with "direccion a buscar", con lo que, al abrirse el formulario, se realizará la búsqueda de la dirección introducida directamente.
En segundo lugar, vereis que al ejecutar el código, el formulario abierto no tiene barra de título, pero esto no significa que no pueda ser movido. Sólo teneis que pinchar sobre una zona libre del formulario y arrastrar con el ratón. El truco reside en dos llamadas a la API en el Load del formulario y el evento MouseDown de este.
También, al hacer las diferentes pruebas, me encontré con que las búsquedas de direcciones que contenían "eñes" no se realizaban correctamente pero, si las sustituía por "enes", la búsqueda era correcta. Ese es el motivo de haber utilizado la función strtran, sólo a efectos de búsqueda.
Por último, mi agradecimiento a todas las personas que en el foro contestaron a mis dudas, y en especial a Luis María Guayán, sin cuya colaboración y apoyo, este mi primer artículo, no habría visto nunca la luz.
Y ahora, el código completo de este ejemplo es el siguiente:
Do MiPrograma With "Puerta de Alcala, Madrid, España"
*
* MiPrograma.prg
*
Procedure MiPrograma
Lparameters MiAddress
Public oMiForm
oMiForm = Createobject("MiForm", MiAddress)
oMiForm.Show
Return
Endproc
Define Class MiForm As Form
Height = 560
Width = 625
AutoCenter = .T.
Caption = "Ejemplo con Google Maps"
Name = "MiForm"
SetPoint = ""
SetDecimals = 2
ShowWindow = 0
TitleBar = 0
BorderStyle = 2
Closable = .F.
MaxButton = .F.
MinButton = .F.
Add Object Descrip As TextBox With ;
HEIGHT = 24, Left = 12, Top = 12, Width = 330, ;
STYLE = 0, Name = "Descrip", SelectOnEntry = .T., Enabled = .T.
Add Object cmdMostrar As CommandButton With ;
TOP = 10, Left = 350, Height = 27, Width = 100, ;
CAPTION = "Mostrar mapa", Name = "cmdMostrar"
Add Object cmdCerrar As CommandButton With ;
TOP = 10, Left = 573, Height = 27, Width = 40, ;
CAPTION = "Salir", Name = "cmdCerrar"
Add Object oleIE As OleControl With ;
TOP = 48, Left = 12, Height = 500, Width = 600, ;
NAME = "oleIE", OleClass = "Shell.Explorer.2"
Procedure Load
Sys(2333,1)
This.SetPoint = Set("Point")
This.SetDecimals = Set("Decimals")
Set Point To .
Set Decimals To 8
Set Safety Off
Declare Integer ReleaseCapture In WIN32API
Declare Integer SendMessage In WIN32API Integer, Integer, Integer, Integer
Endproc
Procedure Init(MiAddress)
If Type('miaddress')<>'C'
This.Descrip.Value=''
Else
This.Descrip.Value=miaddress
Thisform.cmdMostrar.Click()
Endif
Endproc
Procedure MouseDown
Lparameters nButton, nShift, nXCoord, nYCoord
Local lnHandle
If nButton = 1
ReleaseCapture()
SendMessage(This.HWnd, 0x112, 0xF012,0)
Endif
Endproc
Procedure cmdCerrar.Click
Set Point To (Thisform.SetPoint)
Set Decimals To (Thisform.SetDecimals)
Thisform.Release
Endproc
Procedure cmdMostrar.Click
If Empty(Alltrim(Thisform.Descrip.Value ))
Thisform.Descrip.SetFocus()
Return
Else
*
lcClave = "http://maps.google.es/maps?file=api&v=2.x&" + ;
"key=ABQIAAAAtOjLpIVcO8im8KJFR8pcMhQjskl1-YgiA" + ;
"_BGX2yRrf7htVrbmBTWZt39_v1rJ4xxwZZCEomegYBo1w"
TEXT TO lcHtml NOSHOW TEXTMERGE
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Busqueda en Google Maps</title>
<script src="<<lcClave>>"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var map = null
var geocoder = null
var address = "<<Strtran(ALLTRIM(ThisForm.Descrip.Value),'ñ','n',1,10,1)>>"
function load()
{ if (GBrowserIsCompatible())
{ map = new GMap2(document.getElementById("map"),'G_SATELLITE_MAP');
map.addControl(new GLargeMapControl());
map.addControl (new GMapTypeControl());
map.addControl(new GOverviewMapControl());
geocoder = new GClientGeocoder();
if (geocoder) {
geocoder.getLatLng(address,
function(point)
{ if (!point)
{ alert("No Encontrado");
}
else
{ map.setCenter(point, 20);
map.setMapType(G_NORMAL_MAP);
var marker = new GMarker(point);
map.addOverlay(marker);
}
}
);
}
}
}
//]]>
</script>
</head>
<body scroll="no" bgcolor="#CCCCCC" topmargin="0" leftmargin="0" onload="load()" onunload="GUnload()">
<div id="map" style="width: 600px; height: 500px"></div>
</body>
</html>
ENDTEXT
*
Strtofile(lcHtml,"MiHtml.htm")
Thisform.oleIE.Navigate2(Fullpath("MiHtml.htm"))
Endif
Endproc
Enddefine
Espero volver por aquí.
Jose Antonio Blasco, Zaragoza, España
Hola veo, que tomas datos desde el formulario haciendo "<>"
ResponderBorrarComo hago para escribir en ese mismo TEXTBOX o en otro?
muchas gracias!
Mi buen colega, a mi me bota un error de script, que podrá ser.
ResponderBorrarHola harold.
BorrarTiene que ver con el OLE utilizado y la ejecución de los .js...
Asegurate de estar usando le libreria "_webview.vcx", clase _webbrowser4
Funciona a la perfección. Yo lo tengo en mi aplicación :)