Antes de la llegada de VFP 9.0 necesitábamos programar el evento Resize de los contenedores para reconfigurar la posición y tamaño de los controles contenidos al redimensionar contenedores. La nueva propiedad ANCHOR que se agregó a los controles en VFP 9.0, define los bordes del contenedor a los que un objeto contenido va a estar anclado. ¡¡Bien!!
Es una propiedad de Lectura / Escritura en tiempo de diseño y tiempo de ejecución. En la Ayuda hay ejemplos de posibles valores, algunos valores No recomendados y poco más. La utilidad de esta propiedad me anima a comentar un poco sobre ella para sacarle el mayor provecho.
En este escrito veremos la base sobre las que se rige esta propiedad, ejemplos de valores adecuados en dependencia al tipo de control, posibles conflictos que se pueden presentar y para finalizar vamos a describir los elementos que integran el editor para esta propiedad - Anchor editor.
Diferencia entre mover y redimensionar
Para redimensionar el control, la propiedad Anchor ha de tener un valor que sea la combinación de ambos ejes opuestos, por ejemplo: superior - inferior o izquierda - derecha.
Ejemplo: Anchor = 10
El control se encuentra anclado de forma absoluta a la Izquierda (Left Absolute) (Anchor = 2) y a la Derecha (Right Absolute) (Anchor = 10)
Para mover el control sin que este se redimensione, sólo se indicará uno de estos ejes opuestos.
Ejemplo: Anchor = 8
El control se encuentra anclado de forma absoluta a la Derecha (Anchor = 10)
Conociendo esto nos planteamos ¿Cómo determinar el valor para la propiedad?
Determinar el valor a asignar
Para determinar el valor a asignar a la propiedad tenga en cuenta que cada borde del contenedor y cada tipo de anclaje que se desee obtener tiene valores diferentes, estos valores sumados dan como resultado el número a asignar a la propiedad.
Ejemplo:
Anchor = 4 Bottom Absolute - Los controles mantienen la distancia con el borde inferior del contenedor.
Anchor = 8 Right Absolute - Los controles mantienen la distancia con el borde derecho del contenedor
Anchor = 12 Bottom Absolute + Right Absolute - Los controles mantienen la distancia con los bordes inferior y derecho del contenedor.
Valores posibles
Existe una amplia gama de valores posibles (0-672) y resulta poco recomendable la utilización de varios de ellos, veamos algunos casos de conflicto.
Conflictos - VFP devuelve un mensaje de error
No es posible establecer valores para la propiedad Anchor que entren en conflicto, por ejemplo:
1. No se pueden establecer al mismo tiempo valores Absolutos (no cambia la distancia entre el control y el eje indicado) y Relativos (mantiene distancia relativa entre el control y el eje indicado) para un mismo eje.
Ejemplo: Top Absolute = 1 y Top Relative = 16. No es posible que el control esté anclado de forma relativa y absoluta) a un mismo eje.2. No es posible establecer al mismo tiempo Fixed Size (Tamaño fijo - el control se centra en relación a los bordes pero mantiene su tamaño fijo) y anclaje para uno de los ejes.
Si intentamos asignar 17, a la propiedad Anchor desde la ventana Propiedades, en tiempo de diseño, la propiedad conserva su valor anterior y aparece, en tiempo de diseño, el siguiente mensaje de error: "La expresión ha sido evaluada en un valor ilegal"
Si, por el contrario, asignamos este tipo de valores por programación, (This.Anchor = 17), el error se muestra entonces en tiempo de ejecución.
Ejemplo: Left Absolute = 2 y Horizontal Fixed Size = 256, porque Horizontal Fixed Size asume que el objeto se centrará horizontalmente y no puede, a la vez, anclarse a la izquierda.Nos preguntamos entonces, ¿cómo determinar qué valor utilizar? Veamos a continuación algunas sugerencias.
¿Qué valor utilizar?
Eso depende del tipo de control y del efecto que queremos obtener en nuestra aplicación. Depende también de si el control es único en el contenedor o está acompañado por otros. He dividido los controles en dos grupos, los que se deben redimensionar y los que no.
Controles que no deben redimensionarse del todo.
Para los controles OptionGroup, OptionButtom, Label, TextBox, Combobox, Spinner, y Checkbox el valor que parece ser el más adecuado es Anchor = 672, porque mantienen distancia relativa a los ejes derecho e izquierdo) (32+128) y No se redimensionarán verticalmente.
Este efecto lo vemos en las dos figuras siguientes.
Controles que deben redimensionarse totalmente
Para los controles ListBox, Image, Line, Shape, OLEControl y EditBox, el valor que parece ser el más adecuado es Anchor = 240, porque mantienen distancia relativa a los cuatro bordes (16+32+64+128). Este efecto lo vemos en las dos figuras siguientes.
Otros casos
Control Grid
Lo que sucede con el Grid es, que a pesar de ser un contenedor y en teoría poder regular el anclaje de los objetos contenidos (columnas), no es posible, porque las columnas no tienen propiedad Anchor. Entonces el valor que parece ser más recomendable es Anchor = 336 Anclaje relativo a los bordes superior (16) e inferior (64); pero no se redimensiona horizontalmente (256). En caso que tengamos un gris con muchas columnas y es previsible que no se va a crear un efecto desagradable, entonces se puede recomendar Anchor = 240.
PageFrame y Container
Para el PageFrame y asumiendo que es el contenedor único dentro del formulario, como todos los ejemplos que hemos visto, Anchor = 15, porque garantiza que se amplíe de alto y de largo tanto como lo hace el propio formulario.
En caso de existir más controles en el formulario, además del PageFrame, pues hay que tener en cuenta que se puede producir un solape no deseado entre los controles.
CommandButton y CommandGroup
El valor de la propiedad Anchor para estos controles, depende del diseño que queramos mantener en nuestra aplicación. Pueden valer, por ejemplo: Anchor = 12, que mantiene los comandos abajo a la izquierda, Anchor = 260 que los mantiene centrados horizontalmente y al final del formulario o contenedor.
El control Toolbar no tiene asociada esta propiedad, al igual que Column que ya mencionamos.
Si conocemos el valor a asignar lo podemos introducir directamente. En caso contrario, podemos utilizar el Anchor Editor – Ventana para configurar el valor a asignar a esta propiedad. Este editor no se encuentra descrito en la ayuda de VFP 9.0 por lo que me detendré a describir brevemente algunos de sus componentes y su funcionalidad.
Anchor editor
Para tener acceso a este editor, hay que ejecutar previamente AnchorEditor.APP que se encuentra en C:Archivos de programaMicrosoft Visual FoxPro 9Wizards. Emite un mensaje que dice que ha quedado registrado el editor para la propiedad Anchor ("The Anchor Property editor has been registered"). Luego, para acceder al Editor, desde un formulario, para un control concreto o selección múltiple de controles, se hace Clic en el botón de comandos para editor de propiedades (…) que se encuentra al lado del cuadro de texto donde asignamos valor a la propiedad.
Para trabajar con el editor sólo será necesario hacer Clic en las barras que separan al control del contenedor estableciendo de esta forma el valor.
- Si la barra es de color gris claro indica que no se aplicará ninguna acción al redimensionar el contenedor.
- Si la barra es de color gris oscuro indica valores absolutos (1+2+4+8)
- Si la barra es de color negro indica valores relativos (16+32+64+128)
- No redimensionar verticalmente (512)
- No redimensionar horizontalmente (256)
Cada cambio que hagamos se verá reflejando en el cuadro de edición (editbox) con encabezado Valores de los bordes (Border values) y el número que va resultando de la suma y que es el valor que tomará la propiedad lo vemos junto a la etiqueta Anchor value
El botón de comando Ejemplo (Sample) muestra un formulario que al redimensionarlo ejemplifica el efecto que ese valor hará sobre el control determinado.
Hasta aquí algunas consideraciones sobre esta nueva propiedad que nos permite ahorrar mucho código al redimensionar objetos y contenedores de forma nunca antes vista.
Saludos,
Ana María Bisbé York
www.amby.net
Mil gracias, lo que me dificultaba mucho son los términos, absoluto, relativo, borde superior o inferior, redimensionar. son simples pero al unir todo no es fácil de asimilar. pero mil gracias de nuevo
ResponderBorrar