FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Google Maps en Embarcadero C++
Hola, estoy tratando de implementar el soporte de los mapas de Google en mi aplicación. Utilizando la API de Google genero mi HTML desde código para utilizar las funciones basicas de mostrar el mapa y centrarlo utilizando una latitud y una longitud y añadir una imagen de marca de ubicación.
Hasta ahí genial!, el problema viene cuando necesito recoger la latitud y la longitud del mapa al "clickear" en él. En Delphi hay muchos ejemplos que funcionan, pero en C++ se me hace muy complicado traducir dicho código... Encuentro estos dos ejemplos en Delphi donde muestra la manera de hacerlo: https://theroadtodelphi.com/2011/06/...a-mouse-click/ http://delphidabbler.com/tips/56 Aquí esta la función de la "chicha" que me tiene loco... Código:
procedure TFrmMain.WebBrowser1CommandStateChange(ASender: TObject; Command: Integer; Enable: WordBool); var ADocument : IHTMLDocument2; ABody : IHTMLElement2; Lat : string; Lng : string; function GetIdValue(const Id : string):string; var Tag : IHTMLElement; TagsList : IHTMLElementCollection; Index : Integer; begin Result:=''; TagsList := ABody.getElementsByTagName('input'); for Index := 0 to TagsList.length-1 do begin Tag:=TagsList.item(Index, EmptyParam) As IHTMLElement; if CompareText(Tag.id,Id)=0 then Result := Tag.getAttribute('value', 0); end; end; begin if TOleEnum(Command) <> CSC_UPDATECOMMANDS then Exit; ADocument := WebBrowser1.Document as IHTMLDocument2; if not Assigned(ADocument) then Exit; if not Supports(ADocument.body, IHTMLElement2, ABody) then exit; Lat :=GetIdValue('LatValue'); Lng :=GetIdValue('LngValue'); if (Lat<>'') and (Lng<>'') and ((Lat<>Latitude.Text) or (Lng<>Longitude.Text)) then begin Latitude.Text :=Lat; Longitude.Text:=Lng; AddLatLngToList(Lat, Lng); end; end; Código:
function GetElementById(const Doc: IDispatch; const Id: string): IDispatch; var Document: IHTMLDocument2; // IHTMLDocument2 interface of Doc Body: IHTMLElement2; // document body element Tags: IHTMLElementCollection; // all tags in document body Tag: IHTMLElement; // a tag in document body I: Integer; // loops thru tags in document body begin Result := nil; // Check for valid document: require IHTMLDocument2 interface to it if not Supports(Doc, IHTMLDocument2, Document) then raise Exception.Create('Invalid HTML document'); // Check for valid body element: require IHTMLElement2 interface to it if not Supports(Document.body, IHTMLElement2, Body) then raise Exception.Create('Can''t find <body> element'); // Get all tags in body element ('*' => any tag name) Tags := Body.getElementsByTagName('*'); // Scan through all tags in body for I := 0 to Pred(Tags.length) do begin // Get reference to a tag Tag := Tags.item(I, EmptyParam) as IHTMLElement; // Check tag's id and return it if id matches if AnsiSameText(Tag.id, Id) then begin Result := Tag; Break; end; end; end; Se trata de recoger el contenido en un TWebBrowser (en este caso un mapa de google maps cargado desde un .html que creo desde mi programa) para mostrar lo almacenado en Código:
<input type="hidden" id="LatValue" > <input type="hidden" id="LngValue" > Alquien podría indicarme como sería esa función en C? O bien donde encontrar más documentación? He terminado leyendo post en alemán y en ruso pero no consigo aclararme ! Muchas gracias por vuestro tiempo, y un saludo! Jorge. |
#2
|
||||
|
||||
Hola, prueba del siguiente modo:
(Añade las siguientes cabeceras: #include<utilcls.h> #include<mshtml.h>) Código:
void __fastcall TFrmMain::WebBrowser1CommandStateChange(TObject *ASender, int Command, WordBool Enable) { if (Command != ::CSC_UPDATECOMMANDS) return; String Lat, Lng; TComInterface<IHTMLDocument3> doc; TComInterface<IHTMLElement> tag; TVariant value; OleCheck(WebBrowser1->Document->QueryInterface<IHTMLDocument3>(&doc)); doc->getElementById(TVariant("LatValue"), &tag); if (tag) { tag->getAttribute(TVariant("value"), 0, value); Lat = value; } tag.Reset(); doc->getElementById(TVariant("LngValue"), &tag); if (tag) { tag->getAttribute(TVariant("value"), 0, value); Lng = value; } if (!Lat.IsEmpty() && !Lng.IsEmpty() && (Lat != Latitude->Text || Lng != Longitude->Text)) { Latitude->Text = Lat; Longitude->Text = Lng; AddLatLngToList(Lat, Lng); } } |
#3
|
|||
|
|||
Hola Leo! Muchísimas gracias! ahora funciona!
Por si le sirve de algo a alquien: Al cargar el mapa me he encontrado con un error de javascript, más en concreto onion.js. Leyendo me he encontrado que dicha librería utiliza funciones de JSON. Bastaría con añadir Código:
<script src="https://cdn.jsdelivr.net/json3/3.3.2/json3.js"></script> Código:
<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?sensor=false"></script> <script src="https://cdn.jsdelivr.net/json3/3.3.2/json3.js"></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); google.maps.event.addListener(map, "click", function(event) { document.getElementById("LatValue").value = event.latLng.lat(); document.getElementById("LngValue").value = event.latLng.lng(); PutMarker(document.getElementById("LatValue").value, document.getElementById("LngValue").value,"") } ); } function GotoLatLng(Lat, Lang) { var latlng = new google.maps.LatLng(Lat,Lang); map.setCenter(latlng); } 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); index= (markersArray.length % 10); if (index==0) { index=10 } icon = "http://www.google.com/mapfiles/kml/paddle/"+index+"-lv.png"; marker.setIcon(icon); } </script> </head> <body onload="initialize()"> <div id="map_canvas" style="width:100%; height:100%"></div> <div id="latlong"> <input type="hidden" id="LatValue" > <input type="hidden" id="LngValue" > </div> </body> </html> |
#4
|
|||
|
|||
Completo con lo que faltaba que es poder ejecutar funciones JavaScript y que he encontado por ahi y rula
Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { IHTMLDocument2 *doc = NULL; IHTMLWindow2 *win; if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&doc))) { HRESULT hr = doc->get_parentWindow(&win); if (SUCCEEDED(hr)) { BSTR cmd = L"ClearMarkers()"; VARIANT v; VariantInit(&v); win->execScript(cmd,NULL,&v); VariantClear(&v); win->Release(); } doc->Release(); } Código:
void __fastcall TForm1::Button2Click(TObject *Sender) { IHTMLDocument2 *doc = NULL; IHTMLWindow2 *win; if(SUCCEEDED(WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&doc))) { HRESULT hr = doc->get_parentWindow(&win); if (SUCCEEDED(hr)) { String str = String("GotoLatLng(") + Edit1->Text + "," + Edit2->Text + ")"; VARIANT v; VariantInit(&v); win->execScript( str.w_str(), NULL, &v ); VariantClear ( &v ); win->Release (); } doc->Release(); } } |
#5
|
||||
|
||||
Cita:
Código:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION Código:
SustituirPorElNombreDeTuEjecutable.exe (REG_DWORD) 11001 (valor decimal) |
#6
|
|||
|
|||
Algo había leído al respecto... hace un rato buscando he encontrado esto:
https://msdn.microsoft.com/es-es/library/cc817574.aspx Maneras de activar los modos de compatibilidad. Estoy utilizando esto: Código:
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
#7
|
||||
|
||||
Fue lo primero que probé, pero lo ignora totalmente, al menos en Windows10.
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Api de google , google maps en c++ builder 6 | JM1985 | C++ Builder | 1 | 01-04-2016 21:10:17 |
GPS y Google Maps | MAXIUM | Internet | 5 | 15-03-2011 18:15:05 |
Google Maps | madiazg | Varios | 4 | 26-10-2008 22:03:41 |
Google maps y php | halizia | PHP | 2 | 16-03-2007 17:04:49 |
Google Maps .es | Neftali [Germán.Estévez] | Noticias | 0 | 27-04-2006 13:32:54 |
|