Archivo por meses: noviembre 2022

Xailer 8.1 – Soporte High DPI Desktop Application Development

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.

Más sobre Xailer 8.1 en breve.

Un saludo

Xailer 8.1 – Mejoras en el generador de informes

En Xailer 8.1 hemos introducidos dos mejoras en nuestro generador de informes que han sido largamente solicitadas, que son:

  1. El envío directo de los informes a archivos PDF
  2. 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.

Más novedades sobre Xailer 8.1 en breve.

Un saludo

Xailer 8.1 – Mejoras en TMemDataset

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.

Y eso es todo por ahora. En breve, más novedades.

Un saludo

Xailer 8.1: Mejoras en TWebDatasource

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.

Un saludo