22 de mayo de 2016

Alinear el texto verticalmente en los controles Labels en VFP 9

Si hay algo que siempre me ha molestado es que el texto de los controles LABEL no se puede alinear verticalmente.

Eso produce situaciones como la siguiente:

He añadido un borde a los controles LABEL para que pueda verse su tamaño. La solución que se me ocurre en estos casos es cambiar la altura del control, y alinear los centros horizontalmente con los controles TEXTBOX adyacentes:

Como esto me parece demasiado trabajo, siempre estuve pensando en encontrar una solución a este problema, y leo en algún lado que en VFP9 está la propiedad ROTATION del control LABEL, y que si se fija en 360 grados, el texto se centra verticalmente en la etiqueta! El problema es que el texto se centra también horizontalmente. Me pregunto ¿Por qué no respetará el valor de la propiedad ALIGNMENT?

Como la idea es que el texto quede alineado horizontalmente a la derecha, me pongo a pensar un poco, y decido añadir el siguiente código en el evento INIT de mi clase base LABEL:

If Not Pemstatus(_Screen,[lblVertAligned],5) Then 
_Screen.AddObject([lblVertAligned],[Label])
Endif
With _Screen.lblVertAligned
.Top = -100
.Visible = .T.
.AutoSize = .T.
.FontBold = This.FontBold
.FontItalic = This.FontItalic
.FontName = This.FontName
.FontSize = This.FontSize
.FontStrikethru = This.FontStrikethru
.FontUnderline = This.FontUnderline
.Caption = This.Caption
.Anchor = This.Anchor
This.Anchor = 0
This.Rotation = 360
This.Width = .Width
This.Anchor = .Anchor
Endwith

El objetivo de este código es fijar la propiedad ROTATION en 360, con lo que se logra el deseado centrado vertical y fijar el ancho del control LABEL para simular la propiedad AUTOSIZE, pero solamente en el sentido horizontal. De esa forma se logra que el texto parezca "alineado" a la izquierda.

La idea es en tiempo de diseño crear los objetos LABEL como se mostraba en la primera figura, obviamente sin los bordes:

Mi clase base TEXTBOX tiene una altura de 23 píxeles, para poder usar cómodamente la grilla estándard. Experimentando, comprobé que la alineación óptima se logra dando a los controles LABEL una altura de 24 píxeles. En tiempo de ejecución, el resultado es este:

He trazado una delgada línea roja en la imagen, para que se pueda comprobar que la alineación es perfecta.

Espero les sirva.

Carlos Alloatti


No hay comentarios. :

Publicar un comentario