Xailer 8.1 incorpora un potente y probado servidor Web. Esta funcionalidad ya se introdujo en versiones anteriores de Xailer, pero ahora podemos asegurar es completamente operativa.
Ha sido probada de forma exhaustiva por el grupo de Nefele for Harbour, a los cuales les agradecemos todo el trabajo de test que han realizado.
El servidor web incorporado en Xailer no pretende competir con Apache o IIS, porque entre otras cosas, no incluye soporte de PHP, por ejemplo. Está pensado principalmente para ser usado en todo el proceso de compilación, enlazado y ejecución de archivos CGI en su fase de desarrollo.
Para probar nuestro servidor tan sólo tiene que elegir como tipo de aplicación, el tipo CGI:
Y hacer una pequeña aplicación como esta:
FUNCTION Main()
LOCAL cHtml
TEXT INTO cHtml
<html>
<head>
<meta http-equiv="Content-Language" content="es">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Xailer first CGI</title>
</head>
<body style="background:#6699cc">
<p><b><font size="7">Hello World!</font></b></p>
</body>
</html>
ENDTEXT
StdOut( cHtml )
RETURN NIL
Cuyo resultado es:
Futuras versiones de Xailer van a sacar auténtico partido de esta nueva funcionalidad y las grandes oportunidades que nos ofrecen los archivos CGI para desarrollar software web.
La nueva versión incorpora un completo generador de ayudas en formato HTML que permite crear las ayudas de cualquier aplicación de gestión de una forma muy sencilla y potente.
A partir de la versión 8.1 el control TForm (formulario) incluye una nueva propiedad de nombre XHtmlHelp. Cuando pulse sobre el botón de edición en el inspector de propiedades se le mostrará esta pantalla de edición HTML:
El ID se corresponde con el identificador de la página de ayuda para ese formulario y el título, es el texto que se mostrará en la parte superior de la pagina. Es obligatorio introducir algún ID, sin embargo, no es obligatorio el título. Si lo deja en blanco, simplemente esa página no tendrá título y el área que ocupa el título desaparecerá.
Por cada ayuda que usted cree, Xailer creará un archivo con el mismo nombre que el fuente, pero de extensión .XHH en el directorio ‘source‘ con el contenido HTML del documento recién creado, que incluye todas las imágenes que haya incorporado.
Nuestro sistema de control versiones XVC gestiona de forma automática la existencia de estos archivos y los incluye en el repositorio, sin que tenga que hacer nada más. Si utiliza SVN, deberá añadir los archivos de forma manual a través Tortoise SVN o por línea de comando.
Pulsando la opción de menú Proyecto->Ayudas del proyecto se nos mostrará el gestor de ayudas, que tiene el siguiente aspecto:
En el lado derecho se muestran inicialmente todas las ayudas asignadas a cada uno de los formularios y es su responsabilidad el moverlas al lado izquierdo para construir la tabla de contenidos. Una vez movida a la tabla de contenidos (lado izquierdo), podrá utilizar los botones de dirección para subir, bajar o cambiar su anidación de una forma sencilla. No es necesario que todas las páginas de ayuda que usted cree, aparezcan en la tabla de contenidos.
Observe que existe un botón con unos engranajes que permite compilar las ayudas en un único archivo de extensión .XHLP. Lógicamente, dicho archivo deberá incorporarse como un archivo más de la aplicación que desea distribuir o entregar a su cliente. Xailer crea con todas las ayudas un único archivo comprimido, con un formato propietario, sólo accesible a través de nuestro gestor de ayudas.
En el editor puede incluir todo el texto de se ayuda. Es posible incorporar imágenes, tablas, estilos de texto y enlaces a páginas Web o cualquier otra página de ayuda. Para esto último deberá utilizar como protocolo la palabra ‘help://‘. Por ejemplo si quisiese poner un enlace a la página ‘NuevoCliente’, escribiría el enlace como: ‘help://Nuevocliente‘. Eso es todo.
Para que todo nuestro sistema de ayudas funcione sólo hay que añadir una línea de código al inicio de nuestra aplicación que es:
Este nuevo control permite editar documentos HTML de forma completamente visual y con cierta complejidad ya que permite incluir tablas e imágenes.
El control está basado en el control Summernote, que es un simple editor realizado en JavaScript, que es especialmente liviano, apenas consume recursos y cuya licencia nos permite el uso comercial.
Este control hereda del control TWebView que es un control navegador Web basado en Microsoft Edge que únicamente está disponible para Xailer Enterprise.
No es necesario incluir ningún código fuente de SummerNote, todo está autocontenido. Su comportamiento es exactamente igual que cualquier otro control de Xailer.
Nota importante: las imágenes se guardan dentro del documento
Este control permite mostrar GIFs animados sin absolutamente ningún tipo de retrasos o trompicones. Y esto es debido a que el pintado se hace absolutamente en bajo nivel y en un segundo hilo, lo cual tiene un grado de complejidad muy alto.
Con este control de GIF animado no es necesario llamar a ProcessMessages() para que el control se siga pintando correctamente.
Está disponible para cualquier versión de Xailer, incluso la personal.
Xailer 8.1 incluye soporte de High DPI lo que permite sacar la máxima resolución de los potentes monitores 4K. Para activarlo tan sólo que poner la propiedad Appliction:lDpiAware a verdadero al principio de ejecución de su aplicación. Eso es todo. Realmente esta propiedad lo que hace es que su programa reconozca la verdadera resolución del monitor.
Cuando windows se ejecuta en un monitor de alta resolución y se establece una escala distinta del 100%, los programas reciben una información «ajustada» de la resolución, no la resolución real. De igual forma, cuando un programa establece unas coordenadas determinadas en una ventana, windows reajusta esas coordenadas según el valor de la escala que tenga establecida. P.ej., si windows está configurado con una escala del 150%, cuando un programa establece unas dimensiones de 400×400 pixels en una ventana, windows lo reajusta a un tamaño real de 600×600 pixels, incluidos todos los controles que contenga.
Esto hace que no tengamos que preocuparnos por la escala que tenga windows configurada, pero tiene el inconveniente de que los textos y las imágenes se ven difuminados. Cuando establecemos Application:lDpiAware a .T., nuestro programa trabajará con coordenadas reales, sin ajustes por parte de windows. Las imágenes y textos se verán perfectamente nítidos y en su tamaño original, aunque esto suponga que se verán más pequeños de lo esperado. En estos casos, podemos usar la propiedad Application:nScale para ajustar nosotros la escala deseada sin perder la nitidez de imágenes y textos.
En Xailer 8.1 hemos introducidos dos mejoras en nuestro generador de informes que han sido largamente solicitadas, que son:
El envío directo de los informes a archivos PDF
La posibilidad de anidar múltiples informes en uno solo
Para la primera opción se ha creado una nueva cláusula en el comando REPORT con el nombre TO PDF<cPdfFilename>. Para que está cláusula funcione correctamente el usuario debe de estar utilizando Windows 10 o posterior.
Para la segunda opción hemos creado la cláusula KEEP también para el comando REPORT. Y su uso es muy sencillo: Cuando cree un informe con esta cláusula, éste no se mostrará y se acumulará internamente. Puede apilar todos los informes que desee, incluso con distinta orientación de páginas. Para forzar la terminación del informe no tiene más que quitar la cláusula KEEP en el último informe que realice. Esta cláusula está pensada para ser utilizada conjuntamente con la cláusula PREVIEW o TO PDF en el último informe que se genera.
Esta es una pequeña mejora, pero creo que es digna de mención ya que puede interesar a más de uno.
Para los puristas del modelo vista-controlador, el uso de los clásicos Data-controls de Xailer no es lo apropiado, ya que todo el proceso de edición se produce también en la vista, cuando debería realizarse en el controlador. La forma más conveniente de evitar este problema es utilizar objetos de tipo TMemDataset que devuelven un recordset de memoria que está completamente desvinculado de la tabla de la cual procede. Pero tiene el inconveniente de que las operaciones de inserción y edición son más complejas ya que requiere de la construcción de las cadenas SQL de insert y update de forma manual. Veamos como resuelve este problema Xailer 8.1 con un pequeño ejemplo:
CLASS TControlador
oDataSource
METHOD RSClientes( oRs )
METHOD ClientesUpdate( oRs, nId )
END CLASS
METHOD RsClientes( oRS as CLASS TMemdataset ) CLASS TControlador
WITH OBJECT ::oDatasource
IF oRs != NIL
:QueryMemDataset("SELECT * FROM CLIENTES", "", oRs )
ELSE
oRs := :QueryMemDataset("SELECT * FROM CLIENTES")
ENDIF
END WITH
RETURN oRs
METHOD ClientesUpdate( oRS, nId ) CLASS TControlador
WITH OBJECT ::oDatasource
TRY
:BeginTrans()
:Execute(oRs:SqlUpdate("idCliente", nId ))
// Aquí se pueden hacer más operaciones de forma clara
:CommitTrans()
CATCH
:RollbackTrans()
END
END WITH
RETURN NIL
La operación de update se realiza en el controlador con la ventaja adicional de que podemos incluir cualquier operación dentro de la misma transacción. Para ello se utiliza el nuevo método SqlUpdate( aWhereCols, aWhereValues) que crea la instrucción SQL con sólo las columnas que han cambiado su valor. Como se puede imaginar, también hay un nuevo método de nombre SqlInsert().
Otra de las particularidades que tiene este código en su método RsClientes() que creo es muy interesante, es que el objeto TMemDataset se pasa como parámetro, en vez de crearse en el propio método y devolverse como valor de retorno, que podría ser la primera aproximación que haría cualquier programador. Esta técnica tiene una gran ventaja, que consiste en poder incorporar en el propio formulario un TMemDataset vacío e incluso vincularlo con un browse en el cual hemos definido las columnas completamente y todo de forma visual. Si nuestro método fuera el responsable de crear el TMemdatset y lo retornase como valor de retorno para luego asignarlo al browse con oBrowse:oDataset := oControlador:RsClientes(…) observariamos como todas nuestras columnas del browse desaparecerían ya que se ha asignado un nuevo dataset y eso provoca un reset de todo el control. Por el contrario si pasamos el recordset como parámetro todo se mantiene perfectamente.
Xailer 8.1 será publicado en un futuro próximo y en una serie de breves artículos os iremos desgranando las novedades que incorporará Xailer 8.1, dejando para el final las más importantes. Éste es uno de ellos.
La próxima versión de Xailer 8.1 incorpora todo lo necesario para poder prescindir de cualquier tipo de conexión FTP. Es decir, todas las operaciones clásicas que se realizan por FTP, como:
carga de ficheros
descarga de ficheros
borrado de ficheros
renombrado de ficheros
listado de directorios
creación de directorios
borrado de directorios
Son incluidas en la nueva clase TWebDataSource.
Nota: Los servicios FTP que incluye TWebDatasource están limitados al directorio donde se encuentra el módulo PHP y sus directorios dependientes.
El uso del protocolo FTP cada día es más complejo debido a las distintas opciones existentes: FTP seguro a través de certificado digital (FTPS) que puede ser implícito o explicito, a través de protocolo SSH (SFTP) o FTP no seguro. Desgraciadamente el soporte de Microsoft Windows en su librería WININET a cualquier tipo de FTP aparte del no seguro es nula y la opción más apropiada para atacar este problema habría sido utilizar la librería CURL que está disponible en Harbour, pero su uso es complicado ya que exige la instalación de bastantes DLLs. La otra opción sería utilizar CURL por línea de comando que está disponible en Windows desde hace tiempo, pero eso implica tener que ‘lanzar’ un programa de consola desde nuestra aplicación que no suele gustar ni a programadores ni a usuarios y tampoco a los antivirus.
Por todos estos motivos y uno adicional, que es que es prácticamente imposible que el puerto 80 esté cerrado (que es el que usa la Web), hemos decidido incorporar a nuestra clase TWebDatasource de todos los servicios que incluiría cualquier clase de manejo de ficheros por FTP.
Pero ya puestos, hemos añadido un servicio más, que es la posibilidad de enviar correos electrónicos utilizando uno de las librerías más utilizadas en PHP, que es PHPMailer. Al igual que ocurre con las credenciales de acceso a la base de datos que hay que incluir en el archivo PHP, lo mismo ocurre con las credenciales para el envío de correo. En el propio archivo PHP y bajo la función XA_SendMail() de una forma muy sencilla y sin tener que saber absolutamente nada de PHP se pueden establecer todos los parámetros que deseemos para el envío de los correos.
Os recordamos que está clase sólo está disponible en la versión Enterprise de Xailer.
Para los que seguimos creyendo firmemente que a las aplicaciones de escritorio les queda una larga vida, vemos que la Web está bien para depende que, pero no vemos aún a nuestros clientes realizando sus ventas de fruta conectadas a una báscula serie desde la web o realizando su facturación o su contabilidad desde la nube, bien sea por velocidad, inmediatez, sencillez o por costumbre simplemente.
Pero a todos nosotros, desarrolladores de aplicaciones de escritorio, nos llama poderosamente la atención la riqueza gráfica de los componentes que hay para la Web, auténticas maravillas que por ejemplo permiten hacer graficas multi formato, coloridas y con movimiento.
Y fue uno de estos componentes el que me impactó en cuanto lo vi funcionando dentro de la mayor parte de las Web hechas con WordPress y no es otro que un completo procesador de textos online llamado TinyMCE https://www.tiny.cloud tan completo que casi todas esas Web sustituyen el nativo de WordPress por éste. TinyMCE es multi idioma y totalmente parametrizable para tener el diseño a tu gusto.
Internet está lleno de demos, ejemplos, videos de Youtube como éste, que muestran todo su increíble potencial, tanto que te hará olvidar a Word. Puedes manejar imágenes, recortarlas y girarlas, manejar tablas de datos con gran complejidad, etc. casi todo lo que se te ocurra y encima es un complemento gratuito, aunque también hay una versión comercial más completa, pero la básica es más que suficiente.
Hace tiempo que empezamos a desarrollar aplicaciones WEB como complemento de nuestras aplicaciones de escritorio, de forma que los clientes puedan tener en su bolsillo ciertas utilidades, consultas o resultados de sus aplicaciones de escritorio y para ello empezamos a trabajar con Nefele 4 Harbourhttps://www.nefele.dev Esto nos abrió un universo de posibilidades en la Web y pudimos salir del escritorio, sin dejar de trabajar con el entorno Xailer y el lenguaje Harbour que conocemos y en el que nos sentimos tan cómodos, pero ahora para la Web.
La experiencia recogida en estas aplicaciones Web y la aparición del increíble componente Edge WebView en Xailer 7 nos llevó a preguntarnos si era factible llevar la Web al escritorio y nos pusimos manos a la obra, por que no meter TinyMCE en nuestras aplicaciones a través del WebView integrado. Dicho y hecho, en pocas horas estaba andando.
Ahora tenemos un procesador de texto que genera HTML con toda riqueza de detalles y que podemos grabar en un campo de una base de datos y leerlo desde este campo para mostrarlo de nuevo en pantalla, imprimirlo o casi lo que se quiera.
Adiós al triste campo Memo y adiós al RTF que ya ha cumplido años y tocaba jubilar, bienvenido TiNyMCE.
¿Que hace falta para integrarlo en nuestras aplicaciones Xailer?
1.- Creas un Form con un objeto WebView en su interior. Este ejemplo es nuestro redactor de correos electrónicos y el objeto Webview es el cuadro blanco inferior.
2.- Sobre éste objeto contenedor instancio un componente TinyMCE
WITH OBJECT ::oWebView
With Object ::oTinyEditor := TTinyMCE( ):New( ::oWebView )
End
END
Para ello debemos de contar con la CLASS TTinyMCE que hemos desarrollado y que se incluye en el proyecto Xailer que se adjunta y que puedes descargar desde el área de descargas de Xailer.
Esta clase permite de una forma muy simple parametrizar el aspecto, el menú, los botones y el funcionamiento del editor de textos como puede verse en su definición:
Property cLanguage Init "esp" //Opciones esp, cat , eus, gal, mex
Property lButtonBar Init .T.
Property lAllButtons Init .T. //Muestra una barra de botones con todas las opciones siguientes
Property cFormatButtons Init "bold italic underline |"
Property cFormatExButtons Init "formatselect fontselect fontsizeselect | "
Property lColorButtons Init .F.
Property cColorButtons Init "forecolor backcolor |"
Property lAdjustButtons Init .F.
Property cAdjustButtons Init "alignleft aligncenter alignright alignjustify |"
Property lNotepadButtons Init .F.
Property cNotepadButtons Init "cut copy paste|"
Property lUndoButtons Init .F.
Property cUndoButtons Init "undo redo|"
Property lBulletButtons Init .F.
Property cBulletButtons Init "bullist numlist outdent indent |"
Property lInsertButtons Init .F.
Property cInsertButtons Init "hr link insertfile | quickimage image | emoticons |"
Property lTableButtons Init .F.
Property cTableButtons Init "table |"
Property lSearchButtons Init .F.
Property cSearchButtons Init "searchreplace |"
Property lPrintButtons Init .F.
Property cPrintButtons Init "print export|" //preview
Property lConvertButtons Init .F.
Property cConvertButtons Init "ConvertToWord |"
Property cOwnerButtons Init "" //Para construir una barra especial del control, se mostrarán los controles que aquí se citen
Property cDevelButtons Init "|visualblocks code " //Controles para el desarrollador permiten ver los bloques de texto del Html y editar el código fuente
Property cFontSizes Init "6pt 8pt 10pt 12pt 14pt 18pt 24pt 36pt 72pt"
ACCESS cSelectButtonbar Inline ::cFormatButtons + ::cFormatExButtons + ::cColorButtons + ::cAdjustButtons
Property lAutoSave Init .F. //Mensaje de guardar antes de salir
Property lSpellChecker Init NIL //Usar el corrector ortográfico de Edge
Property lStatusBar Init .T. //Mostrar la barra de estadoY listo, ya sale andando y puedes escribir el texto que quieras o incluso editar WebPages que puedes copiar y pegar desde internet.
3.- Pero como cualquier componente de Internet cada vez que lo invocamos irá a la Web a leer desde un CDN todo lo necesario para su funcionamiento, el código JavaScript, los iconos, etc. con lo cual necesitamos una conexión Internet y unos segundos de conexión. Pero esto puede evitarse si descargamos esta información y la metemos en una subcarpeta de nuestra propia aplicación, por ejemplo en el proyecto de ejemplo .\Xtras\TinyMce y de esta manera logramos independencia total de la Web y mayor velocidad de carga.
Pegas de TinyMCE.
La versión gratuita utiliza el corrector ortográfico del navegador del equipo y solo subraya los errores en el idioma en uso. Además el botón derecho no ofrece listas de correcciones, eso se reserva para la versión de pago. Otra pega es que el botón de pegar desde el portapapeles parece no funcionar en ningún sistema, pero te lo dice y te invita a pulsar Ctrl+V que si funciona.
Y esto no es más que el principio de algo muy grande.
Imagina poder tomar controles de esos que se te cae la baba al verlos por Internet y poder integrarlos en tus aplicaciones de escritorio de forma nativa y sin necesidad de conectarte siquiera a la web.
Por ejemplo, este es un control de calendario https://fullcalendar.io.demos funcionando desde Xailer completamente en local contra una base de datos MariaDB.
Después de haber convertido en un producto completamente gratuito nuestra versión base de Xailer y haber sido un completo éxito debido a su estupenda acogida. Ahora llega el turno de promocionar la versión profesional para hacerla muchísimo más interesante.
A partir de la publicación de este artículo Xailer Profesional recibe dos importantes novedades:
La inclusión de muchos controles que hasta ahora estaban presentes únicamente en la versión ‘Enterprise’, como son:
Acceso nativo a servidores de bases de datos MySQL, MariaDB y SQLite.
Acceso a escáner WIA.
Acceso al editor de imágenes.
Una importantísima reducción en su precio, que pasa de 395 € a 245 €
Y además como oferta de lanzamiento de esta nueva versión. Ofrecemos Xailer Profesional a precio de actualización, es decir, 145 € hasta el 30 de junio de 2021.
Se acabaron las excusas para no empezar a utilizar bases de datos SQL y abandonar definitivamente los ficheros DBF. Además los DataControls de Xailer, incluidos en la versión profesional hacen que el proceso sea muy fácil e intuitivo. Nunca es tarde para hacer el cambio.
Puede realizar su pedido directamente desde este enlace: