Pongo aquí un extenso artículo sobre la escalabilidad de formularios diseñados en Delphi. Esta es una característica de la clase TForm, vigente desde la primera versión de Delphi, que hasta la fecha no había puesto en práctica en mis aplicaciones y que ahora, debido a un cambio de equipo que me ha llevado a ver su funcionamiento, he tenido que investigar y adaptar. Este tema no está todo lo bien documentado que sería deseable en la ayuda de Delphi, por lo cual he empleado bastante tiempo en descifrar las claves de cómo está implementado, las cuales obedecen a una lógica algo peculiar que conviene conocer y que entraña cierta complejidad. Tampoco he localizado mucha información en la web, si acaso tres o cuatro foros donde se planteaban estas cuestiones y casi siempre sin llegar a una conclusión definitiva.
Puede que a algunos esto no os merezca mucha atención, pero estoy seguro de que en los próximos años, con la creciente proliferación de monitores de gran tamaño, la escalabilidad visual de nuestras aplicaciones será un requisito casi elemental.
Configuración de Windows
Me introduje en este tema hace unos meses cuando adquirí un equipo nuevo, que venía con Windows 7, y a su vez me hice con un monitor panorámico de 22 pulgadas, un pantallón con el que trabajar a gusto distribuyendo todas las ventanas laterales que trae Delphi sin quitar espacio para el formulario que se está diseñando. Pues bien, con una resolución de 1920 x 1080 pixels, se dispone de un gran espacio de trabajo, pero, a su vez, todo se ve bastante pequeño, me refiero a las letras, iconos del escritorio ... etc. Para verlo todo más grande, muchas veces optamos por disminuir la resolución de pantalla, pero en ese caso perdemos ancho o alto para "encajar" más ventanas, aparte de que esto nos resta superficie para ver/editar imágenes grandes y precisamente es algo que quería evitar. Windows 7 nos ofrece una forma rápida para conseguir verlo todo más grande (Windows Vista también, aunque de forma ligeramente diferente), si vamos a Pantalla en Panel de Control, veremos que se pueden ajustar los elementos del escritorio a un tamaño Más pequeño (100%), que es el predeterminado, a uno Mediano (125%) o a uno Más grande (150%) - (ver Nota 1). De esta forma, no perdemos la resolución del monitor y en cambio los iconos del escritorio, menús y barra de tareas, así como las fuentes asociadas, se ven a un tamaño que no cansa a los ojos. En Windows Vista hay que ir al Panel de Control - Apariencia y personalización y pulsar "Ajustar tamaños de fuentes (PPP)", pudiendo elegir entre Escala predeterminada (96 ppp) o Escala grande (120 ppp). En Windows XP, aunque esté más oculto y por lo tanto sea menos utilizado, se logra lo mismo accediendo a la ventana de Propiedades de Pantalla - Configuración - botón Opciones avanzadas - pestaña General - Configuración en puntos por pulgada. Windows anteriores como 2000, 98 o 95 logran algo de forma igual o parecida a XP, ofreciéndolo bajo la elección entre fuentes pequeñas o grandes.
Cuando alteramos estas opciones, Windows modifica el valor de unos parámetros de sistema utilizados para mostrar cualquier elemento en pantalla: LOGPIXELSX y LOGPIXELSY. Estos parámetros indican cuántos píxels corresponden a una pulgada en un dispositivo de salida, bien sea una impresora, un monitor ... etc, también llamados DPI (Dots Per Inch, en inglés), o PPP (Puntos Por Pulgada, en castellano). De esta forma, Windows no envía ninguna orden a la tarjeta gráfica para que reajuste la resolución, en cambio se altera el tamaño de las fuentes del sistema y deja a la decisión de cada aplicación la forma como responda ante estos parámetros, a los que en adelante me referiré como DPI. Esa facilidad de W7 para cambiar la apariencia del entorno de trabajo, recurriendo directamente a cambiar los DPI, es lo que hizo que me diera cuenta de la forma como estos parámetros afectaban a mis aplicaciones con Delphi.
Por ejemplo, en W7, si establecemos para la pantalla un tamaño Mediano (125%), se fijan los DPI del sistema a 120, y todos los elementos del escritorio crecen proporcionalmente, así como en otras aplicaciones donde los menús y fuentes aparecen más grandes. Si abrimos un archivo gráfico con un programa como MS Paint, por ejemplo, con los DPI a 120, veremos que los menús y barras de herramientas son algo más grandes, en cambio la imagen mostrada no aparece ampliada, sino que ocupa todos los píxels que permite la resolución del monitor, ya que ésta no ha cambiado. Una forma fácil de ver qué apariencia tendrá una aplicación según distintos DPI, sin necesidad de cambiar la configuración de Windows, es abrir el IExplorer y poner el zoom (abajo a la derecha) a 125%, que equivale a unos 120 DPI, y si lo ponemos a 150% equivale a 144 DPI.
Pero esto afecta también a los programas propios que hayamos desarrollado con Delphi. La apariencia, cuando abrí ciertos programas propios, no podía ser más desastrosa: letras enormes, paneles y botones que habían crecido de tamaño hacia derecha y abajo, empujando con ello a otros controles alineados ...etc, en cambio, el tamaño del formulario se mantenía igual, por lo que casi un tercio de los controles habían desaparecido al quedar desplazados y se mostraba una barra de scroll, o las dos. Puesto que, como explicaré más adelante, esto también afecta mientras trabajamos con el IDE de Delphi, y en mi caso quiero tener fijado mi entorno a tamaño mediano (120 DPI), he tenido que estudiar a fondo el asunto y darle una solución.
Hay que aclarar que Delphi sólo toma en consideración el parámetro LOGPIXELSY, es decir los Puntos Por Pulgada verticales, ignorando los horizontales. Como veremos más adelante, dicho parámetro se lee al arrancar la aplicación y se guarda en la propiedad PixelsPerInch del objeto Screen (sólo lectura), también en la propiedad del mismo nombre de las clases TForm y TFont (lectura-escritura). Como consecuencia de esto, Delphi no contempla la posibilidad de escalar formularios ni controles de forma distorsionada, donde se den diferentes DPI para cada dimensión, algo que aunque es permitido por muchos monitores, no se encuentra en la configuración de Windows (al menos no en las opciones de usuario).
Pongo aquí una rutina para averiguar dichos parámetros referentes a la pantalla:
procedure GetSystemDPI(var HorizDPI, VertDPI: Integer); var DC: HDC; begin DC := GetDC(0); try HorizDPI := GetDeviceCaps(DC, LOGPIXELSX); VertDPI := GetDeviceCaps(DC, LOGPIXELSY); finally ReleaseDC(0, DC); end; end;
En adelante expongo mis averiguaciones y conclusiones sobre cómo las aplicaciones Delphi se adaptan a estas configuraciones de Windows.
____________________________________
Nota 1: En realidad es algo más complicado ya que Windows Vista y W7 tienen dos formas de hacer que los elementos crezcan o disminuyan de tamaño, sin afectar en ambos a la resolución de la pantalla. En una modifica el valor de los DPI, ésta es la que puede afectar a nuestras aplicaciones. En la segunda ignoro qué parámetros modifica, pero no crea ningún efecto secundario a nuestras aplicaciones. Además, tanto en Windows Vista, pulsando el botón "Configuración personalizada de ppp", como en Windows 7, si pulsamos la opción "Establecer tamaño de texto personalizado" (también en versiones anteriores se usa una opción parecida), podemos establecer los pixels por pulgada de forma manual y a nuestro gusto. Pues bien, si en Vista o W7 activamos la casilla "Usar ajuste de ppp con el estilo de Windows XP", entonces se alteran los DPI del sistema; si lo desactivamos Windows cambiará el tamaño pero sin modificar los DPI, por lo que nuestras aplicaciones no se verán afectadas.
Otra curiosidad es que, en Windows 7, si nos atenemos a las tres opciones que por defecto nos ofrece desde el Panel de Control - Pantalla (y que seguramente sean los que más utilicen la mayoría de usuarios), cuando estamos en el tamaño Más pequeño (100%), los DPI tiene un valor de 96, si cambiamos el tamaño a Mediano (125%) los DPI valen 120, y si cambiamos a Más grande (150%) los DPI valen ¡¡ 96 !! (al menos en mi máquina, claro). ¿Curioso este último? Pues sí, por lo visto Windows desactiva por defecto la casilla de "Usar ajuste de ppp con el estilo de Windows XP" para el tamaño Más grande; si activamos esa casilla manualmente, los DPI pasarán a valer 144.
Todos estos cambios, al aplicarlos, requieren que Windows cierre la sesión. En versiones antiguas (2000 y anteriores) a su vez se pide instalar las fuentes correspondientes a cada escala, por lo que si no las encuentra en el sistema pide el CD de instalación.