En este Episodio vamos a crear nuestra Aplicación Cliente la cual enviará las peticiones http GET a nuestro Servidor Datasnap para obtener información de los métodos Usuario y Habitaciones.
Escribiremos el código necesario para procesar los dos tipos de RESPONSE que vimos en el Episodio 2.2 y mostraré las diferencias de serializar los objetos JSONObject y FDJSONDataSets. Esto lo haremos en dos aplicaciones independientes que nos servirán de prueba para después implementar el código realizado en la Aplicación Cliente principal.
***En el siguiente video vamos a consumir los métodos Usuario() y Habitaciones() que nos regresarán la clase TJSONObject.
***En el siguiente video vamos a consumir los métodos getUsuario() y getHabitaciones() que nos regresarán la clase TFDJSONDataSets.
Ya vimos como enviar las peticiones GET y consumir los métodos de nuestro Servidor DataSnap y la implementación de los métodos en la Aplicación Cliente se harán con aquellos que nos regresan la clase TJSONObject ya que nos permitirá desarrollar clientes desde cualquier herramienta de programación y no solo desde RAD Studio, sin embargo ustedes podrán decidir cual será su favorito.
Dicho lo anterior, todas las peticiones GET, PUT y POST que se agreguen a partir ahora se escribirán con ResponseTJSONObject y solo haremos un método para las peticiones PUT y POST como ejemplo ilustrativo de la clase TFDJSONDataSets los cuales se consumirá en una pequeña aplicación por separado, los demás métodos se consumirán directamente en nuestra Aplicación Cliente.
***En el siguiente video vamos a implementar los métodos vistos anteriormente en nuestra Aplicación Cliente y se compilará para el Escritorio de Windows (Win10) y para el Escritorio de Linux (Ubuntu).
Con esto terminamos el Episodio 3. En el siguiente Episodio veremos como generar una app Android a partir de nuestra Aplicación Cliente Base.
***Mientras tanto los invito a iniciar sus pruebas con peticiones GET y consumir sus métodos con la opción que mas les interese.
En éste Episodio vamos a escribir un par de métodos para poder pasar a la siguiente etapa que es la construcción de las Aplicaciones Cliente y de esa forma avanzar con el proyecto.
Posteriormente cada método que se agregue en el Servidor, se hará la el proceso para el llamado del mismo desde la Aplicación Cliente para avanzar de forma paralela.
Primero vamos a rediseñar el método ValidaUsuario() ya que requerimos que además de validar que el usuario existe es necesario obtener la información del usuario que inició sesión en el sistema y mostrarla en la ventana principal.
Posteriormente vamos a crear el método Habitaciones() el cual nos regresará la información de las habitaciones para generar lo que en hotelería se le conoce como Rack de Habitaciones.
Un Rack permite visualizar de forma inmediata el estado de las habitaciones (Disponible, Ocupada, Limpia, Sucia, etc.) en una relación Habitación / Día, la siguiente imagen nos muestra un ejemplo de éste visor .
Vamos a mostrar dos formas diferentes de regresar objetos JSON para que ustedes decidan cual se adapta a sus necesidades. Para realizar esto se van a utilizar las siguientes clases:
TJSONObject
Con esta clase se creará el mapeo JSON del DataSet para que puedan escribir Aplicaciones Cliente con cualquier herramienta y poder serializar el contenido con formato JSON y extraer la información contenida.
TFDJSONDataSets
Con esta clase se creará el mapeo JSON del DataSet en formato «mime encoded binary content» por lo que solo será útil cuando se use RAD Studio en ambos extremos es decir tanto en el Servidor como en el Cliente.
***En el siguiente video vamos a crear los métodos con el objeto TJSONObject.
***En el siguiente video vamos a crear los métodos con el objeto TFDJSONDataSets
Con esto terminamos el Episodio 2 el cual hice en dos partes para separar el motor y los métodos que serán consumidos.
En el siguiente Episodio comenzaremos a diseñar nuestra aplicación de Escritorio para las plataformas Windows y Linux.
***Mientras tanto los invito a experimentar con la creación de métodos utilizando los dos enfoques TJSONObject y TFDJSONDataSets .
En este Episodio vamos a crear el núcleo de nuestro proyecto que nos permita la comunicación a través de Internet, de Red local o en el Localhost a las Aplicaciones Cliente desarrolladas en diferentes plataformas.
Construiremos una aplicación que permitirá a las Aplicaciones Cliente invocar los métodos implementados utilizando una tecnología llamada DataSnap la cual genera automáticamente la interfaz de comunicación entre las aplicaciones Cliente y el Servidor.
Antes de iniciar la creación de nuestro Servidor DataSnap vamos a definir algunos métodos que serán invocados desde las aplicaciones Cliente.
Métodos Get
Validación de Usuario para Iniciar Sesión en el Sistema
Obtener Información de las Habitaciones para crear el Rack de Habitaciones
Obtener Detalle de una Habitación en particular
Obtener Información de Huéspedes o un Huésped en particular.
Obtener Listado de Productos o un solo Producto
Obtener Estado de Cuenta
Métodos Post
Check In
Consumos
Pagos
Check Out
Clientes
Creando el Servidor DataSnap
***En el siguiente video veremos como crear un Servidor DataSnap de forma simple y rápida. Una vez creado probaremos su funcionamiento con dos métodos que seguramente ya conocen EchoString() y ReverseString().
Como pudieron ver, crear el motor base de un Servidor DataSnap es muy fácil y muy rápido.
A continuación vamos a construir un método para validar la existencia de un usuario, dicho método requerirá el envío de los elementos USUARIO y CLAVE, se realizará la consulta a la base de datos y el retorno del método será de tipo Boolean, es decir Falso o Verdadero según corresponda.
Método para la Validación de Usuarios
***El siguiente video muestra como crear el Método para validad Usuario y Contraseña.
Ahora sabemos que crear un método con acceso a base de datos es muy fácil, éste método es muy simple porque solo valida si existe o no el registro solicitado y nos regresa un campos Booleano, muy simple pero la idea era mostrar la capacidad de generar métodos en el servidor DataSnap.
En el siguiente Episodio veremos ***Bloopers incluidos 🙂 *** como se regresan DataSets a las aplicaciones cliente y la facilidad con la que lo podemos hacer con nuestra querida herramienta de trabajo.
***Mientras tanto, los invito a experimentar con mas métodos que regresen datos simples y cualquier duda o comentario con gusto la ampliamos 😀
En el segundo Embarcadero Dev Lounge Latinoamérica al cual fui invitado hablamos acerca de porqué desarrollar para Linux, los pros y los contras de aprovechar dicha plataforma y algunas estadísticas acerca de segmento de mercado ocupado tanto por la versión Servidor como de la versión Escritorio y me recordó que en el CodeRage XII presenté la experiencia que obtuve al desarrollar una aplicación multiplataforma.
En dicha presentación mostré un ejercicio que intentaba transportar una aplicación de escritorio VCL a Linux utilizando el nuevo FMXLinux y por supuesto quise hacerlo también a las diversas plataformas que tenía a la mano, es decir, una Laptop con Windows, una Tableta con Android, una Laptop con OSX (Air Pro) y una Máquina Virtual con Linux (Ubuntu).
El resultado de ese primer intento es la siguiente imagen:
Dicha imagen muestra visualmente que se puede crear la misma aplicación para las diversas plataformas, sin embargo, aún no estaba de todo lista ya que por falta de tiempo en ese momento, agregué accesibilidad de Base de Datos solo a la aplicación Linux y a las demás plataformas solo interfaz gráfica, es decir, sin acceso a Base de Datos.
Y bueno, como ya estarán enterados, próximamente se lanzará al mercado el nuevo Delphi 11, por lo que aprovecharé este lanzamiento para continuar con mi proyecto multiplataforma el cual intenta mostrar que podemos desarrollar un Proyecto Multiplataforma con nuestra querida herramienta de trabajo.
Así que para iniciar esta aventura comenzaré por plasmar la idea de lo que quiero desarrollar.
Espero que el poco tiempo libre que me queda en el día a día me permita avanzar a un buen ritmo y sobre todo aprendiendo algo nuevo cada día.
Idea de concepto
Desarrollar un API que corra en un servidor (Windows/Linux) que permita acceder a él desde cualquier aplicación cliente ya sea desarrollada con Delphi o con cualquier otro lenguaje.
Alcance del proyecto
Gestionar la operación básica de un hotel desde el registro del huésped (CheckIn), el uso de las instalaciones (Consumos) hasta la salida del Hotel (CheckOut).
Etapas
Las etapas iniciales de éste proyecto contemplan las siguientes tareas:
Creación de la Base de Datos (Firebird/PostgreSQL/Interbase/MySQL – La que se quiera utilizar). ***Ver el Episodio 1***
Creación de un cliente Web (Herramienta por definir).
Nota: Como en la vida real, dichas etapas podrán sufrir cambios de acuerdo a las necesidades y/o nuevas ideas que surjan durante el desarrollo de cada una de ellas ya sea propias o de ustedes que me acompañaran en este viaje.
Hola amigos, en esta ocasión toca hablar del nuevo y esperado Delphi para Linux Desktop y que le han llamado FMXLinux . Comenzaremos por dar su definición y los pasos a seguir para la configuración del ambiente de desarrollo, terminando con la ejecución de un ejemplo simple, si lo adivinaron…. el típico «Hola Mundo». 🙂
Ésta implementación Linux para Firemonkey es un complemento adicional que se instala en las ediciones Enterprise y Architect de Delphi y RAD Studio. Está disponible para clientes Delphi y RAD Studio Enterprise que cuentan con la Suscripción de actualización y la podrán descargar a través del GetIt Package Manager.
– Permite crear aplicaciones GUI para Linux, extendiendo el framework de plataforma cruzada FireMonkey de Delphi.
– FMXLinux expande el soporte de Delphi a las distribuciones populares de Linux.
– Incluye varios estilos de interfaz de usuario listos para usar.
– Muchos de los componentes de FMX, como grids, widgets, etc. funcionan perfectamente en clientes Linux.
– Tiene soporte de WebKitGTK para ejecutar una aplicación FMXLinux como una aplicación web HTML5 en el navegador.
Pre-Requisitos
Antes de instalar FMXLinux, es necesario tener instalado el soporte de la plataforma Linux para Delphi. Podemos verificar si tenemos instalado Delphi Linux 64-Bits desde el menú Tools > Manage Platforms como se muestra en la siguiente imagen:
Una vez que nos aseguramos que tenemos instalada la plataforma Linux, ya podemos descargar e instalar el complemento FMXLinux, para ello vamos al menú Tools > GetIt Package Manager, buscamos por «fmxlinux» y nos mostrará dos descargas, el complemento y ejemplos.
Instalamos el complemento y si lo deseamos descargamos los ejemplos para probar el funcionamiento, Al final del proceso se reiniciará el IDE.
Por supuesto necesitamos una maquina linux para poder correr nuestros programas; en mi caso instalé Ubuntu Desktop 16.04.6
Se preguntarán porque una versión antigua… Bueno, les diré que antes de instalar ésta versión de Ubuntu, instalé dos versiones mas actuales.
– Ubuntu 18.04.2 LTS – Ubuntu 19.04
Sin embargo, no pude configurar el SDK de ubuntu para que funcionara con éstas versiones de Ubuntu Desktop, al final tuve que instalar la versión que mencioné y el SDK se instaló sin problemas, debido a mi desconocimiento de Linux perdí 3 noches intentando instakar el SDK sin éxito hasta que en un último intento funcionó con Ubuntu 16.04.6.
PD: Recien me he enterado que mi buen amigo Germán Estévez (Neftalí) tiene instalada la versión 18.04 y funciona correctamente.
Lo dicho, tengo que estudiar Linux 🙂
Instalar Linux SDK
Para instalar el SDK de Linux se requiere de instalar un repositorio, abrimos una terminal y escribiremos las siguientes instrucciones:
sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
sudo apt install ubuntu-sdk
Instalar «Platform Assistant» ( PAServer ) en Linux
Necesitamos instalar «Platform Assistant» en Linux para construir e implementar aplicaciones de Linux. PAServer le permite usar el Administrador de implementación, importar el SDK de Linux y realizar una depuración remota en un sistema Linux, tal y como se hace con Android, iOS, OSX, etc.
Para instalar PAServer en Linux siga estos pasos:
– Copie el archivo LinuxPAServer20.0.tar.gz a un directorio local de la máquina Linux.
– Abra una Terminal.
– Vaya al directorio donde se localiza el archivo LinuxPAServer20.0.tar.gz.
– Descompacte el archivo LinuxPAServer20.0.tar.gz con el siguiente comando tar –xvf LinuxPAServer20.0.tar.gz.
– Se creará el subdirectorio PAServer-20.0. Y aquí encontrará los binarios de la «Platform Assistant».
Instalar dependencias en Linux
Para usar características gráficas en su aplicación de servidor, es necesario instalar algunas dependencias. No se requiere instalar todo el sistema X11 en la maquina. Para instalar dependencias en Ubuntu/Debian, abra una Terminal y escriba lo siguiente:
Al instalar FMXLinux a través de GetIt, el sistema registra un «DLL Expert» que agrega el menú contextual la opción «Agregar plataforma Linux» que se indica a continuación y también agrega la carpeta de la biblioteca del repositorio de catálogo a la Ruta de la biblioteca para la plataforma Linux. Puede verificar esto en Tools > Options > Language > Delphi Options > Library y elegir Linux de 64 bits.
Crear un perfil de conexión
Para crear el perfil de la conexión es necesario que PAServer esté en ejecución en la máquina Linux, para ello abra una terminal y entre al directorio donde se ha descompactado el archivo LinuxPAServer20.0.tar.gz y ejecute el comando ./paserver como se muestra en la imagen siguiente:
A continuación entramos a Delphi RIO en el menú Tools > Deployment > Connection Profile Manager y presionamos el botón [Add], agregamos la plataforma, la máquina Host, el puerto y la contraseña (si ha solicitado una), una vez que hemos llenado las propiedades de la conexión, probamos que se conecte correctamente presionando el botón [Test Connection] y si todo sale bien presionamos el botón [Save] y salimos.
Ya estamos listos para construir nuestra primer aplicación Linux. Abrimos (File > Open) o creamos un nuevo proyecto Firemonkey (File > New > Multi-Device Application) .
A continuación presionamos el botón derecho del mouse sobre el Proyecto y seleccionamos Add Linux platform.
Seleccionamos la plataforma Linux de 64 bits (en mi caso Ubuntu 16.04.6 LTS -fmxLinux profile) e implementar muestras aplicaciones GUI en Linux. Hay que asegurarnos que PAServer se está ejecutando en la máquina Linux de destino.
Atención: Al crear una aplicación FMXLinux, puede aparecer un mensaje de error que dice que System.Devices no es compatible con esta plataforma.
Esto sucede porque las rutas de la biblioteca no están configuradas correctamente y, en lugar de compilarse con el archivo DCU adecuado, el compilador busca la versión original del archivo de código fuente, que no es compatible.
Delphi Linux soporta RedHat Enterprise y las distribuciones Ubuntu que se muestran en la siguiente imagen:
Y bien, ya que hemos terminado de configurar nuestro ambiente Linux Desktop.
Agregamos un botón a la forma de nuestro proyecto y el código respectivo para mostrar el ya famosísimo «Hola Mundo».
Compilamos y ejecutamos y como se esperaba ya podemos ver nuestra aplicación Delphi corriendo en Linux.
Así de fácil y rápido.
Como pueden ver, el funcionamiento es el mismo que ya conocemos para crear aplicaciones multiplataforma así que no tendrán problema para desarrollar aplicaciones Linux.
Además ya existe mucho material en la nube acerca de éste complemento FMXLinux.
Ésta entrada está basada en el ejemplo FMXEmbeddedForm (Delphi) localizado en la wiki de documentación de Embarcadero donde nos muestra como incrustar una forma dentro de otra y la intención de la presente entrada es desarrollar paso a paso la forma como hacerlo con Delphi XE7.
Y sin más preambulo comenzaremos creando una aplicación multi-dispositivo, para ello seleccionaremos en los proyectos de Delphi la opción Multi-Device Application.
Posteriormente seleccionamos el tipo de aplicación multi-dispositivo, personalmente utilizo una aplicación en blanco.
A continuación agregamos una nueva forma multi-dispositivo desde el menú File –> new –> Multi-Device Form – Delphi como se muestra en la siguiente figura.
Elegimos el tipo de Forma HD y presionamos el botón OK.
Antes de continuar guardamos nuestro proyecto, la unit1 la guardamos como uFormaPadre y la unit2 como uFirmaIncrustada, al proyecto le pueden asignar el nombre que deseen.
Agramos a nuetra formaPadre dos componentes, 1 ToolBar con la propiedad Align = Top y 1 Panel con la propiedad Align = Client como se muestra en la siguente figura.
En la formaIncrustada agregamos tres componentes, 1 TabControl con la propiedad Align = Client donde agregué 3 Tabs y dos TButton, ustedes pueden agregar los componentes que deseen, la idea es mostrar la forma con algunos componentes para poder observar fácilmente el efecto deseado.
El siguiente paso es agregar la unidad uFormaIncrustada en nuestra formaPadre, para ello pueden hacerlo presionando Alt-F11 o en el menu File –> Use Unit o escribiendo manualmente la unidad en una sección Uses de la formaPadre.
Adicionalmente agregamos un procedimiento llamado EmbeddedForm() en la sección Private de la clase Tfrm_Padre (TForm1 si no cambiaron el nombre de la forma) como se muestra en la siguente imagen, a continuación presionamos Ctrl + Shift + C para agregar nuestro procedimiento en la sección de implementación y escribimos el código que se realizará cuando se llame a dicho procedimiento.
Ahora ya podemos hacer la llamada a nuestro procedimiento, en éste caso se ha decidido seguir el ejemplo de la Wiki de Embarcadero utilizando el evento OnCreate de la formaPadre, en la siguente figura se muestra dicha llamada.
Podemos observar que el procedimiento va a incrustar la formaIncrustada en el objeto Panel de la formaPadre en el momento que la aplicación se crea, ustedes pueden jugar con la formaPadre para ejecutar el procedimiento en el momento que lo deseen, incluso pueden agregar código a la formaIncrustada para que ejecute lo que deseen una vez que ya está incrustada en la formaPadre.
En éste momento nuestra aplicación ya está lista para ser ejecutada en cualquiera de los dispositivos que desee y que están disponibles en DelphiXE7 , en mi caso lo hice para Android y para Windows 32Bits, pero se puede compilar sin problema para los demás y utilizando el mismo código por supuesto.
A continuación pueden ver la imagen en los dós dispositivos compilados.
Android teléfono LG-P880
Windows 32 Bits
Descargas
Si lo deseas puedes descargar el código fuente de ésta entrada, espero sea de utilidad.
Ésta entrada y el código fuente son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.
El día de hoy vamos a revisar un componente muy interesante llamado MultiView. Éste componente permite la implementación de interfaces gráficas maestro-detalle, es decir, el panel principal (master) contendrá los controles de la aplicación y el panel detalle (detail) muestra la información basada en los controles del panel maestro.
La siguiente pantalla muestra un ejemplo de interfaz maestro-detalle. En el panel principal (izquierda), se introduce una posición geográfica y en el panel de detalles (derecha) podrá ver el mapa Google apropiado.
Siguiendo el tutorial que se encuentra en la docwiki de embarcadero pude desarrollar la app para Android, que bien pudo haber sido para iOS o para Windows, o porque no, hacer una aplicación para todas y cada una de las plataformas, como lo hice con la serie de RAD Studio XE4.
Me parece un componente muy interesante y muy sencillo de utilizar, el panel de controles se oculta automáticamente y se muestra deslizando el borde de la pantalla, algo como se muestra en la siguiente imagen:
Así quedó mi diseño siguiendo el ya mencionado tutorial:
Los invito a poner en marcha su imaginación y desarrollen alguna aplicación con éste componente, les aseguro que quedarán gratamente sorprendidos,
Nos leemos.
Descargas
Si lo deseas puedes descargar el código fuente de ésta entrada, espero sea de utilidad.
Ésta entrada y el código fuente son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.
Vamos a ver en varias entradas los cambios que se han hecho con el lanzamiento de RAD Studio XE7 pero específicamente los cambios hechos a FireMonkey.
En XE6 se tenía que elegir entre tres tipos de aplicaciones FireMonkey, aplicaciones de escritorio, Aplicaciones Metrópolis y aplicaciones móviles como lo podemos observar en el IDE de XE6.
En RAD Studio XE7 se ha creado una sóla opción donde se puede elegir tanto aplicaciones de escritorio como aplicaciones móviles, de hecho permite la creación de todas las plataformas soportadas, a ésta nueva forma de crear aplicaciones se le ha llamado «Multi-Device Aplication» y otra donde podemos crear aplicaciones Metrópolis.
Ésta característica Multi-Device está soportada en dos de las tres grandes bibliotecas de RAD Studio, FireMonkey y la RTL, la VCL no está soportada en ésta característica.
Personalmente me ha gustado mucho la nueva forma de acceder a las aplicaciones FireMonkey con la Multi-Device com lo podemos ver en las siguientes imágenes.
Como podemos ver, contamos con las 4 grandes plataformas Windows, OSX, iOS y Android y dentro de ellas podemos destacar la gran variedad de dispositivos incluyendo Google Glass.
Lo dicho, me gusta mucho ésta nueva versión de RAD Studio que cuenta con muchas mejoras y muchas cosas nuevas que iremos viendo poco a poco.
Nos leemos 🙂
Ésta entrada y cualquier código fuente publicado en ésta bitácora, son libres para su uso y publicación, lo único que te pido, si te parece justo, es mencionar la fuente de donde se obtuvo.
A mediados de ésta semana que está por terminar, descargué e instalé RAD Studio XE7 y al comenzar la migración de una de las aplicaciones que he desarrollado en Delphi XE6 a Delphi XE7, me encontré con un pequeño detalle al ejecutar la app en mi teléfono móvil.
Como preámbulo les comentaré que el programa consume un Servicio Web para obtener el Tipo de Cambio de diversas monedas (Exchange Rate) el cual funcionaba perfectamente en XE6, pero con XE7 me encontré con un error desconocido para mí hasta el momento,
No Selected DOM Vendor
Me puse a investigar porqué en Delphi XE7 me mostraba dicho error y en Delphi XE6 no, en poco tiempo encontré la solución en la Wiki de Embarcadero.
El tema es porque RAD Studio utiliza de forma predeterminada el proveedor MSXML, y si no se especifíca otro proveedor (OmniXML o AEDOM) nuestras aplicaciones no soportarán otras plataformas mas que Windows y nos mostrará el error que da pie a ésta entrada «No Selected DOM Vendor».
Si requerimos de utilizar otras plataformas el proveedor OmniXML es la mejor opción (por cierto es una de las nuevas características en ésta versión en el rubro de «mejoramiento de la RTL y la VCL», como se puede ver en la lista de nuevas características).
Para resolver el problema de multi plataforma de mis aplicaciones usé la siguiente compilación condicionada:
Con ésta compilación condicionada le indicamos que cuando sea una aplicación para la plataforma Windows utilice el proveedor MSXML y si es otra plataforma utilice el proveedor OmniXML.
Con éste cambio, mi aplicación funcionó sin problemas y ya puedo continuar con mi proyecto.