Inicio > Delphi, FMXLinux, Linux, WebService > FMX Linux – Primeros proyectos

FMX Linux – Primeros proyectos

Share Button

Hace poco publiqué una primera entrada introductoria sobre FMX Linux. En ella explicaba los primeros pasos para su instalación y configuración. En mi caso lo hice utilizando un sistema Ubuntu 18.04 desktop.

FMX Linux – Configuración

Captura_2019-07-10 13_37_51

Para las pruebas estoy utilizando una máquina virtual preconfigurada sobre VirtualBox. Es una buena solución, además de práctica y rápida de comenzar con un sistema ya configurado y listo para funcionar. De esta forma me puedo centrar en lo que realmente importa para estas entradas.

Captura_2019-07-10 10_46_56Para esto he utilizado la web descargarmaquinasvirtuales.com que permite descargar (como su nombre indica) máquinas de diferentes sistemas ya configuradas (tanto para VirtualBox como para VMWare), de forma que podemos tenerlas en marcha y funcionando en unos minutos.

Una vez instalado y funcionando, la idea es ir ejecutando diferentes proyectos realizados en Delphi para ver cómo se desempeñan en Linux. Son proyectos que desde que apareció Firemonkey he ido desarrollando, algunos para entradas del blog, otros de ejemplo y otros como parte de aplicaciones más grandes, un poco de todo.

La primera prueba ya la comenté en la entrada anterior, y se trata del programa “Hola Mundo!”. En este caso funciona sin problemas (como era de esperar). También comenté que con este programa realicé un Debug paso a paso básico.

Forms y animaciones

La siguiente prueba, también bastante sencilla ha sido probar con varios formularios. Abrir, cerrar y liberarlos sin problemas. Además en el primero de ellos he añadido al color de fondo una animación.

Podéis ver que el color de fondo utiliza un gradiente y una animación en loop.

El botón de cerrar también tiene un efecto de blur aplicado.

Grid y Datos (liveBindings)

El segundo ejemplo se trata de la visualización de un grid con datos. En este caso utilizo una tabla en memoria que los contiene (TFDMemTable). También un componente «Navigator» para poder probar las operaciones básicas sobre los datos.

Lo primero que me ha llamado la atención es que los datos no se visualizan del todo correctamente (por temas de codificación). Aunque cuando los modificamos manualmente sí se almacenan y se visualizan bien. Seguidamente he observado que las operaciones se demoran algo de tiempo, pero eso también puede ser debido a la máquina virtual.

Pero en general el ejemplo, con el componente, los LiveBindings y el navegador ha funcionado como se esperaba. Os dejo una imagen.

Gridcondatos

Múltiples hilos de ejecución

En el siguiente ejemplo quería probar Threads. Pensando en derivar de la clase TThread de Delphi de toda la vida. Cuando iba a crear una clase sencilla, recordé que hace no mucho implementé clases para probar multihilos en las clases TCanvas y TContext3D de Firemonkey.

Así que ¿porqué no probar con ese ejemplo ya hecho? La entrada original, por si queréis consultarla, es esta:

Multi-Threading for TBitmap, TCanvas, and TContext3D

Las clases derivadas de Tthread son bastante básicas. Una base con la mayoría del código y tres derivadas para generar diferentes figuras, pero suficientes para probar lo que quiero.

  TPaintThread = Class(TThread)
  private
    ...
  protected
    function GetRandomColor():TAlphaColor;  // Color aleatorio
    function GetRamdomRect():TRectF;	    // Tamaño aleatorio
    function GetRandomPoint():TPointF;      // posicion aleatoria
    property Fill:TBrush read GetFill;
    procedure UpdateCaption();	// Actualizar el Caption del form (progreso)
  public
    constructor Create(AForm:TFormMain; ACanvas:TCanvas;      
ANumberElements:integer; AMaxWidth, AMaxHeight:integer); reintroduce;
    destructor Destroy; override;
    property Canvas:TCanvas read FCanvas;
    property Form:TFormMain read FForm write FForm;
    // Número de elementos a dibujar
    property NumberElements:integer read FNumberElements write FNumberElements;
    // dimensiones máximas para los elementos
    property MaxWidth:integer read FMaxWidth write FMaxWidth;
    property MaxHeight:integer read FMaxHeight write FMaxHeight;
    // Procedimiento de pintado que acyualiza el Caption del form
    procedure Execute();override;
    // Para redefinir en las clases derivadas el elemento a dibujar
    procedure PaintElement(); virtual; abstract;
  end;
  // Líneas
  TPaintLineThread = class(TPaintThread)
  public
    procedure PaintElement(); override;
  end;
  // Rectángulos 
  TPaintRectThread = class(TPaintThread)
  public
    procedure PaintElement(); override;
  end;

El programa original realiza la comparación de dibujar sobre un TCanvas, diferentes figuras (líneas, rectángulos y elipses) de forma continuada y posteriormente hace lo mismo pero con tres threads simultáneos, para probar el soporte de multihilo en las clases TBitmap, TCanvas y TContext3D de Firemonkey, que en versiones anteriores no estaba implementado.

El resultado como podéis ver en la imagen también ha sido satisfactorio. Un poco de lentitud, pero lo achaco a la máquina virtual, que en mi caso es bastante «justita» en su configuración.

NOTA: Las siguientes imágenes son animaciones y para reducir el tiempo de carga de la página, he colocado aquí una captura y pulsando sobre el link en la parte superior de la imagen o sobre la propia imagen se abrirá la animación en otra ventana del navegador.

Pulsar sobre el link o la imagen para abrir la animación en una nueva pantalla

Threads-Canvas

Efectos sobre imagen y TViewport3D

Las siguientes pruebas la he realizado con dos proyectos que utilizan efectos varios (de Firemonkey) sobre imágenes. El segundo además utiliza un componente TViewPort3D para aplicar diferentes operaciones sobre el componente de imagen (incluyendo también algunos efectos).

El primero son una pruebas que posteriormente utilicé en el concurso #funWithDelphi de Embarcadero. Por cierto, que esta aplicación acabó ganando el concurso.

Pulsar sobre el link o la imagen para abrir la animación en una nueva pantalla

Filtros-Efectospara-Imagenes-NASA

El segundo proyecto pertenece a un “diseñador de carátulas”.  A partir de una imagen cargada, permitía aplicar diferentes efectos a la foto (sepia, blanco y negro,…) y también realizar variaciones sobre la vista (utilizando un TViewport3D) de la imagen en 3D. Aplicar sombras, cambios de tamaño, rotación, posición,…

En este caso, también he detectado algo de lentitud, pero como en los anteriores lo achaco principalmente a la configuración de la máquina virtual de pruebas. Por lo demás todo ha funcionado correctamente.

Pensé que el tema de gráficos daría problemas en Linux y por lo que estoy viendo esa parte se comporta muy bien.

Pulsar sobre el link o la imagen para abrir la animación en una nueva pantalla

Aplicar-Efectos-Caractula

Hablando del tiempo…

Esta aplicación está descrita en 2 entradas antiguas del blog y permite conectar con un WebService gratuito que provee datos de tiempo atmosférico con más de 200.00 ciudades en su Base de Datos. Aquí os dejo los links.

Esta aplicación utiliza Frames y trabaja con JSON, ya que todos los datos del WebService vienen en ese formato. La llamadas a WebService se hacen utilizando las Indy. Como la web es http, no necesita librerías SSL, la conexión se realiza sin problemas.

Pulsar sobre el link o la imagen para abrir la animación en una nueva pantalla

Como-Estael-Tiempo

Hay que decir que esta aplicación, tal y como se explica en la entrada y como se ve en el vídeo, con un único código fuente está funcionando en las plataformas Windows, Android y OSX.

A partir de ahora podemos añadir que ese mismo código funciona casi 100% en Linux.

NOTA: Al intentar añadir nuevas ciudades se produce un error y la aplicación se cierra. No he realizado un debug, pero imagino que no debe ser nada grave.

Visualizar rutas en formato GPX

Este último proyecto permite visualizar rutas de GPS grabadas en formato GPX, utilizando el componente TPath de Firemonkey. Todo ello sobre un TLayer3D y un TViewPort3D que permiten en movimiento del plano que muestra la ruta en 3 dimensiones (como se ve e la animación posterior).

Quería probar este proyecto no sólo por esto (que ya lo he probado en otros), sino porque los datos de las rutas que se cargan de un fichero GPX (que es en realidad un formato XML) se almacenan posteriormente utilizando un TClientDataset.

En este artículo de Embarcadero (Linux libmidas file for RAD Studio, Delphi, C++Builder 10.2) se explica que ya está disponible para Linux la librería para Midas. Por lo tanto debería poderse usar TClientDataset sin problemas. Vamos a verlo.

Como era de esperar al intentar cargas los datos en un TClientDataset, me obtenido este error.

Lo siguiente ha sido descargar la librería de la web de Embarcadero, añadirla al Deployment del proyecto para que la distribuya y hecho esto, voilà!! Ha funcionado sin mayores problemas.

Pulsar sobre el link o la imagen para abrir la animación en una nueva pantalla

Ver-Rutas-KML

Y hasta aquí las pruebas y esta entrada.

La verdad he de decir que este paquete me ha sorprendido gratamente. Pensé, que al añadir proyectos con un poco de cara y ojos la cosa empezaría a dar problemas y visto lo visto la cosa va bastante fina. No estoy diciendo que se pueda usar para un proyecto final, pero no lo descartaría (como mínimo habría que revisarlo en más profundidad).

Hay muchos aspectos que quedan sin cubrir, pero para esta primera entrada creo que es suficiente.

Como siempre los comentarios, sugerencias y criticas “constructivas” son bienvenidas.

Hasta la próxima!!

Vota este post
Subscribe
Notify of
guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

4 Comments
Inline Feedbacks
Ver todos los comentarios
casimiro
casimiro
5 years ago

Pues parece que va bien, aunque no se entiende que no apareza Málaga en las ciudades para mostrar la temperatura :D

Aparte de eso, a ver si algún día nos dice el secreto de alargar el día a 48 horas :o

David Esperalta
5 years ago

Muy interesante, Germán, muchas gracias por compartirlo. :-)

4
0
Would love your thoughts, please comment.x
()
x