Esta entrada y las siguientes, como otras del blog, viene «provocada» por una inquietud o un problema con el que me he encontrado. A raíz de eso y de la necesidad de solventarlo ha surgido esta solución; Seguramente no es la única, y me gustaría que me propusierais otras diferentes (sobre el mismo escenario) si las tenéis. Espero esta que os propongo sea útil a otros programadores en situaciones similares.
Mi intención es dividir todo el proceso (por lo extenso) en varias entradas sucesivas. Os adjunto el «Roadmap» (que suena como muy serio ;-D ) del proceso completo y a medida que vaya completando los pasos, iré actualizando los links en todas ellas.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Desde un tiempo acá he vuelto a trabajar con Interbase/Firebird de forma indistinta, por necesidades de trabajo.
Hace unos días, revisando documentación y webs sobre FB, me encontré con la herramienta gratuita, Firebird Control Center de Achim Kalwa.
La podéis encontrar para descarga en su Web (http://www.achim-kalwa.de/fbcc.phtml), junto con una explicación del funcionamiento y algunas notas sobre capacidades, instalación,…
Es una herramienta sencilla (nada sofisticada), pero útil y simple (suficiente en la mayoría de los casos).
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
En esas entradas he realizado un primer acercamiento a estas tecnologías, he dado un repaso y he testeado por encima algunas de sus características. La idea ahora, es ir un poco más allá.
He leído en algunos foros opiniones sobre que FireMonkey está «a medias» o «incompleto». Respeto esas opiniones, pero personalmente no estoy de acuerdo. Creo (y aquí es donde puede estar el error ) que se compara a FireMonkey con la VCL y las características que posee esta. Desde ese punto de vista sí puede parecer que «le faltan cosas» y eso puede dar una sensación de que es una tecnología inacabada.
Pienso que el objetivo final de FireMokey no es, llegar a conseguir todas las características con las que cuenta la VCL. Es algo totalmente nuevo que avanza en una dirección paralela, algunas cosas tendrá sentido «adoptarlas» y otras no, pero a mi entender eso es «añadir» no «completar».
Hace tiempo publiqué en el blog un pequeño ejemplo de cómo cargar ficherosGPX (alternativa generandoKML) procedentes de dispositivos GPS y visualizar esos tracks o rutas en una Aplicación Delphi. Me he decidido por intentar realizar esta pequeña aplicación utilizando FireMonkey.
TActionList, ¿dónde está?
Lo primero que me he encontrado, aunque en realidad ya lo había visto en las primeras pruebas, es que no puedo utilizar un TActionList. Este componente no está en la paleta donde debería estar o donde uno esperaría encontrarlo. Una cosa que sorprende es que los componentes estandard de FireMonkey sí poseen la propiedad Action para poder asignar un elemento. No es que sea imprescindible, pero es muy cómodo.
Lo siguiente que me planteo es la importación de datos desde un fichero GPX. En su día la hice utilizando el XMLmapper, pues los ficheros GPX son en realidad ficheros XML. Me propongo utilizar el mismo modelo utilizado anteriormente; Importar el fichero GPX a un TClientDataset para getionarlo después de forma local.
TXMLTransformProvider, ¿dónde está?
Al igual que me ha pasado anteriormente, coloco un TClientDataset y cuando voy a colocar el TXMLTransformProvider no está donde esperaba encontrarlo.
He realizado un par de pruebas y lo más curioso es que creando y configurando el componente «a mano» funciona perfectamente. Con un código como este y configurando los campos apropiados en diseño el componente funciona perfectamente, importa los datos e incluso se pueden configurar LiveBindings para mostrar el resultado en un Grid.
Una vez activado el componente la importación se realiza sin problemas.
He dejado de lado esta cuestión por ahora; Tal vez más adelante me detenga para probar más cosas, pero para seguir adelante he realizado la importación de datos «manualmente», de forma que una vez conseguidos los datos en el TClientDataSet y puedo continuar a tratarlos.
El siguiente paso es colocar los elementos en el formulario, tal como van a ir distribuidos. Una cosa a la que hay que acostumbrarse es que los componentes de FireMonkey no poseen la propiedad
Anchors, que tan útil nos es utilizando componentes de la VCL. A cambio podemos ver que la propiedad Align posee una cantidad de valores superior que nos permite realizar más cosas. En este caso utilizamos la propiedad Align y la propiedad Padding para ir fijando los controles al formulario tal y como deseamos.
Se trata de conseguir lo mismo, pero por un camino diferente…
Una vez que los componentes básicos ya están colocados necesito plasmar en pantalla una serie de coordenadas. Para ello he escogido el componente TPath. La idea es que permite representar una serie de puntos que forman una línea o camino.
La potencia y la velocidad llaman la atención, pero también la sencillez.
Basta con soltar el componente en pantalla y utilizando la propiedad Data, colocar lo siguiente para conseguir una imagen (o path) como el que veis más abajo (se puede hacer en diseño utilizando un pequeño formulario de edición):
M 0,2 L 1,2 L 1,5 L 2,5 L 2,2 L 3,2 L 1.5 0 L 0,2
Si lo pensáis un poco, no son más que coordenadas precedidas por el tipo de «unión» o «elemento» que queremos utilizar entre ellas; la Primera M se refiere a MOVER, las L se refieren a LINEA.
Es así de sencillo y así de potente.
Un código como este, os podéis imaginar lo que dará como resultado:
for I :=-360to360dobegin
n :=DegToRad(i);
res :=Sin(n);//res := Sin(n) * Sin(n);//res := Tan(n);if(Str ='')thenbegin
Str :='M '+FloatToStrF(n, ffFixed,35,10)+' '+FloatToStrF(res, ffFixed,35,10);endelsebegin
Str := Str +','+'L '+FloatToStrF(n, ffFixed,35,10)+' '+FloatToStrF(res, ffFixed,35,10);end;end;
Path1.Data.Data:= Str;
for I := -360 to 360 do begin
n := DegToRad(i);
res := Sin(n);
//res := Sin(n) * Sin(n);
//res := Tan(n);
if (Str = '') then begin
Str := 'M ' + FloatToStrF(n, ffFixed, 35, 10) +
' ' + FloatToStrF(res, ffFixed, 35, 10);
end
else begin
Str := Str + ',' + 'L ' + FloatToStrF(n, ffFixed, 35, 10) +
' ' + FloatToStrF(res, ffFixed, 35, 10);
end;
end;
Path1.Data.Data := Str;
Con esto más o menos ya está todo completo. Los componente básicos ya están escogidos.
He utilizado LiveBindings para poder mostrar los datos en de las coordenadas en un TStringGrid; También he aplicado un estilo visual a la aplicación y por último una par de animaciones para dar más vistosidad a la visualización del track.
La conclusión que saco, es que sí se pueden hacer aplicaciones con FireMonkey, lo que pasa que tal vez en algunos aspectos debamos pensar las cosas con otro enfoque o hacerlas de otra manera. Seguramente está en los planes de Embarcadero (eso espero) ampliar sus funcionalidades y el número de componentes.
Por último comentar que me he quedado con la ganas de poder compilar la aplicación y generarla para iOS, pero por ahora, no dispongo de los medios para hacerlo. Sobre todo me queda la duda de qué hubiera pasado con una aplicación, de un programador como yo con «visión de Windows», al compilarla en MAC.
¿Algun error? ¿Algun problema? ¿Warinigs? ¿Algun elemento que no puedo utilizar? ¿?¿?¿?
Si alguien se anima a hacerlo, le agradecería que nos comunicara el resultado y me enviara alguna pantallita. ;-)
Os dejo los enlaces al código fuente y al ejecutable (este último comprimido con UPX) junto con algunos ficheros GPX que podéis usar para las pruebas.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Ya hace un tiempo que publiqué la aplicación Trackinfo, dedicada a trabajar con tracks y rutas procedentes de dispositivos GPS. Entre las cosas que hace, está la de mostrar el índice IBP de las rutas con las que trabajamos.
¿Qué es el IBPIndex?
Pues el índice IPB, es un valor que se genera a partir de los datos del Track/Ruta (enfocado a bicicleta de montaña o carretera) y que “valora” la dificultad de esa ruta. Para ello calcula infinidad de datos de la ruta (velocidades, tiempos, alturas, porcentajes de desnivel,…) y a partir de ellos genera un índice; Ese es el IBPIndex de la ruta.
La web de IBPIndex ya cuenta con algunos años de historia, y hace poco han llegado a los 500.000 track analizados (¡¡que se dice pronto!!). Es muy conocida en los foros y ambientes de ciclismo.
¿Porqué este cambio?
Bueno, como ya os he dicho, la aplicación hace uso de la Web IBPIndex (además de otras cosas), que es la que realmente calcula el índice. La aplicación es gratuita y a la gente de IBPIndex les ha gustado y me han propuesto, que la aplicación “pase a formar parte de la web” (por decirlo así).
Así que a partir de la próxima versión (1.5b –que estará disponible en breve-) el cambio será efectivo. A partir de ahora podéis encontrar nuevas versiones y seguir las novedades desde la web de IBPIndex o desde aquí mismo:
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Se han corregido algunos bugs de la anterior versión y como cosas más relevantes de la versión nueva están:
Sistema nuevo de Multiidioma para la aplicación donde es más fácil crear nuevos ficheros de idioma.
Ahora el programa permite abrir los formatos de fichero más importantes directamente (sin convertirlos préviamente):
GPS Trackmaker (*.GTM)
Google Earth (*.KML)
OziExplorer (*.PLT)
Garmin Training Center (*.TCX)
Mapsource (*.GDB)
CompeGPS (*.TRK)
GPS Exchange Format (*.GPX)
Alan Map500 TrackLog (*.TRL)
Garmin Mapsource (*.MPS)
Magellan File -eXplorist- (*.UPT)
Swiss Map 25/50/100 (*.XOL)
La descripción completa de la aplicación y las características completas en la página de la aplicación. Desde ahí se puede descargar de forma gratuíta el fichero.
Como siempre las sugerencias, comentarios y demás son bien recibidos.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
IBPIndexCalc es una aplicación que permite obtener multitud de datos (en general «el grado de dificultad») de un Track/Ruta realizado en bicicleta (sea de carretera o de montaña). Aunque los datos podrían ser aplicados a cualquier track realizado en otra actividad.
Para ello el programa utiliza la web de IBPIndex (http://www.IBPIndex.com); Imprescindible para todos aquellos que salís en bici y utilizáis/generáis track con GPS.
Este índicxe IBP (Interactive Bicycling Parameters) se obtiene analizando los datos de latitud, longitud y altura en multitud de puntos del recorrido. A partir de estos puntos se calculan las distancias recorridas en los diferentes tramos de subidas y bajadas (1%, 5%, 10% etc..) se computan los % que representan sobre el total, los metros totales ascendidos, descendidos, los ratios medios de subida y de bajada, los Km. totales, y la distribución de los tramos de subida. Si queréis saber más y ampliar información sobre el tema visitad la web de IBPIndex (proceso de cálculo, corrección de errores, formato de puntuación,…).
IBPIndexCalc utiliza los componentes Indy para el acceso a la Web. Además implementa una clase derivada de TThread que permite que el pograma principal no se bloquee mientras espera la respuesta desde la web. Estructura de la Clase TWebThread:
{ : Clase para realizar consultas utilizando thread a la Web. }
TWebThread =class(TThread)private
IdHTTP: TidHTTP;
Stream: TIdMultipartFormDataStream;
FTrackFileName:string;
FwebBrowser: TWebBrowser;
FResponse:string;private
FURLNavigate:string;
FURLPDF:string;function _RepairLinks(StrPage:string;var URLpage:string;var UrlPDF:string):string;protectedpublic// ejecutar el procedimniento.procedure Execute;override;// componente de navegación.property webBrowser: TWebBrowser read FwebBrowser write FwebBrowser;// Fichero de Track/ruta.property TrackFileName:stringread FTrackFileName write FTrackFileName;// : Propiedad para recoger la respuesta desde la Web.property Response:stringread FResponse write FResponse;// URL de navegación.property URLNavigate:stringread FURLNavigate write FURLNavigate;// URL del PDF de respuesta.property UrlPDF:stringread FURLPDF;// : Constructor redefinido.constructor Create(AFileName:string; wb: TWebBrowser);end;
{ : Clase para realizar consultas utilizando thread a la Web. }
TWebThread = class(TThread)
private
IdHTTP: TidHTTP;
Stream: TIdMultipartFormDataStream;
FTrackFileName: string;
FwebBrowser: TWebBrowser;
FResponse: string;
private
FURLNavigate: string;
FURLPDF: string;
function _RepairLinks(StrPage: string; var URLpage: string;
var UrlPDF: string): string;
protected
public
// ejecutar el procedimniento.
procedure Execute; override;
// componente de navegación.
property webBrowser: TWebBrowser read FwebBrowser write FwebBrowser;
// Fichero de Track/ruta.
property TrackFileName: string read FTrackFileName write FTrackFileName;
// : Propiedad para recoger la respuesta desde la Web.
property Response: string read FResponse write FResponse;
// URL de navegación.
property URLNavigate: string read FURLNavigate write FURLNavigate;
// URL del PDF de respuesta.
property UrlPDF: string read FURLPDF;
// : Constructor redefinido.
constructor Create(AFileName: string; wb: TWebBrowser);
end;
Una vez que el programa obtiene respuesta de la Web, la analiza para detectar posibles errores y para extraer los links útiles al usuario. En este caso el PDF generado y la página de resultados.
La aplicación y la clase UTWebThread puede se útil, modificando determinados, para realizar un trabajo similar en otras páginas webs.
Es totalmente gratuíta y el código fuente está disponible.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
TrackInfo es una aplicación que permite obtener información y visualizar sobre un mapa, rutas en formato GPX (GPS eXchange Format). Está pensado (o enfocado) a la carga de archivos que provienen desde un dispositivo GPS. Permite la conversión de rutas entre diferentes formatos.
NEW:
Actualizados los formatos de conversión; KML (Google Earth), TCX (Garmin training center), GTM (GPS TrackMaker), PLT (Ozi explorer), GDB (Mapsource), TRK (CompeGPS), XOL (Swiss Map), …
Animación de recorrido de la ruta
Gráficos de Alturas y velocidad sincronizados con la animación.
Información extendida para los puntos que forma la ruta (Velocidad puntual, distancia acumulada, ascenso acunulado, descenso acumulado,…)
Corrección de errores y bugs respecto a la versión anterior.
Mayor rapidez en la carga de rutas y en la conversión.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Esta entrada se podría considerar como una «ampliación» de la última publicada relacionada con los ficheros KML, Generar ficheros KML de rutas; Tracks en Google Maps. A partir de un tema surgido en los foros del Clubdelphi de cómo visualizar estos ficheros directamente sobre Google Maps dentro de una aplicación Delphi, he modificado el programa anterior (que incluía la conversión desde GPX) para poder visualizarlos directamente.
En un ejemplo más simplificado, y enfocado a los ficheros KML. Como ya dije anteriormente, este tipo de ficheros pueden almacenar otros tipos de información y en este ejemplo se leen los datos directamente desde este tipo de ficheros (en este caso sólo la ruta).
Además el mapa está optimizado para visualizarse a tamaño completo, y no según el tamaño de la ventana como estaba anteriormente (esto implica la optimización de que no se recarga la página al cambiar el tamaño).
También se ha modificado el recurso de la página Web, para que automáticamente se calcule en «centrado» y el «zoom» del mapa a partir del Track que se va a visualizar. Para ello se utiliza el siguiente código:
var polylineBounds = polyline.getBounds();
var ZoomLevel = map.getBoundsZoomLevel(polylineBounds) - 1;
map.setCenter(polylineBounds.getCenter(), ZoomLevel);
var polylineBounds = polyline.getBounds();
var ZoomLevel = map.getBoundsZoomLevel(polylineBounds) - 1;
map.setCenter(polylineBounds.getCenter(), ZoomLevel);
Se puede descargar el ejemplo desde aquí (incluye los fuentes).
Debido a un cambio en la definición de la función EnumResourceModules, que pasa de usar LongInt a NativeInt, hay que realizar un cambio en el procedimiento que se le pasa como parámetro, modificando este dato.
La definición del procedimiento, ahora queda así:
function _MyEnumResourceModules (
Instance:{$IFDEF VER230}NativeInt{$ELSE}Pointer{$ENDIF};
Data:Pointer):Boolean;
function _MyEnumResourceModules (
Instance:{$IFDEF VER230}NativeInt{$ELSE}Pointer{$ENDIF};
Data:Pointer):Boolean;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Haciendo pruebas con el componente TidHTTP me ha surgido este ejemplo y me parece interesante mostrar el proceso completo que he seguido para descargar contenido desde una web. En este caso he accedido a las imágenes en formato PNG, pero es extensible a cualquier otros contenidos.
En un primer paso se trata de obtener el contenido (source) desde una página web y a partir de ahí, extraer los links (en mi caso correspondientes a imágenes en formato PNG) y descargar los ficheros para almacenarlos en disco. Para ello utilizaremos el control TidHTTP de la Indy.
Para obtener el código fuente de la página podemos utilizar un código como este:
// URL de la página
StrURL :=...;// Crear componente para acceder
IdH := TIdHTTP.Create(nil);// proteccion para liberartry// proteccion por errortry// Obtenemos la pagina
Resp := IdH.Get(Trim(StrURL));// recuperamos la respuesta
TSContent.Text:= Resp;excepton E:Exception dobegin
MessageDlg('Error al acceder a la página. '+#13+#10+'Mensaje: '+
E.Message, mtError,[mbOK],0);end;end;// tryfinally
IdH.Free;end;
// URL de la página
StrURL := ... ;
// Crear componente para acceder
IdH := TIdHTTP.Create(nil);
// proteccion para liberar
try
// proteccion por error
try
// Obtenemos la pagina
Resp := IdH.Get(Trim(StrURL));
// recuperamos la respuesta
TSContent.Text := Resp;
except
on E:Exception do begin
MessageDlg('Error al acceder a la página. '+#13+#10+
'Mensaje: ' +
E.Message, mtError, [mbOK], 0);
end;
end; // try
finally
IdH.Free;
end;
Obtendremos como resultado del Get el siguiente texto, que corresponde al código fuente de la página:
Lo siguiente que vamos a hacer es un simple «parseo» buscando los enlaces que nos interesen. En nuestro ejemplo queremos links a imágenes en formato png. Utilizando funciones de la clase SysUtils podemos obtener sin mayor problemas los links contenidos en el código; Si probáis con la página de ejemplo, deberíais obtener un único link:
Por último, nos queda ver el código necesario para descargar la imagen y almacenarla en disco. Para ello podemos utilizar de nuevo el componente TidHTTP. En mi caso, y en previsión de que pueda haber varias imágenes a descargar, he creado una clase derivada de TThread para ello:
{: Clase para descargar una imagen y almacenarla en disco.}
TDownImageThread =class(TThread)private
FURLImage:string;
FPathImage:string;
FFileNameImage:string;// Internas
ImageName:string;
PathURL:string;// Componente
idH:TidHTTP;public// redefinir métodosconstructor Create(AURL:string; AOutPathImages:string);destructor Destroy;override;procedure Execute;override;{: URL de la imagen a descargar. }property URLImage:stringread FURLImage write FURLImage;{: Path de disco local donde voy a almacenar la imagen.}property PathImage:stringread FPathImage;{: Nombre completa (path+Nombre) de la imagen almacenada en disco local}property FileNameImage:stringread FFileNameImage;end;
{: Clase para descargar una imagen y almacenarla en disco.}
TDownImageThread = class(TThread)
private
FURLImage: string;
FPathImage: string;
FFileNameImage: string;
// Internas
ImageName: string;
PathURL: string;
// Componente
idH:TidHTTP;
public
// redefinir métodos
constructor Create(AURL:string; AOutPathImages:string);
destructor Destroy; override;
procedure Execute; override;
{: URL de la imagen a descargar. }
property URLImage:string read FURLImage write FURLImage;
{: Path de disco local donde voy a almacenar la imagen.}
property PathImage:string read FPathImage;
{: Nombre completa (path+Nombre) de la imagen almacenada en disco local}
property FileNameImage:string read FFileNameImage;
end;
Al crear el Thread (método Create) ya pasamos como parámetros, la URL de la imagen a descargar y el Directorio inicial donde se van a guardar las imágenes encontradas.
El método Execute creamos un componente TidHTTP (igual a como lo hemos hecho antes), pero en este caso utilizamos un TFileStream para recoger el fichero que descargamos y almacenarlo en disco.
Utilizamos el Path de la URL para generar diferentes directorios para las diferentes imágenes:
//: recupara la imagen y la guarda en discoprocedure TDownImageThread.Execute();var
Stream:TFileStream;
IdH:TidHTTP;
path:string;
dir:string;begin// Directorio de salida
dir := AnsiReplaceText(PathURL,'/', STR_EMPTY);// Nombre vacíoif(ImageName = STR_EMPTY)thenbegin
Exit;end;// Path de salida
path :=IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage)+ dir)+ ImageName;// Crearlo por si no existeForceDirectories(ExtractFilePath(path));try// Stream para la imagfen
Stream := TFileStream.Create(path, fmCreate);try//recuperar la imagen
IdH := TidHTTP.Create(nil);
IdH.AllowCookies:=True;// protecciontry
IdH.Get(Trim( FURLImage), Stream);except// Error al descargar la imagen//.. Volcarlo al logend;finally// Liberar
idH.Free;
Stream.Free;end;// Path de salida
FFileNameImage := path;except// error al crear el fichero//... Logend;end;
//: recupara la imagen y la guarda en disco
procedure TDownImageThread.Execute();
var
Stream:TFileStream;
IdH:TidHTTP;
path:string;
dir:string;
begin
// Directorio de salida
dir := AnsiReplaceText(PathURL, '/', STR_EMPTY);
// Nombre vacío
if (ImageName = STR_EMPTY) then begin
Exit;
end;
// Path de salida
path := IncludeTrailingBackslash(IncludeTrailingBackslash(PathImage)
+ dir) + ImageName;
// Crearlo por si no existe
ForceDirectories(ExtractFilePath(path));
try
// Stream para la imagfen
Stream := TFileStream.Create(path, fmCreate);
try
//recuperar la imagen
IdH := TidHTTP.Create(nil);
IdH.AllowCookies := True;
// proteccion
try
IdH.Get(Trim( FURLImage), Stream);
except
// Error al descargar la imagen
//.. Volcarlo al log
end;
finally
// Liberar
idH.Free;
Stream.Free;
end;
// Path de salida
FFileNameImage := path;
except
// error al crear el fichero
//... Log
end;
end;
El resultado se puede ver en este ejemplo.
Una vez descargadas las imágenes se muestran en un componente en la misma aplicación, y desde ahí podemos acceder a la información de la imagen y realizar algunas acciones sobre ellas.
Para realizar pruebas podéis introducir, por ejemplo direcciones como:
Por lo tanto para poder descargar tanto la página inicial (de donde se extraen los enlaces), como las imágenes en si, hay que modificar ligeramente el programa.
Hay que utilizar el componente TIdSSLIOHandlerSocket para poder utilizar SSL y añadir al proyecto as librerías de acceso a SSL.
No hay muchas modificaciones en el código, pero si queréis verlas, dejaré el código antiguo y el nuevo (compilado en Delphi 7) para que podáis compararlos.
NOTA: Para generar las imágenes en disco PNG he utilizado el componente “Portable Network Graphics Delphi” de Gustavo Huffenbacher Daud, que podéis encontrar y descargar de forma gratuita de Internet.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
ACTUALIZACIÓN: Debido a cambios en la política de Google Maps hay una nueva actualización del programa IBPIndex.
IBPIndex es una aplicación que permite obtener información y visualizar sobre un mapa, rutas en formato GPX (GPS eXchange Format), GTM (GPS Trackmaker), KML (Google Earth), PLT (OziExplorer), TCX (Garmin Training Center), GDB (Mapsource), TRK (CompeGPS), TRL (Alan Map500 TrackLog), MPS (Garmin Mapsource), UPT (Magellan File -eXplorist-) y XOL (Swiss Map 25/50/100).
Está pensado (o enfocado) a la carga de archivos que provienen desde un dispositivo GPS.
INFORMACIÓN:
Funciona en todas las versiones de Windows.
NEW Versión 1.7 (beta) del 15/12/2011
La aplicación se puede usar y distribuir de forma totalmente gratuíta.
CARACTERÍSTICAS:
Visualización de los puntos de ruta sobre un gráfico; Información de puntos. Zoom, impresión, exportación…
Permite abrir y convertir tracks en los siguientes formatos:
GPS Trackmaker (*.GTM) Google Earth (*.KML) OziExplorer (*.PLT) Garmin Training Center (*.TCX) Mapsource (*.GDB) CompeGPS (*.TRK) GPS Exchange Format (*.GPX) Alan Map500 TrackLog (*.TRL) Garmin Mapsource (*.MPS) Magellan File -eXplorist- (*.UPT) Swiss Map 25/50/100 (*.XOL)
Exportación con interface a GPSBabel a otros formatos
Configuración de múltiples idiomas y fácil creación de nuevos (aplicación).
Gráficos de altura y velocidad de la ruta.
Información puntual para los puntos de la ruta.
Animación de rutas/recorridos gráficamente.
Visualización de las rutas sobre Google Maps. Exportación e impresión de mapas.
Visualización de Perfil de altura de los datos el track. Exportación como imagen.
Interface Ribbon.
Información del IBPIndex de la ruta (www.ibpindex.com); Impresión y exportación a PDF.
Actualizaciones automáticas desde Internet.
Visualización en Google Maps en 3D utilizando pluging de Google Earth.
IMAGENES:
Click sobre las imagenes para agrandar.
Interface Ribbon de la aplicación (principal) .
Otras ventanas de la aplicación (principal de Datos, Gráfico, Google Maps, Perfil, IBPIndex,…)
INSTALACIÓN:
La aplicación se distribuye en un fichero instalable (setup_IBPIndex.exe). Basta con lanzar la instalación desde Windows y seguir las instrucciones del programa.
NOTA: En Vindows Vista y Windows 7 es necesario ejecutar la instalación con privilegios de administrador.
Si deseas añadir y cooperar en el desarrollo de la aplicación con nuevos idiomas, puedes hacerlo con unos sencillos pasos:
Crea un nuevo fichero de idioma basándote en algunos de los ficheros de idioma presentes en la aplicación (es.lng, ca.lng, en.lng,…).
Con un editor de texto (NOTEPAD, por ejemplo) traduce las constantes manteniendo la misma estructura que tienen; Especial atención a los símbolos especiales (& *|* ).
Envíamelo a la dirección <german_ral[ARROBA]hotmail.com> con tus datos.
Una vez revisada y comprobada, la añadiré al programa con tus datos como traductor.
DESCARGA:
La aplicación se puede descargar desde esta misma web, o desde la web de IBPIndex (sección Aplicaciones).
Esta aplicación es gratuíta y está realizada para utilizarla a nivel personal y por puro ocio. Me gusta la programación y me gusta la actividad de BTT, así que el resultado ha sido este.
Espero que a otras personas les pueda ser útil y aceptaré/agradeceré propuestas, ideas, correcciones, sugerencias,… para mejorarla y ampliarla.
HISTORIAL
Versión 1.7b (15/12/2001)
* Corregidos varios errores.
* mejoras en la visualización de mapas (Google Maps).
Versión 1.4b (12/05/2011)
ERRORES CORREGIDOS
* Corregidos errores de multiidioma. Se utiliza un sistema nuevo más abierto que permite añadir y traducir a nuevos idiomas mçás fácilmente
* Corregidos problemas al cargar ficheros con caracteres extraños en el nombre.
* Corregido error al mostrar elevación de ruta.
* Corregido error en el comando de conversión.
* Corregidos bugs menosres.
MEJORAS AÑADIDAS:
* Mejoras en el multiidioma (Cambio a un sistema más abierto).
* Admite rutas el multiples formatos a la hora de cargar.
* Carga e importa rutas más rápido (optimizado)
* Índice de carga de ruta
* Ajuste de columnas.
* Añadida traducción al Inglés y catalán.
Versión 1.2 (20/04/2011)
ERRORES CORREGIDOS:
* Error en el cuadro de arrastrar ruta; No admite arrastre.
* Corregido error en algunos equipos, que se quejan de que no exiaste MIDAS.DLL
* Corrección a la hora de actualizar la aplicación. En algunos casos no se descargaba
correctamente el fichero.
* Errores varios en la consulta del IBPIndex.
* Errores en los datos de rutas.
MEJORAS AÑADIDAS:
* Añadidos gráficos de velocidad y altura
* Sincronización de los puntos de cada gráfico
* Animación de la ruta visualmente.
* Información extendida de los puntos de la ruta.
* Título completo para la aplicación (incluyendo versión)
* Añadida información al gráfico referente a los puntos (Hora, distancia, acumulados,…).
* Ampliados los formatos de conversión de rutas.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…