(Español) GMLib – Google Maps Library

 

Sorry, this entry is only available in European Spanish.

  365 Responses to “(Español) GMLib – Google Maps Library”

  1. Hola que tal, excelente tu pagina, apenas he dado con ella y se me hace muy interesante, estoy probando tus componentes para Google Maps y despues de jugar un poco con los ejemplos que vienen con las librerias, me puse a checar el que permite insertar etiquetas en el mapa “GMMarker” y quisiera saber si me puedes indicar como puedo hacer para insertar un marcador por codigo, lo que pasa es que si deseo poner marcadores desde el Componente con el “Marker Editor” me funciona excelente.

    Pero en mi caso yo lo quiero utilizar con una base de datos, tengo mis campos Longitud, Latitud, Titulo y HTMLContent y me gustaria saber como agregarle las cordenas que filtro para que me las muestre segun las que cumplan con la condicion que seleccione supongo que sera algo como

    Procedure TForm1.CargarMarcadores;
    var
    i: Integer;
    begin
    for i:0 to Table1.RecordCount do
    GMMarker1.VisualObjects //// Agregarle la Longitud, Latitud conforme encuentra los registros
    ….

    He intentado con la ayuda que da el propio delphi cuando escribes y te muestra la lista de opciones pero no sabria cual es la que me permite agregarlo manualmente, te agradeceria mucho me pudieras comentar cual seria esta forma 🙂

    Saludos

    P.D. Muchas gracias por compartir tu codigo es muy util y educativo

    • Buenas,

      Ante todo gracias por probar los componentes y hacer de “conejillo de indias” dada la “juventud” de los mismos (no son ni beta jejejeje)

      Lo que quieres es sencillo de hacer. Desde la clase TGMMarker tienes un método para ello y podría ser algo así

      procedure TForm1.bAddMarkerClick(Sender: TObject);
      var
        Marker: TMarker;
      begin
        // con esta simple linea lo tienes añadido
        Marker := GMMarker1.Add;
        // a partir de aquí ya puedes informar las propiedades a tu gusto
        Marker.Position.Lat := 10.543345;
        Marker.Position.Lng := -4.344567;
        Marker.Title := 'título para el marcador';
        .....
      end;
      

      Si sólo le vas a dar valor a la lat/lon y título, puedes hacerlo directamente desde el método Add.

      procedure TForm1.bAddMarkerClick(Sender: TObject);
      var
        Marker: TMarker;
      begin
        // con esta simple linea lo tienes añadido
        Marker := GMMarker1.Add(10.543345, -4.344567, 'título para el marcador');
      end;
      

      Espero te sea de ayuda

      Nos leemos
      cadetill

      • Cadetill muchas gracias por tu respuesta, me ayudo mucho pero aun sigo con el detalle de que si tengo yo las ubicaciones en mi base de datos (restaurantes, cines, parques, etc) y por ejemplo filtro “restaurantes” el resultado me muestra en un DBGrid las columnas Latitud, Longitud y Titulo o Nombre si lo hago uno por uno tocandolo no hay problema, pero si quiero que me carge el X numero de restaurantes que tengo en mi base y que cumplen el criterio de mi consulta que se muestran en el dbgrid se traba mi aplicacion.

        Mi aplicacion es sencilla y utilizo mysql donde almaceno direcciones y lugares y ahora que veo la posibilidad de ubicarlos en un mapa me parecio muy buena idea

        Mi consulta es basicamente


        SELECT
        MainDB.ID,
        MainDB.LUGAR,
        MainDB.LATITUD,
        MainDB.LONGITUD
        FROM
        MainDB
        WHERE
        MainDB.LUGAR = 'RESTAURANT'

        Y ya que me los muestra en la DBGrid los intento leer de la siguiente manera


        procedure TForm1.Button2Click(Sender: TObject);
        var
        Marker: TMarker;
        Lat, Long: Real;
        begin
        Lat:= Table1.FieldbyName('Latitud').ASFloat;
        Long:= Table1.FieldbyName('Longitud').ASFloat;
        UniTable1.First;
        While Not UniTable1.Eof do
        Marker := GMMarker1.Add(Lat , Long, 'título para el marcador');
        Unitable1.Next;
        end;

        No se si haya una mejor forma de hacerlo directo desde una consulta pero si es asi no sabria por donde leer los datos para que los carge directos al mapa mientras realiza la consulta, por eso ya que tengo los datos en la DbGrid los intento cargar uno por uno 🙂

        Cualquier sugerencia se agradece 😀

        • Por cierto una observación igual no se si sea relevante pero a mi si me parece curioso y creo que por eso no me carga las coordenadas aunque se las ponga manuales, yo me encuentro en México y aquí el símbolo decimal es el “.” y veo que en España es “,” de hecho cuando compilo tus ejemplos que incluyes e intento cargar las coordenadas que vienen de ejemplo me dice que hay un error y para que me funcione lo tengo que poner con “.” 🙂 saludos

          —————————
          Gmmarker_demo
          —————————
          ‘41,380908’ is not a valid floating point value.

        • Buenas

          La forma en que cargas los marcadores es la correcta. No hay otra manera que hacer el bucle. Aun no hay un “TDBMarker” jejejeje Quizás en un futuro 😉

          Sólo un comentario. Si no vas a usar el TMarker creado, puedes obviar la variable 😉

          En cuanto al tema del separador decimal, pues es cierto, la demo está pensada para la gente que use como separador decimal la coma, no el punto. No obstante, eso sólo afecta a la demo, no al componente, ¿correcto?

          Nos leemos
          cadetill

          • Muchas gracias mi estimado Cadetill, por alguna razon he notado que cuando cargo alguna corrdinada me sale un error que en estos momentos no tengo el dato, busque en google y corresponde si mal no recuerdo al mismo script de carga de google maps.

            Pues de la forma en que cargo los marcadores aunque algo rudimentaria 😀 por no decir mas jajajaja me esta dando errores, ya que cada que ejecuto el codigo el programa se traba y tengo que cerrarlo, pero si lo ejecuto

            ( disculpame si no queda las etiquetas de codigo porque intente ponerselas pero no me salio 😀 )


            procedure TForm1.Button2Click(Sender: TObject);
            var
            Marker: TMarker;
            Lat, Long: Real;
            begin
            Lat:= Table1.FieldbyName('Latitud').ASFloat;
            Long:= Table1.FieldbyName('Longitud').ASFloat;
            Marker := GMMarker1.Add(Lat , Long, 'título para el marcador');
            Unitable1.Next;
            end;

            Por cada ves que oprimo el boton me carga perfectamente los marcadores claro que no es lo ideal 😀 intentare probar de otras formas para ver porque se bloquea mi programa.

            Por cierto lo de un TDBMarker no estaria nada descabellado 😉

          • Pd. En efecto lo de la coma por punto solo afecta la demo, el componente funciona excelente 😀

    • hola, bueno estoy tratando de hacer algo parecido a tu programa y al principio me tope con que esta version no es compatible con firemonkey x3. ahora bien como hace para capturar en tu base de datos la logitud y latitud?

      • Buenas

        Sólo decirte que los componentes sí son compatibles con FMX. Lo que pasa es que al no haber un navegador compatible con esta versión de Delphi, no tiene sentido instalar los componentes en FMX 😉

        Nos leemos

  2. Buen inicio de semana Cadetill, pues bien a base de ensayo y error ya pude hacer que de manera “automatica” me carge los marcadores, al principio me costo trabajo debido a que me faltaba una line a que hacia referencia a que utilizaria la Tabla, por eso se bloqueaba, despues el problema surgio porque queria leer directamente de los DBEdits, y solo me cargaba el primer marcador, asi que lo que se me ocurrio es que al recorrer los registros encontrados me leyera el valor directo de cada “campo” de mi base de datos, y quedo de la siguiente forma por si alguien mas le llega a interesar:

    procedure TForm1.Button2Click(Sender: TObject);
    var
    Marker: TMarker;
    begin
    with Form1.Table1 do begin
    First;
    while not eof do begin
    Marker := GMMarker1.Add(Table1.FieldByName('Latitud').AsFloat , Table1.FieldByName('Longitud').AsFloat, Table1.FieldByName('Lugar').AsString);
    Next;
    end;
    end;
    end;

  3. Nuevamente saludando Cadetill, mira intente buscar algún procedimiento desde tu componente para quitar las etiquetas, pero no lo encontre 😀

    Asi que me invente un pequeño procedimiento

    procedure TForm1.LimpiarMarcadores;
    var
    i: Integer;
    begin
    for I := 1 to Table1.RecordCount do
    GMMarker1.Delete(0);
    end;

    El unico detalle es que debe de haber marcadores si no marcara error “List index out of bounds (0)” lo cual es logico considerando que quiero borrar y no hay nada que borrar 🙂

    Otra pregunta, intento cargar desde mi FormShow

    procedure TForm1.FormShow(Sender: TObject);
    begin
    GMMap1.RequiredProp.Center.Lat := Latitud;
    GMMap1.RequiredProp.Center.Lng := Longitud;
    GMMap1.RequiredProp.Zoom := 8;
    GMMap1.DoMap;
    end;

    Pero me devuelve el siguiente error: “Página inicial aun no cargada.”

    Ese mismo codigo lo pongo en un boton y me funciona perfectamente.

    Hay algun metodo o forma o estoy omitiendo algo que evita que pueda cargar la pagina de forma automatica??

    Por cierto de verdad muchas gracias por tu paciencia 😀 y comentarios 😀

    • Buenas,

      Todo componente descendiente de TGMLinkedComponent (léase TGMMarker, TGMInfoWindows,….) tienen el método Clear, con lo que con un simple GMMarker1.Clear, borras los marcadores.

      Con un bucle también podrías hacerlo, pero en lugar de basarte en la tabla, recorrer directamente los marcadores que tienes

      for i := GMMarker1.VisualObjects.Count – 1 downto 0 do GMMarker1.Delete(i);

      Respecto al otro problema, como digo en la ayuda, lo primero que se tiene que hacer es activar el TGMMap (Active := true)para cargar el HTML básico que se necesita para operar con el componente. Esto dispara el evento AfterPageLoaded con el parámetro First a true, que puedes usar para disparar el DoMap o habilitar el botón que lo muestro o activar un TTimer que al cabo de x milisegondos se dispare y realice el DoMap,….

      Espero te ayude y gracias a ti por probarlo

      Nos leemos
      cadetill

  4. Excelente!!! trabajo. Los voy a probar.
    Saludos

  5. Estimado Cadetill gracias por tus comentarios pero no se si sea solo a mi pero el metodo Clear, me da error al compilar, lo pongo de la misma manera “GMMarker1.Clear” y no me permite continuar incluso cuando lo escribo manualmente, despues del punto en la lista de funciones y procedimientos no me aparece la funcion o metodo CLEAR

    No se si lo puedas checar para ver si en tu delphi si funciona, saludos

    • jejeje, perdón, no me acordaba que es un método que he añadido para la próxima versión de los componentes que no tardará en salir (y que contendrá el objeto TGMPolyline) 🙂

      Si “tienes prisa” puedes usar el bucle que te comentaba y, cuando suba la nueva versión, pues ya lo sustituyes por el nuevo método 🙂

      Nos leemos
      cadetill

      • 😀 Ya decia yo que no me aparecia, por mientras lo estoy dejando como te mencione, porque el bucle que me indicas por alguna razon no me lo compila asi con DownTO pero igual es por algun detalle lo voy a checar, ya que si la nueva version contiene CLEAN estaria excelente y mas limpio, porque de mi forma noto que de repente me borra todos los marcadores pero despues cuando cargo otros me deja los anteriores, supongo porque como me djiste lo baso en mis registros encontrados no en los marcadore.

        En horabuena por la siguiente version y esperandola para probarla 😀 Saludos

  6. Saludos Cadetill aqui de nuevo saludando 😀

    Un comentario o detalle que he notado no si sea por la cuestion de precision del componente o por alguna otra cuestion, ya que solo en mis ratos libres estoy trabajando en mi programita 😀

    Lo que pasa es que cuando copio las latitudes y longitudes desde los mapas de google con el explorador o firefox me las muestra correctamente con el componente, pero si las copio de google maps la aplicacion, las cordenadas me aparecen diferentes incluso si las ocupo en las del explorador me da otra ubicacion, no es algo tan malo ya que en mapas cargados desde la pagina las ubicaciones me dan exactas en donde selecciono, pero me parece curiosa la diferencia, saludos

    • Buenas,

      No entiendo lo que quieres decir. ¿Puedes ponerme un ejemplo? Por que…. no será la precisión que puedes especificar en el componentes TGMMaps, ¿no?

      • Perdon por contestar hasta ahorita pero he estado con mucho trabajo y no he podido checarlo pero espero en estos dias te checo bien en que parte es si en la precision o en los mapas que maneja google con algun ejemplo 😀

        Mientras tanto un saludo Cadetill

  7. Llevaba tiempo buscando una librería que me permitiese trabajar en Delphi 5.. y la encontré !!

    He conseguido compilar GMLib 0.1.1 en Delphi 5 (eliminando las llamadas a ShowCollectionEditor y retocando ligeros detalles) sin errores, así como las Demos.

    Sólo tengo una pequeña sugerencia (por el uso que quiero darle) y es que (aun, espero) no permite elegir el icono de los Marcadores.

    De todas formas, funciona genial, gran trabajo !!

    • Hola Fernando,

      Me alegra saber que has podido compilar sin muchos problemas con una versión tan vieja de Delphi 🙂 La verdad es que no me pensaba que hubiera gente que aun programara en versiones anteriores a Delphi 6 jejejeje Por casa debo de tener alguna versión de Delphi 3, 4 y 5. Miraré de instalarlas a ver si para la próxima versión puedo hacer que se compile también en estas versiones de Delphi

      Gracias por probar los componentes

      Nos leemos
      cadetill

  8. Hola a todos:
    Llevo tiempo manejando una página con planos de Google Maps que desarrollo en modo artesanal (o sea, con mucho trabajo) y me gustaría que la página que mostrara resultados (marks) se generara dinamicamente. estoy buscando a alguien que me pueda hacer el trabajo. O sea, la base de datos con los datos que necesito pasar al mapa, el interface de entrada de información a dicha base de datos y los códigos PHP que generen el plano a partir de los datos de búsqueda introducidos por el visitante de la página. ¿Sabeis de alguien que me lo pudiera hacer?

  9. Hola, intente instalarlo en Delphi XE, pero sin éxito, veo que los paquetes de los componentes existen actualmente para D6, D7, D2007, D2010, DXE2 pero no para DXE, tienes algún tip para esta instalación?

    • Buenas Erasmo

      No tengo el XE para poder hacer el paquete ni probarlo, pero vamos, imagino que el paquete de D2010 o DXE2 debería de servirte y compilar en XE. Si no te compila, dime qué errores te da para poder ayudarte a compilarlo

      Nos leemos

      • Hola cadetill,

        De antemano gracias!, te comento que efectivamente, logre compilar y registrar los componentes en DelphiXE con el paquete D2010 realizando estos cambios en en la sentencia
        {$IF CompilerVersion < 22} la cambie por {$IF CompilerVersion < 23}.

        Ahora! realizando el hola mundo con estos componentes, no logro que en los eventos me de las coordenadas (LatLng: TLatLng) estas siempre me las da en cero. por ejemplo, en el evento GMMap1CenterChanged(Sender: TObject; LatLng: TLatLng), siempre que se dispara, LatLng siempre bienen en Cero; incluso en los demos en el log de eventos, me vienen en cero. Sabes si es algo que tenga que ver con el lenguaje, soy de Mexico.

        • Disculpas, el cambio que te mencione anteriormente lo realice en GMMap.pas y el mensaje de error fue:

          [DCC Error] GMMap.pas(1621): E2009 Incompatible types: ‘Parameter lists differ’

          nos leemos.

          • Ya encontré cual es el detalle… y efectivamente tenia que ver con el regionalismo, comente la linea linea 164 del WebControl.pas, la funcion quedo de la siguiente manera:


            function TWebControl.GetFloatField(const aFormName, aField: string;
            DefaultValue: Real): Real;
            var
            Strg: string;
            Val: Extended;
            begin
            Result := DefaultValue;

            WebFormNames;

            if Forms.IndexOf(aFormName) = -1 then Exit;

            WebFormFields(aFormName);

            if Fields.IndexOf(aField) -1 then
            begin
            Strg := Trim(WebFormFieldValue(Forms.IndexOf(aFormName), aField));
            //Strg := StringReplace(Strg, '.', ',', [rfReplaceAll]);
            if (Strg '') and TryStrToFloat(Strg, Val) then
            Result := Val;
            end;
            end;

          • Hola Erasmo

            Me alegra que hayas podido instalar los componentes. Miraré de hacer el cambio que mencionas en el código para poder instalarlo en XE sin problemas 🙂

            Con respecto al problema que has tenido con el LatLng, no termino de entender por qué no te funciona. Se supone que las funciones de Google necesitan un numérico con un separador de decimales de punto. La función esa lo único que hace es eso, reemplazar las comas (separador decimal usado en España) por puntos (separador decimal americano y, por ende, usado por Google).

            Intentaré investigar un poco el tema. Si descubres algo más, te estaré agradecido si lo comentas

            Nos leemos

          • Buenas,

            Instalando la ultima actualización me di cuanta que las coordenadas me las sigue dando en Cero, entonces regrese a la linea 164 de WebControl.pas, analice los comentarios en donde me dices lo que hace esa linea, remplazar el punto por la coma

            Strg := StringReplace(Strg, ‘,’, ‘.’, [rfReplaceAll]);

            esto es valido en tu región, en donde se separa los decimales con coma, pero en México no funciona,

            Coloque una validación, que solo se ejecute esa linea mientras exista un separador decimal con coma.

            if DecimalSeparator = ‘,’ then Strg := StringReplace(Strg, ‘.’, ‘,’, [rfReplaceAll]);

            Me dices que te parece.

            Saludos.

          • Buenas Erasmo,

            Pues me parece genial, simple y sencillo. En la próxima versión ya aparecerá el cambio (ya lo he realizado)

            Gracias 😉

  10. Excelente trabajo. Apenas he encontrado tus componentes y estoy experimentando con ellos. Al principio me encontré igualmente con el problema de los separadores decimales y de millares como Erasmo con la configuración regional de México.

    Se me ha ocurrido, no hay una manera de “seleccionar” un área del mapa con el ratón y que esa área sea un cuadrado traslucido mientras se este seleccionando? O al menos que se note con un rectángulo de selección.

    Gracias nuevamente

    • Buenas Ricardo

      Muchas gracias por aunque sea probarlos 🙂

      Respecto a lo que me comentas, no termino de entender lo que quieres. ¿Puedes explicarte algo mejor?

      • En esencia, es seleccionar un área del mapa, tipo selección de Autocad, sólo eso. Ya obtuve las coordenadas de la selección usando el método OnClick del GMMap pero me falta lo “visual” para indicar que se está seleccionando. Tal vez ya esté implementado en alguna de las funciones de Java pero desconozco la API de Google Maps. Gracias

        • Buenas,

          Lo que no entiendo es eso de la selección. Es decir, entiendo que quieres que aparezca un rectángulo mientras estás seleccionando un área del mapa, lo que no veo es la utilidad o qué quieres conseguir seleccionando una zona del mapa. Por otro lado, desde el API de Google Maps no hay ninguna opción que lo permita, se tendría que implementar mediante JavaScript de alguna manera. También se tendría que tener en cuenta que el mapa no se pudiera “mover” con el ratón (propiedad Draggable).

          Nos leemos
          cadetill

          • Ya he pensado en esos detalles y hasta este momento debido a mis escasos conocimientos de la manipulación del TWebBrowser / GoogleMaps API / Java son casi insalvables para mí 🙁

            Para efectos de pruebas solamente uso un clic para definir la primera esquina y un segundo clic para la definir la segunda, esto es para hacer zoom a la zona seleccionada de manera mas rápida y no dar clic varias veces en el control o usar la rueda del ratón repetidamente, un zoom rápido a una zona específica del mapa.

  11. Un saludo de nuevo. He descubierto otra falla, no sé si alguien más lo ha hecho, he aquí el escenario:

    De acuerdo a las instrucciones de http://code.google.com/p/vcl-styles-utils/ o http://theroadtodelphi.wordpress.com/2012/03/20/delphi-vcl-styles-and-twebbrowser-source-code-released/ para sustituir el TWebBrowser por un TVclStylesWebBrowser con una clase superpuesta y dar soporte completo de VCL Styles, ya no aparece nada de mapas en el browser asociado al GMMap.

    Reportaré de igual manera el problema al desarrollador de vcl-styles-utils

  12. Buenas cadetill,

    Trabajando con los markers, tengo la necesidad de relacionarlo con otro objeto, en mi caso específicamente con un registro de una consulta sql, veo que en la mayoría de componentes que manejan TColecction tienen una propiedad que se llama object, en la cual puedes asignar cualquier tipo de objeto y así también un propiedad Tag.

    Estaria muy bien también contar con estas propiedades en lo TMarker.

    ¿Que te parece la idea?

    Nos leemos.

    • Buenas Erasmo

      TCollectionItem no posee ninguna de estas propiedades que comentas. No obstante es factible y fácil el ponerlas. Si realmente encuentras que es interesante, no hay problema en incorporarlas 😉

      Nos leemos

      • Hola,

        Buen inicio de semana cadetill…

        Efectivamente me parece interesante la propuesta, esto con el objetivo de darle una mayor capacidad de implementación…. claro también me gusta mucho la idea de TDBMarkar.

        Por cierto, ¿como le hago para postear código formateado delphi?, lo intente con etiquetas codigo pero no se nota visualmente.

        Saludos!

  13. Buenas cadetill,

    Ahora con una consulta, para implementar iconos personalizados, en que lugar debo de colocar la lista de iconos disponibles.

    Nos leemos.

  14. Buenos dias Cadetill:
    Enhorabuena por tu trabajo, y gracias por compartirlo.

    He estado haciendo pruebas con tu codigo y me parece magnifico. Se me ocurren algunas sugerencias como el ya comentado TDBMarker, y una utilidad que me parece tambien interesante y es obtener las coordenadas de un lugar a partir de la direccion tal y como lo hace Google Maps. Hasta ahora yo las consigo pasando la direcccion a traves de la url que usa Google Maps y extrayendo de la respuesta que devuelve googlemap los datos que me interesan. Supongo que habra mil formas mejores de hacerlo pero ….
    URLDownloadToFile(nil, PChar('http://maps.google.com/maps?output=kml&q='+direccion) ...

    • Buenas Jesús

      Antetodo gracias por probar los componentes. Con respecto a lo que comentas, efectivamente tengo pensado hacer un componente para pasar de una dirección a coordenadas. De hecho aquí en mi blog ya he hablado de ese tema y sería “sólo” pasar ese código a componente. Eso se llama geocodificación y, si te pasas por esta página (http://www.cadetill.com/?page_id=6) en el apartado de Google Maps puede ver los 4 primero artículos que hablo sobre ello.

      Más o menos mi “roadmap” es terminar con las figuras y luego ponerme con los servicios que ofrece Google Maps como la geocodificación 🙂

      Nos leemos
      cadetill

  15. Very usefull and intuitive component, i hope that this project will grow up strong!

  16. very nice components, i have been trying them and come across an issue when use the onclick for the GMmap component always returned 0 for both the Lat and Lng.

    Am i doing something wrong?

    I also noticed that the demos also do this.

    • Hi Shaun

      Before all, thanks for test the componentes.

      Concerning your problem, I have test it and OnClick event return the correct Lat/Lng. Is possible that the problem is the regional configuration. Try to change your regional configuration (, for decimal separator) and say me if this is the problem.

      Thanks
      cadetill

      • i can confirm that after changing my decimal symbol from . to , i now get the Lat/Lng values in the onclick event.

        • Ok, I will search why this and I will try to fix in the next version 🙂

          Thanks

          • Hi

            I will keep a look out for the update

            Just to let you now i am using these components in c++ Builder XE2 Update 4 and so far that is the only issue i have come across,

            is there any way to change the marker icon, also are there any plans to add Geocoding/Geolocation components

          • Hi Shaun

            Is perfect that you use this components in BC++ XE2 🙂

            At the moment you can’t change the marker icon. In the next revision perhaps is posible.

            My “roadmap” is about this: first, finish with rectangle and cercle and after, do components for the services like geocoding. And by the way, improve the existing components with new features

            Thanks again

            PS: I will try to translate this page to english in the futur 🙂

  17. […] Tienen muy buena pinta. Podéis revisar el diagrama completo de la estructura de clases aquí, y la descripción de todas las clases en la siguiente página. […]

  18. Hi,

    I just want to thank you for sharing these components.
    You did a great work and I’m looking forward for your next version….

    Best regard,

    SW

  19. […] ha visto la luz la siguiente versión de los componentes de Cadetill para trabajar con Google Maps. La librería GMLib; En este caso la versión 0.1.5a. Añaden bastantes correcciones y nuevas funcionalidades respecto […]

  20. Buenas tardes:

    Veo que los componentes siguen evolucionando. Enhorabuena por tu magnifico tranajo y por compartirlo con los novatillos en delphi. Seria interesante poder extraer de TAddressComponent o de alguna manera partes de esa direccion completa, por ejemplo, el Codigo Postal

    Un saludo y gracias por compartir tu trabajp

    • Hola Jesus

      Imagino que te referirás al componente TGMGeoCode, verdad? Una geocodificación puede dar cero o varios resultados. Cuando se produce al menos 1 resultado, éste (o éstos en el caso de que sean varios) se guardan en el array GeoResult del TGMGeoCode. Cada posición del array GeoResult contiene un objeto de la clase TGeoResult. Estos objetos TGeoResult tienen una propiedad, la AddrCompList de la clase TAddressComponentsList que, como podrás imaginar por la coletilla de “List”, es una colección de TAddressComponent. Pues bien, esta lista de TAddressComponent lo que contiene es una “fracción” de la dirección geocodificada. Por ejemplo, si geocodifico “C/ reial 60, tarragona” obtendré 7 TAddressComponent y uno de ellos es el código postal. Así pues, sólo tienes que recorrer esta lista y buscar el tipo “postal_code” (en la propiedad AddrCompTypeList del TAddressComponent).

      Te invito a que hagas la prueba de una geocodificación en la MegaDemo que se incluye junto a los componentes y compruebes lo que te comento.

      Saludos y gracias
      cadetill

  21. Felicitaciones amigo Cadetill,
    También desde Argentina estamos probando tu componente.

    Que hay en cuánto a la generación de Rutas de Viaje?

    Me refiero a si es posible, tal cual lo hace la web de GMaps, poner una direccion de partida y un destino para que trace el recorrido utilizando las vías existentes y sus sentidos de dirección habilitados. para la circulación…

    No hablar de si es posible crear una ruta al estilo “Viajante de comercio” ( TSP, Travelling Salesman Problem) con destinos concatenados.

    Abrazo cordial,
    YAKO

    • Hola YAKO

      Antetodo gracias por probar la GMLib 🙂

      Referente a la pregunta, es precisamente en lo que estoy trabajando en estos momentos, en el servicio de direccionamiento de Google Maps. Ya no queda mucho para que esté terminado, así que imagino que en breve podré sacar una nueva versión con este componente (y otras mejoras que he ido haciendo desde que cerré la versión 0.1.5).

      Saludos
      cadetill

  22. Buenos dias:

    Gracias de nuevo por tu esfuerzo y por compartirlo….Animo y ahora que casi lo tienes terminado :P…. a ver si le metes mano al API de Google Calendar. Seria la caña manejar el Calendar de Google desde Delphi

    Saludos y gracias de nuevo

  23. Hola cadetill ! Exelente trabajo, Felicitaciones

    Tengo problemas con el componente GMPolyline1.
    Creo un polyline con la interfaz grafica.

    Hago un boton con :
    GMPolyline1[0].AddLinePoint(20, -99);
    GMPolyline1[0].AddLinePoint(21, -100);

    Si no creo antes un LinePoint en la interfez graphica, me saca un msg de error.
    Entonces agrege un LinePoint en la interfaz graphica y agrege al boton:
    GMPolyline1[0].DeleteLinePoint(0);

    Si hago con otro boton: GMPolyline1[0].ClearLinePoints; (ahi todo muy bien, la linea desaparece)
    Pero si vuelvo a oprimir el boton de antes para crear una linea, el delphi no esta feliz y me dice “este objeto no tiene relacion en javacript”

    Tambien si hago un loop para poner muchos puntos (1000 por ejemplo), se tarda mucho para aparecer.
    Ahi creo tiene que ver con el autoUpdate. Debo desabilitar el auto update y autoupdatepath y poner depues del loop un GMPolyline1[0].Setpath ?

    Seguro hay algo que hago mal 🙁
    Muchas gracias y Saludos !

    • Hola cephi

      Antetodo gracias por usar los componentes.

      Referente a la primera pregunta, es cierto, es un bug de los componentes que tengo localizado y que será corregido en la próxima versión.
      Y con lo que respecta a la segunda pregunta, pues la verdad es que no he probado a crear un polyline con tantos puntos, por lo que no podría decirte. En cuanto vuelva de vacaciones miro de hacer alguna prueba a ver 😉

      Nos leemos

  24. hi cadetill,

    thanks for the component it sure help me a lot after you help me back then i need to ask one more dumb question. how could i create a polygon at runtime i have two seperate tstrings which contains long and lat respectively. i cannot see how you do it in your demo. thanks again

    • Hi Charlie

      You can add a TPolyline with Add method of TGMPolyline, and you can add TLinePoint with AddLinePoint method of TPolyline, BUT at the moment TPolyline have a bug, and you have an error if you don’t define at design time minimum one TPoliLine. To the next version this bug will be fixed

      Regards

      • hi cadetill,

        can you set me a small sample? i was again getting confused? thanks!!! and will wait for your update i just want to try it out. i can actually did use every component you made and was great so far except this one hehehe!! please provide me a sample? just a simple procedure for it. thanks again

        • Yes, no problem, this is an example (but remember, this not work correctly until the next version)

          procedure TForm1.Button1Click(Sender: TObject);
          var
            Polyline: TPolyline;
          begin
            // create a TPolyline
            Polyline := GMPolyline1.Add;
            // set properties
            Polyline.Editable := True;
            Polyline.StrokeColor := clRed;
            Polyline.StrokeOpacity := 0.5;
          
            // create TLinePoint
            Polyline.AddLinePoint(41.2254, 2.22354);
            Polyline.AddLinePoint(41.2000, 2.22354);
            Polyline.AddLinePoint(41.3654, 2.23344);
            Polyline.AddLinePoint(41.4566, 2.23454);
          end;
          
          • Hi Cadetill,

            Thanks For The Sample, So That’s How It Was, I Just Thought The Linepoint has to be assigned too. thanks for the help. will wait for your next awesome version… getting too excited already.. thanks again

  25. Hola, estoy probando tus libreririas y me ha surgido una pregunta referente a si hay alguna forma de limitar la region del mapa que yo quiero ver solamente. Ej. enviarle la coordenadas x1,y1,x2,y2.

    Nada en espera de tu respuestas.

    Gracias por estos componentes.

    • Buenas Luis

      Ante todo gracias por probar los componentes.

      Respecto a la duda, si quieres que tu mapa mantenga unos límites (bounds) tienes que retocar 3 cosas del mapa

      1. quitarle el control de zoom (propiedad VisualProp.ZoomCtrl.Show
      2. que no pueda moverse (propiedad NonVisualProp.Options.Draggable)
      3. que no pueda hacerse dobleclick (propiedad NonVisualProp.Options.DisableDoubleClickZoom)

      Si los límites son conocidos, puedes usar el método LatLngBoundsSetBounds de TGMMap para establecerlos.

      Espero sea lo que quieres

      Nos leemos

      • Gracias por tu repuesta, lo probare en el día de hoy, y te hago saber.

        Aparte de todo, déjame felicitarte por estas librerías, son un gran aporte.

        Los frutos vendrán muy pronto.

        Gracias.

  26. Hola, estoy intentando obtener la ubicación de unas coordenadas (lat, lng) y cuando invoco el metodo de GMGeoCode1.Geocode(lat, lng), este me trae el tres resultado y por ende me pinta tres marker en el mapa, no se supone que debe traer solamente un solo resultado.

    La idea es enviarle las coordenada y este me devuerva los datos de esa coordenada.

    Nada en espera de tu respuesta.

    Gracias.

    • Buenas Luis

      Cuando geocodificas una lat/lng, Google puede devolver más de un resultado. Por ejemplo, si coges las coordenadas de una calle de una ciudad te devolverá (ej: 41,38086598 – 2,12257899):

      1. La dirección completa – type: street_address (Av de Juan XXIII, 10-12, 08028 Barcelona, España)
      2. El código postal – type: postal_code (08028 Barcelona, España)
      3. La localidad – type: locality, political (Barcelona, España)
      4. La provincia – type: administrative_area_level_2, political (Barcelona, España)
      5. La comunidad autonómica – type: administrative_area_level_1, political (Cataluña, España)
      6. Y el país – type: country, political (España)

      Si lo que quieres es saber la dirección, tendrás que ir a buscar el resultado que sea de type = street_address

      Espero haberte ayudado

      Nos leemos

      • Si estoy de acuerdo, pero cuando estoy realizando la búsqueda, se supone que toda esa información debe ser referente a las coordenadas mencionada, pero por lo que he visto, en el componente es que esta pinta o dibuja tres marker con información diferente.

  27. Otra coas, me gustaría saber si puedo realizar algunos cambios a los componentes, esto los haría si tu me lo permites, pero todo el código te lo enviaría para que lo valides y lo pongas como siempre lo haces publico.

    en espera de tu respuesta ?

  28. Un saludo, no se si a alguien mas le ha tocado el error que me da el browser, recien acabo de instalar la 0.1.5 y la 0.1.6 claro no ambas a la vez, pero las dos me tiran el error:

    Error en el script de Internet Explorer
    Error en el script de esta página
    Linea: 1062
    Carácter: 16
    Error: ‘google’ is undefined
    Código: 0
    URL: about:blank
    ¿Desea continuar ejecutando scripts en esta página?

    Y ya no despliega mapa alguno

    A alguien le ha ocurrido? Alguna solución?

    • Por cierto, despues de cerrar el diálogo de error del IE, salta el diálogo de excepcion de Delphi:

      —————————
      Debugger Exception Notification
      —————————
      Project VESuite.exe raised exception class EOleException with message ‘No se pudo completar la operación debido un error 80020101’.
      —————————
      Break Continue Help
      —————————

    • Hize el downgrade a la v 0.1.1, que era la que estaba utilizando anteriormente y para mi sorpresa, me lanzó el mismo error pero…

      Oh sorpresa, reinicié la laptop, corri el ejecutable sin el IDE, todo bien, lo corrí desde dentro de IDE, todo bien, instalé la 0.1.6 y todo bien…

      No comprendo dónde estuvo el error, así como apareció de la nada, desapareció.

      • Buenas Ricardo

        Pues nada, aunque algo tarde, me alegro de que lo hayas solucionado. Quizás el problema más que de los componentes fuera del IE (recuerda que el TWebBrowser no es más que una encapsulación del IE) y al reiniciar el ordenador (¿quizás por alguna actualización?) se solucionara el problema.

        Saludos

        • Saludos

          Al parecer el problema fué una conexion a internet lenta e intermitente, el wrapper no cargaba todo el contenido web.

          • Hola Ricardo

            Ante todo gracias por probar los componentes. Miraré a ver si se puede desactivar estas funciones. Lo malo es que el TWebBrowser no lo gestionan las GMLib. A ver si desde JavaScript se puede hacer alguna cosa 🙁

            Nuevamente gracias
            Saludos

  29. Hola amigo

    Ya he instalado tu componente en XE2 y quiero destacar que es muy fácil de instalar, las instrucciones breves, concisas y precisas, es decir, cero problemas, excelente.

    Abrí de inmediato la MegaDemo. Que decir, está genial. intentaré hacer algunas modificaciones (observaciones desde el punto de vista de un usuario vago) y te las hago llegar, no doy fechas porque yo si que soy un vago. pero prometo hacerte llegar algo pronto 🙂

    Gracias y felicidades por el componente.

    Saludos

    Saludos

  30. English man English for us plzzz

    • First of all, thanks you for test the components.

      You need to know that this is a spanish blog and all content are in spanish. However, if a person have a question about the components, he can ask me in english, french, spanish or portugues and I will respond in this language (or in english).

      If you have some doubt, feel free to ask about it in english (or another language that I say before) 😉

      Thanks again
      cadetill

  31. Excelente trabajo !!!! Muchísimas gracias por el trabajo !!!

  32. hi cadetill,

    i know, i know it’s me again….. hehehe thanks for the patience.

    see i have downloaded the newest version of the components. im glad things are much easier now. but i have another question. heres the thing. in TGMInfoWindow Component. i tried to load popups on runtime with a database access of coordinates. the procedure i did can load coordinates in small records but the thing is when the records increases so it the time it takes to load components. please check my procedure and tell me how to do things easier. here’s the procedure

    procedure AddPolylineInfoWindow(Lat,Lng,Contents:TStrings);
    var
      Polyline: TPolyline;
      I : Integer;
      X : TInfoWindow;
    begin
      // create a TPolyline
      Polyline := Form1.GooglePolyline.Add;
    
      // set properties
      //Polyline.Editable := True;
      Polyline.StrokeColor := clBlue;
      Polyline.StrokeWeight := 4;
      Polyline.StrokeOpacity := 0.5;
      Form1.ProgressBar1.Max := Lat.Count - 1;
      Form1.ProgressBar1.Min := 0;
      Form1.ProgressBar1.Position := I;
      for I := 0 to Lat.Count - 1 do
       Begin
       Form1.ProgressBar1.Position := I;
       if Form1.InfoWindow1.Checked then
        X := Form1.GoogleInfoWindow.Add(StrToFloat(Lat[I]),StrToFloat(Lng[I]),Contents[I]);
       Polyline.AddLinePoint(StrToFloat(Lat[I]),StrToFloat(Lng[I]));
       End;
      if Form1.InfoWindow1.Checked then
       begin
       X.AutoOpen := True;
       X.CloseOtherBeforeOpen := True;
       end;
    end;

    Please reply to me again….. thanks!!!!

    • EDIT:
      see i have downloaded the newest version of the components. i am glad things are now much easier. but i have another question. heres the thing. in TGMInfoWindow Component. i tried to load popups on runtime with a TStrings access of coordinates. the procedure i did can load coordinates in small records, but When the records gets bigger, it Increases the time it takes to load the Popups. Please check my procedure and tell me how to do things easier.

  33. Hola. Muchas gracias por la información. Me gustaría saber si es que acaso en la Clase TGMMap, en la capa Transit, se pueden agregar rutas de transporte público de una ciudad determinada, en caso de no encontrarse en la lista de ciudades compatibles. Mi idea es poder llegar a crear una aplicación que use Google maps, y muestre un posible recorrido de transporte público para una ciudad que no está en la lista a partir del punto de origen y el punto de destino.
    De antemano, gracias.

    • Hola Felipe

      Pues lamentablemente este tema no depende de los usuarios que usamos el API de Google Maps, sino más bien directamente de Google, ya que son ellos los que incluyen estas rutas, no los usuarios.

  34. Error en TWebBrowser

    Un saludo, sin querer encontré un error, no tiene que ver directamente con los componentes GM pero es un riesgo latente, he hecho el reporte en el sitio de Google Project pero creo que no está de más informarlo al resto de la comunidad:

    F5 Update error inside the WebBrowser Window

    Reported by ME :), Sep 25, 2012

    What steps will reproduce the problem?
    1. Start a new blank project.
    2. Add a TWebBrowser component onto a blank form.
    3. Add a TGMMap, link it to the WebBrowser and setup the minium code for map display.
    4. Run the project.
    5. Inside the WebBrowser press F5.

    What is the expected output? What do you see instead?
    An exception raises: Project Project.exe raised exception class EOleException with message ‘Argumento no válido’.

    What version of the product are you using? On what operating system?
    – GMLib 0.1.7
    – Embarcadero Delphi XE2 Version 16.0.4429.46931 Update 4
    – Windows XP Pro Spanish (Build 2600: SP3)
    – Under VirtualBox 4.1.22r80657

    Please provide any additional information below.

    The error raises on Line 304 of WebControl.pas
    Result := Forms.Item(FormNumber, ”) as IHTMLFormElement

    The var FormNumber contains the value -1, that can be the source of the error.

  35. How to disable scrollbars in GMMAP WEbBrowser?

    The code below does not work.

    procedure TfrmMain.WebBrowser1DocumentComplete(Sender: TObject;
    const pDisp: IDispatch; var URL: OleVariant);
    begin
    Application.ProcessMessages;
    WebBrowser1.OleObject.Document.Body.Style.OverflowY := ‘hidden’;
    end;

    • Hi nasaman

      In the new version of GMLib I will do this feature 🙂

      Until this release, you can do this:
      1.- open resources/map.html with a text editor (like notepad, notepad++,…)
      2.- add this code

      <script language=javascript>
        document.documentElement.style.overflowY = 'hidden';
      </script>

      3.- compile resources with resources/rc.cmd
      4.- recompile the GMLib

      That is all

      Regards

  36. hola cadetill,

    agradecerte que hayas publicado los componentes, son muy útiles y fáciles de usar, enhorabuena por la “currada” y ánimo para continuar mejorándolos

    entrando en materia, estoy probando la versión v.0.1.8, en Delphi XE3 y me surge lo siguiente:

    se instalan perfectamente siguiendo las instrucciones, sin embargo al intentar probarlos me ocurre lo siguiente con la MegaDemo: al abrir el proyecto salta “A component named Label10 already exists”. Después de ignorar el error te abre el proyecto pero al intentar compilarlo falta “GMBase.dcu”.

    He comprobado que en la carpeta src de los componentes (en esta v.0.1.8) no aparece GMBase.pas, he descargado la v.0.1.7 y en esta sí que aparece así que he copiado el GMBase de la otra versión en la nueva y ahora ya compila pero aparecen errores.
    Lo mismo en las otras demos, aparecen errores de parámetros , etc

    Quisiera saber pues, si es algún detalle de la nueva versión o que símplemente las demos no están adaptadas a todos los cambios introducidos.

    En cualquier caso sería interesante poder probar las demos con los nuevos componentes.

    saludos y ánimos para seguir con este gran proyecto

    • Hola halconmilenario

      Ante todo gracias por probar la GMLib.

      Efectivamente, la MagaDemo veo que da ese error. Para solucionarlo simplemente ignorar el error (se perderá un label de una pantalla, pero bueno, no pasa nada -lo corregiré para la próxima versión-).

      Con lo referente a GMBase.dcu, esta es una unidad que ha desaparecido en esta nueva versión. No debería de darte este problema (de hecho acabo de probarlo y no me lo ha dado). No obstante, mira que en los uses no haya ninguna referencia a esta unidad y, en caso de haberla, quítala. Si siguieras con problemas, podría enviarte por correo los binarios de la MegaDemo.

      Ya me contarás

      Saludos

  37. Buenas tardes
    estoy tratando de instalar la libreria en delphi 7 y me marca un error que donde dice

    requires

    indy,

    segun yo ya instale los paquetes indy pero aun asi no me funciona

    me podrian auydar??

  38. Hola nuevamente

    Se que es una pregunta tonta pero ando un poco perdido

    me marca un error en las funciones AnsireplaceStr

    estoy trabajando con delphi 7

    algo me falta?

  39. ya no me marca ahi agregue la unidad strutils

    ahora me marca error en este

    UTF8ToString

    que tengo que agregar ?
    Gracias

  40. Pues en lugar de usar

    // UTF8ToString

    Memo1.Lines.Text := ANSISTRING(Stream.DataString);

    // modifique el utf por el ansi y corrio el ejemplo

    es el primer ejemplo que estoy probando donde

    me regresa

    {
    “results” : [
    {
    “address_components” : [
    {
    “long_name” : “Chihuahua”,
    “short_name” : “Chihuahua”,
    “types” : [ “locality”, “political” ]
    },
    {
    “long_name” : “Chihuahua”,
    “short_name” : “CHIH”,
    “types” : [ “administrative_area_level_1”, “political” ]
    },
    {
    “long_name” : “Mexico”,
    “short_name” : “MX”,
    “types” : [ “country”, “political” ]
    }
    ],
    “formatted_address” : “Chihuahua, Mexico”,
    “geometry” : {
    “bounds” : {
    “northeast” : {
    “lat” : 28.77290820,
    “lng” : -105.96128960
    },
    “southwest” : {
    “lat” : 28.55867740,
    “lng” : -106.16710590
    }
    },
    “location” : {
    “lat” : 28.6305810,
    “lng” : -106.07370
    },
    “location_type” : “APPROXIMATE”,
    “viewport” : {
    “northeast” : {
    “lat” : 28.77290820,
    “lng” : -105.96128960
    },
    “southwest” : {
    “lat” : 28.55867740,
    “lng” : -106.16710590
    }
    }
    },
    “types” : [ “locality”, “political” ]
    }
    ],
    “status” : “OK”
    }

    esta bien con el ansi??

    • Hola Omar

      Para poder ayudarte necesito que seas más específico con el problema indicando qué demo intentas ejecutar, en qué unit/procedure/método te da el error,…..

      Con tan poca información no se por donde mirar.

      Nos leemos

  41. Hola Cadetill,

    Me gustaría que me tome una pregunta: El uso de GMlib, ¿cómo puedo saber si un marcador se encuentra dentro de un polígono?

    ¡gracias

    • Hola Pedro

      Si te refieres dentro del área del polígono, con el único que podrás saberlo es con el rectángulo, ya que éste se forma con un LatLngBounds y esta clase tiene un método (no obstante este método se debería de implementar porque actualmente no lo está).

      Si a lo que te refieres es saber si un punto está dentro del array de TLinePoints, pues deberías de recorrer dicho array y cada posición usar el método GetLatLng que te devolverá un TLatLng y así poder usar el método IsEqual de esta clase.

      Espero te sirva

      Saludos

  42. Maximum level of MaxZoom 15?
    MaxZoom level rise is there?

  43. Hi Cadetill,
    Thanks a lot for sharing this component.

    I’ve tried to compile gmlib_0.1.8 using C++ builder 2010 but failed.
    Detail:
    1 ) GMLib_C2010.cbproj is the project I use.
    2) GMBase.pas and GMSize.pas not there. So I copied them from gmlib_0.1.7.
    3) After copied these two files, I could compile but got a link error:
    Checking project dependencies…
    Building GMLib_C2010.cbproj (Release configuration)
    [ILINK32 Error] Fatal: Unable to open file ‘DB.OBJ’
    I have no clue why this happened.

    Thanks again for your help.
    Regards.

    • Hi Robbert

      I don’t have C++Builder 2010 to test it but…. GMBase and GMSize are two units obsoletes. If exist some references to they, delete it, there are not required. DB unit is required into the GMElevations unit. This unit is a Delphi/C++ unit, what version of C++ have you, standard?

      Regards

      • Thanks cadetill.

        I could install the VCLs now:

        C++ 2010 Installation steps in case someone needs it:
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Open project “GMLib_C2010.cbproj”
        2. Remove GMBase and GMSize from the project( defined in GMLib_C2010.cbproj ).
        3. Add db.pas into project. You can find it from ..\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\db”
        4. Right click on “GMLib_C2010.cbproj.bpl” and click “Install”
        5. Go to “Tools > Options > Environment Options > C++ Options > Path and Directories””
        Click “Include Path > […]” button
        Browse to the “\lib\C2010” folder and press “OK”, “Add”
        Click “Library Path > […]” button
        Browse to the “\lib\C2010” folder and press “OK”, “Add”

        Some small issues:
        1) version not updated in Design Packages
        GoogleMaps Library v0.1.6(xxx) -> should be v0.1.8 isn’t it?
        2) I’ve created a test application, and just added GMMAP VCL. if “Build with runtime pacakges” is unchecked, build will fail with these two errors:
        [ILINK32 Error] Error: Unable to open file ‘UABOUTFRM.DFM’
        fix: Copy the file from ./src to project’s root directory or add ./src to “Library Path”
        [ILINK32 Error] Error: Unable to open file ‘GMMAPRES.RES’
        fix: Add the file from ./resource to project
        If you check “Build with runtime pacakges”, the application will be built without any error.

        Cheers.

  44. Estoy probando la versión 0.1.8 para XE3 pero no has incluido el fichero
    GMBase.pas
    lo he pillado de la versión 0.1.7 y con esto me compila y me instala los componentes,
    pero no me funcionan las demos, por ejemplo la demo de GMPolyline me da 8 errores de compilación
    [dcc32 Hint] UGMPolylineFrm.pas(342): H2443 Inline function ‘Point’ has not been expanded because unit ‘System.Types’ is not specified in USES list
    [dcc32 Error] UGMPolylineFrm.pas(576): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(583): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(590): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(633): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(640): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(647): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Error] UGMPolylineFrm.pas(654): E2009 Incompatible types: ‘Parameter lists differ’
    [dcc32 Fatal Error] GMPolyline_Demo.dpr(5): F2063 Could not compile used unit ‘UGMPolylineFrm.pas’

    gracias

    • Hola Cocute

      GMBase ya no se incluye en el proyecto de la GMlib. Si se hace referencia a él bórrala que es un error.

      Por otro lado decirte que la única demo funcional es la MegaDemo, las demás demos no he tenido tiempo a actualizarlas.

      Saludos

  45. Cadetill, gracias por compartir estos excelentes componentes…Los estoy incorporando a una aplicación que estoy construyendo.

    Tengo una consulta.

    Se que existe la posibilidad de al hacer click sobre la marca o pasar el ratón sobre ella desplegar información.

    Lo que requiero es poder desplegar el icono y el Title juntos. Me puedes hechar un cable.

    Muy agradecido.

    • Hola cloayza

      Un title es como la propiedad Hint de los componentes, sólo aparece cuando pasas el ratón por encima del componente (en este caso un marcador). Si lo que quieres es tener un marcador con su texto visible, tendrás que usar un marcador estilo mtStyledMarker y establecer la propiedad StyledMarker.StyledIcon como siBubble

      Espero te sirva

      Saludos

  46. “Hola Cocute
    GMBase ya no se incluye en el proyecto de la GMlib. Si se hace referencia a él bórrala que es un error.
    Por otro lado decirte que la única demo funcional es la MegaDemo, las demás demos no he tenido tiempo a actualizarlas.”

    “Hello Cocute
    GMBase no longer included in the project GMlib. If you refer to it is a mistake to delete it.
    On the other hand say that the only functional demo is megademo, other demos I have not had time to update them.”

    Hello,

    it’s a pity! All your efforts in develop such a framework is for nothing if you are not able
    to manage it, that your demos works well. The GMBase issue cost me a lot of time, because
    a other similar framework uses the same Unit-Name. (http://www.delphipraxis.net/157004-google-maps-ueber-com-component-object-model.html). I can confirm the megademo works. All other examples has failed. I use D2010. I hope you have the time to fix the demos and I will test your promising framework again. I appreciate your work!
    Kind Regards, Mark

    • Hi Mark

      I know this framework (I don’t have test it) but I can’t do nothing if it use the same (or similar) names 😉

      For the next version, I will try to make up to date all demos. I don’t know when it will finish because is costing me more than expected to make it compatible with FMX.

      Regards

  47. Hi,

    Not sure if you’re aware of this, but the latest version is missing two critical source files.
    There’s no “GMBase.pas” included anywhere in the zip file.
    And “GMSize.pas” is also missing.

  48. hii
    i want to detect point is inside polygon or no ?
    google map had this function in java
    google.maps.geometry.poly.containsLocation(point, poly)
    how can use this in your componnet?

    and other quastion :
    please give me simple code of how can i add polygons to my map ?i cant learn with your demo codes

    thank u

    • Hi nima

      I don’t knew of this feature. I will implement it in future versions.

      Demo:

      var
      Poly: TPolygon;
      begin
      // firts of all you need to create a TPolygon
      Poly := TPolygon(FGMPoly.Add);
      // and now, add the points
      Poly.AddLinePoint(31.555, 2.222);
      Poly.AddLinePoint(31.444, 2.333);
      Poly.AddLinePoint(31.333, 2.111);
      .....

      Regards

      • thank u very much for your fast answer im just had other quastion
        after i create polygone, when user changed the patch with moving polygone point on the map
        i want to know index of the point is changed by user because i need to save polygone points lat and lng on the text file and if user changed the polygone points in application i must edit saved points lat and lng

  49. I keep getting ‘inital page not loaded’ error and have to wait sometimes up to 3 minutes before I can call DoMap. How do I get this to load quickly?

    • Hi Kevin

      On OnCreate event or in design time (for example) put GMMap1.Active to true. Now you need to put this code on the AfterPageLoaded event:

      procedure TForm1.GMMapChr1AfterPageLoaded(Sender: TObject; First: Boolean);
      begin
      if First then GMMapChr1.DoMap;
      end;

      • Thank you, that worked. You are doing an amazing job on these components.

        Now for another question; I am trying to draw a polygon from stored geocoded addresses, and it’s drawing it on my map, but it’s not drawing it the way I would like. If I sort my coordinates by lat, I get a side to side zig-zag, and if sorted by lon, I get an up down zig-zag. Is there anyway to get the polygon to draw around the area I want?

        • Hi Kevin

          The order that you adds the polygon points in the creation is very important. If you ordain the points by lat, you will get a different polygon if you ordered by lng. To obtain the desired polygon don’t orders the points.

          Regards

  50. Buenas estoy usando la libreria y al momento de instalarlo no me aparece como las instrucciones lo menciona aunque logre instalarlo pero me pide un dcu que es el de GMBase.dcu no logro encontrarlo

    Por otra parte funciona pero ahy un detalle al momento de jalar con el mause el mapa como regularmente lo hace en el google maps, sale un error de referencia Access Violation at address 004034aa in module

    • Hola Edgar

      Gracias por probar la GMLib.

      Referente al tema de la dcu que te pide. Como he comentado en algún mensaje anterior, las 2 dcu que puede “pedirte” ya no pertenecen al proyecto. Si en algún lugar te las pide, borra las referencias a ellas ya que es un error. Si lo que estás es mirando las demos, decirte que sólo la MegaDemo está puesta al día con las actualizaciones.

      Referente al error que te da…. necesito más datos para poder ayudarte.

      Saludos

  51. Hola Cadetill.

    Estoy empezando a ver tus componentes de Gmlib. En un principio creo que cumplen mis expectativas y mucho mas para un trabajo que voy a hacer. GRACIAS. Lo único que no me cuadra bien es el componente twebbrowser (delphi xe2) que con html5 me da ¿problemas? y el que tu usas o recomiendas CDEF3 da menos problemas pero también me hace cosas ¿raras ?. Conoces algún otro que vaya muy bien con html5, json, …. etc. ¿? De nuevo GRACIAS.

    Saludos.

    • Buenas Vicente

      Ante todo gracias por probar GMLib.

      Respecto a tu pregunta, la verdad es que no he probado más que los que mencionas, así que no sabría decirte de los demás que puedan haber en “el mercado”.

      Nos leemos

  52. hello
    i really need to use this function in componnet plase help me 🙁
    google.maps.geometry.poly.containsLocation(point,polygon)
    this fuction detect point is inside the polygone or no

  53. Hola Cadetill.
    Felicitaciones por el trabajo con la GMLib. Es en verdad exelente.
    Queria aprovechar para consultarte por el metodo SetCenter del mapa. Me esta dando “Script error” con el siguiente mensaje “Unable to get value of the property ‘FromLatLngToPoint'”. Object is null or undefined.

    Si me puedes ayudar te lo agradeceria mucho.
    Saludos.

    • Hola Pablo

      Acabo de liberar una nueva versión de los componentes. Prueba y me comentas.

      Saludos

      • Hoa Cadetill.
        Muchas gracias por la pronta respuesta.
        Encontre el problema. Era que no inicializaba la propiedad “center” de “requiredProps” antes de hacer el “doMap” por lo que la propiedad “FromLatLngToPoint” quedaba nula.

        De todas formas ya aproveché y actualicé a la nueva versión que está muy buena.
        Felicitaciones.

        Saludos.
        Pablo Rivero

  54. Gracias por tu gran trabajo y dispculpa que te moleste con mis dudas, serias tan amable de mostrarme un ejemplo de TGMInfoWindow lo estoy trabajando en C++Builder XE3 pero tengo problemas, muchas gracias Saludos.

    • Buenas Salomon

      Ante todo gracias por usar los componentes. Te muestro cómo hacerlo en un ejemplo en Delphi que imagino no te costará llevarlo a C++

      var
        IW: TInfoWindow;
      begin
        // forma 1
        GMInfoWindow1.Add(0, 0, 'un texto en formato HTML o texto plano');
      
        // forma 2
        IW := GMInfoWindow1.Add;
        IW.CloseOtherBeforeOpen := False;
        IW.Position.Lat := 0.05;
        IW.Position.Lng := 0.05;
        IW.HTMLContent := 'Otro texto';

      Nos leemos

      • Gracias por tu respuesta, así es como lo uso pero no me funciona, cuando se ejecuta:

        GMInfoWindow1->Add(17.50,-99.5,”SALOMON”);

        No pasa nada no se muestra la ventana; trate de usar esto:

        GMInfoWindow1->Add(17.50,-99.5,”SALOMON”);
        GMInfoWindow1->Items[0]->OpenClose();

        Y ahora si me lo muesta pero en la posicion que le estoy dando, aunque al inspeccionar las variables de GMInfoWindow1->Items[0]->Position si son las correctas pero en el mapa
        no.

        No se que pasa por que los demas componentes me funcionan muy bien.

        Saludos

  55. I am really thanks for your work. Now I can make my program shows google map :).

    But I have problem, when I drag webbrowser and then release drag, it show Access Violation. I am not using ondrag or afterdrag event, I just slide to see another part of the map.

    Here the screenshoot: http://i97.photobucket.com/albums/l223/afin_x/gmaperror_zps6c191d60.jpg

  56. Fantástico trabajo. Creo que nos ha simplificado mucho el trabajo para hacer “cositas” con GMaps.

    Utilizo tu librería para posicionar ciertos elementos estáticos (utilizo TCircle) y otros dinámicos (TMarker) sobre el mapa con iconos propios bastantes pequeños. Los dinámicos actualizan su posición en “cuasi-tiempo real” estando la información disponible cada 5 segundos aproximadamente .

    Al iniciar el aplicativo, como tiene que insertar tantos objetos en el mapa, a veces sale el mensaje de que si se desea detener la ejecución del script porque se éste va muy lento.

    ¿Hay alguna forma de saber si la página web no está ejecutando ningún script? He probado con las propiedades del TWebBrowser y no he conseguido nada. Básicamente lo que quiero conseguir es esperar hasta que la web termine de ejecutar los scripts, para luego seguir haciendo cosas en el mapa.

    Por otra parte, la fuente de información (cambios de posición) está disponible desde distintos lugares. Mi intención inicial era crear un hilo independiente por cada fuente y modificar la posición de los TMarker dinámicos relacionados con cada fuente, accediendo al mapa concurrentemente. Evidentemente con mecanismos de concurrencia de procesos. El problema es parecido al anterior, al ir cada hilo por libre, la página web no da abasto a modificar los elementos y no hace nada. Al final, decidí los accesos a las distintas fuentes de forma secuencial, y darle tiempo a la página a refrescar. Sabiendo cuando ha finalizado la modificación de un hilo se podría comenzar el siguiente. ¿Se puede hacer algo?

    Lo dicho. Enhorabuena por el trabajo.

    Saludos.

    Álvaro

    • Hola Álvaro

      Ante todo, gracias por probar/usar los componentes.

      Referente al tema de cargas masivas, decirte que si son marcadores, hay una opción de carga masiva (actualmente preparado sólo para CSV, pero se podría mirar de hacer para preparar otro tipo de carga) que carga unos 100 marcadores/seg, con lo que en pocos segundos puedes llegar a cagar cientos de marcadores. Con eso ya evitarías el problema del script.

      El tema de la aplicación multihilo, la verdad es que no he probado los componentes en esa situación. Si te apetece, mediante skype podemos echar una charla y te explico cómo funcionan internamente a ver qué se puede hacer.

      Gracias de nuevo

      Saludos

      • Gracias por la respuesta.

        El problema de la carga es que los datos se leen desde una BBDD y habría que crear un fichero csv por cada fuente de información (son objetos distintos de la misma clase) y dependiendo de los permisos de escritura se podría hacer o no. He estado revisando el método LoadFromCSV de la clase y en mi código no hago cosas distintas a las que se hace en el método. Los marcadores que utilizo son los elementos dinámicos, por lo que la carga no es siempre de los mismos elementos.

        Puede ser que la máquina donde estoy probando vaya justita, y además el acceso a internet deja mucho que desear. A veces sale y a veces no el mensaje. El problema se presenta al añadir los TCircle a un objeto TGMCircle creado en tiempo de ejecución. Cada objeto de fuente de datos (todos de la misma clase) tiene un objeto TGMCircle a los que se añaden los TCircle. He probado primero añadir los TCircle y después asignar el mapa al TGMCircle o añadir los TCircle ya asignado el mapa al TGMCircle. En tiempo de ejecución da más o menos lo mismo.

        Por ahora no tengo disponible Skipe. Ya te contaré mis progresos. La verdad, una vez arrancado y realizando las actualizaciones de posición de forma secuencial por cada fuente de datos (hay 14) va perfectamente. Con hilos de ejecución he conseguido que se actualice, pero no se gana nada de tiempo y no me gusta el efecto. Parece ser que utilizando el método Synchronize del hilo, te actualiza los marker del mapa todos a la vez.

        Muchas gracias otra vez y si hago avances te cuento.
        Álvaro

        • Hola de nuevo Álvaro

          Con respecto a la carga de datos, lo más importante es que desactives la propiedad AutoUodate y que, una vez cargados todos, ejecutes el método ShowElements. Este método en el TGMMarker es público, pero en TGMCircle es protected (voy a hacerla public en todos los componentes para la próxima versión). Si no desactivas el AutoUpdate, lo que hace el componentes es crear y mostrar el objeto en el mapa, desactivando, primero crea todos los objetos y luego los muestra todos de golpe.

          También puedo preparar una función de carga desde un DataSet para próximas versiones 😉

          Nos leemos

  57. Otra cosa cadetill.

    He notado que según se va ejecutando el programa aumenta el consumo de memoria considerablemente.
    Una vez cargado los datos, creados los objetos en tiempo real del programa y los TCircle y TMarker en el TGMMAP/TWebBorwser, ya no se crean más objetos.

    La ejecución del programa consiste básicamente en cambiar la posición de los TMarker.
    ¿Puede esto aumentar la menoria del proceso?

    Si no es así seguiré investigando a ver donde me consume tanta memoria.

    Gracias de antemano.
    Álvaro

  58. Hello Dear Admin
    is google.maps.geometry.poly.containsLocation (point, poly) option addet to componnet in release V 0.1.9 ?im waiting for long time for new release

  59. Hi, please, is possible to use GMLib in Delphi XE ?
    I try to compile D2010 or XE2 version, but both with errors 🙁
    Thanke for answer,
    Petr

  60. Hi, thanks, I tryed latest version 0.1.9, but there is only version for XE2 and XE3, of course not XE. I need in my project other components witch I have in XE only, so I cannot upgrade to XE2 or 3 :-(.
    Hope for new release with XE soon 🙂
    Regards,
    Petr.

  61. Hola cadetil.

    Trabajo con Sergio (bitfarm), creo que lo conoces. Estamos empezando a utilizar las GMLib (v.0.1.9) y me he encontrado con el siguiente problema. Quiero crear/actualizar una lista de TMarkers asociados a un objeto TGMMarker. Tengo puesta la propiedad “autoupdate=false”. Cuando inserto o modifico los TMarkers y llamo al método ShowElements no se dibuja nada en el mapa. He estado ojeando el código y he visto que el método TCustomGMMarker.ShowElements llama al método ChangeProperties de cada uno de sus items. Lo extraño es que el método ChangeProperties comienza con una cláusula if con un montón de condiciones que si no se cumplen lanzan un exit. Entre esas condiciones está ésta

    not TCustomGMMarker(TCustomMarkers(Collection).FGMLinkedComponent).AutoUpdate

    con lo que nunca se llega a dibujar nada.

    He probado a quitar el not inicial y entonces todo funciona correctamente.

    ¿Hay algo que se me escape? ¿Es posible que no esté utilizando bien el componente?

    Un saludo,
    Adrián Vives.

    • Buenas Adrian

      La verdad es que la propiedad AutoUpdate inicialmente estaba pensada para funcionar de forma diferente a lo que lo hace en la actualidad y esa condición ha quedado heredada de código viejo.

      Realmente esta linea no debería estar:

      not TCustomGMMarker(TCustomMarkers(Collection).FGMLinkedComponent).AutoUpdate or

      Miraré sus efectos y haré las correcciones necesarias para la próxima versión.

      Gracias

      Nos leemos

  62. dear admin
    is it possible to use your component in firemonky apps?

  63. Hola de nuevo Cadetil.

    Te aviso de unas propiedades que actualmente están inaccesibles desde código y sería interesante tener disponibles.

    Se trata de las propiedades:

    Tpoliline.icon.icon.FillColor
    Tpoliline.icon.icon.StrokeColor

    El resto se pueden modificar por código (fillOpacity, strokeOpacity,…) pero estas no. Así que si intentas dibujar por código (creando las polilineas por código, claro) puedes obtener líneas punteadas (dashed) pero siempre en rojo (color por defecto al parecer).

    Veo que puede ser algo complicado porque el objeto Tpoliline.icon.icon es un TCustomSymbol que tiene como published las siguientes propiedades:


    property FillOpacity: Real read FFillOpacity write SetFillOpacity; // 0 to 1
    property Path: TSymbolPath read FPath write SetPath;
    property StrokeOpacity: Real read FStrokeOpacity write SetStrokeOpacity; // 0 to 1
    property StrokeWeight: Integer read FStrokeWeight write SetStrokeWeight; // 1 to 10

    Pero es la clase TSymbol, que hereda de la anterior, la que publica las propiedades de color:


    property FillColor: TColor read FFillColor write SetFillColor;
    property StrokeColor: TColor read FStrokeColor write SetStrokeColor;

    Ahí lo dejo, no sin antes agradecerte estas completas y utilísimas librerías. Buen trabajo.

    Un saludo,
    Adrián.

    • Hola Adrian

      Sí, conozco este dato y miraré de solucionarlo en próximas versiones. Hoy por hoy sólo puedes acceder a las propiedades de tipo TColor por código mediante un casteo a su clase.

      Para hacer compatible las GMLib con FMX, una de las propiedades afectadas son las de color (TColor para VCL) que para FMX tienen que ser TAlphaColor. Para lograrlo, la jerarquía de clases suele ser algo así: TCustomMiClase (con todas las propiedades menos las de color) –> TMiClase (con las propiedades de color). La propiedad que se publica es de tipo TCustomMiClase pero la que realmente se crea es de tipo TMiClase gracias al polimorfismo. Por eso en el Inspector ves todas las propiedades, pero por código no.

      En el caso que expones, la clase publicada es TCustomSymbol, pero internamente se crea un objeto de tipo TSymbol. Así pues, si haces
      TSymbol(Tpoliline.icon.icon).FillColor
      podrás acceder a las propiedades de color.

      Sé que no es lo más elegante, pero hasta una próxima versión en que lo arregle es lo que hay 😉

      Nos leemos

  64. Hola Cadetill nuevamente vuelvo a utilizar