4D v12 le permite especificar y usar list box jerárquicos. Un list box jerárquico es un list box en el cual el contenido de la primera columna aparece en forma jerárquica. Este tipo de representación se adapta a la presentación de información que incluye valores repetidos y/o valores que dependen jerárquicamente (país, región o ciudad, etc.).
Sólo los list box de tipo array pueden ser jerárquicos.
Los list box jerárquicos constituyen un modo particular de representar datos, pero no modifican la estructura de los datos (arrays). Los list box jerárquicos se manejan de la misma manera como los list box regulares.
Para especificar un list box jerárquico, hay tres posibilidades diferentes:
Configurar manualmente elementos jerárquicos utilizando la lista de propiedades en el editor de formularios.
Generar visualmente la jerarquía utilizando el menú emergente de gestión de los list box, en el editor de formularios.
Esta sección explica cómo crear list box jerárquicos en el editor de formularios de 4D y los fundamentos de su funcionamiento durante la ejecución, así como también su gestión programada (selecciones, rupturas, utilización de los eventos formulario On Expand y On Collapse, etc.).
Puede activar y configurar el modo jerárquico en el tema "Jerarquía" de la lista de propiedades. Para obtener más información, consulte la sección Propiedades específicas de los list box.
Al hacer clic en el área de columnas de un list box, el menú contextual del editor de formularios contiene los comandos Crear jerarquía y Cancelar jerarquía.
Cuando selecciona al menos una columna, además de la primera en un objeto list box (del tipo array) en el editor de formularios, el comando Crear jerarquía está disponible en el menú contextual:
Al elegir este comando, se efectúan las siguientes acciones:
La opción "List box jerárquico" está seleccionada para el objeto en la Lista de propiedades.
Las variables de las columnas se utilizan para definir la jerarquía. Ellas reemplazan las variables ya especificadas.
Las columnas seleccionadas ya no aparecen en el list box (excepto por el título de la primera).
Ejemplo: dado un list box cuyas primeras columnas contienen País, Región, Ciudad y Población. Cuando País, Región y Ciudad están seleccionados (vea la ilustración arriba), si usted elije Crear jerarquía en el menú contextual, una jerarquía de tres niveles se crea en la primera columna, las columnas 2 y 3 se eliminan y la columna Población se convierte en la segunda:
Cuando la primera columna está seleccionada y se ha definido como jerárquica, puede utilizar el comando Cancelar jerarquía. Al elegir este comando, se efectúan las siguientes acciones:
La opción "List box jerárquico" se deselecciona para el objeto,
Los niveles jerárquicos de 2 a X se eliminan y se transforman en columnas agregadas al list box.
Cuando se abre por primera vez un formulario que contiene un list box jerárquico, por defecto todas las líneas se despliegan.
Una línea de ruptura y un "nodo" jerárquico se agregan automáticamente al list box cuando los valores se repiten en los arrays. Por ejemplo, imagine un list box que contiene cuatro arrays especificando las ciudades, cada ciudad es caracterizada por su país, su región, su nombre y su número de habitantes:
Si este list box se muestra en forma jerárquica (los primeros tres arrays incluidos en la jerarquía), se obtiene:
Los arrayas no se ordenan antes de la construcción de la jerarquía. Si, por ejemplo, un array contiene los datos AAABBAACC, la jerarquía obtenida será: > A > B > A > C
Para desplegar o contraer un "nodo" jerárquico, haga clic en él. Si presiona Alt+clic (Windows) u Opción+clic (MacOS) en el nodo, todos sus sub elementos se desplegarán o contraerán. Estas operaciones también se pueden realizar por programación utilizando los comandos LISTBOX EXPAND y LISTBOX COLLAPSE.
Cuando los valores de tipo fecha u hora se incluyen en un list box jerárquico, se muestran en un formato estándar:
Las fechas se muestran en el formato sistema corto (por ejemplo, para el 30 de mayo de 2009, "05/30/09" en un sistema americano y "30/05/09" en un sistema europeo).
Las horas también se muestran en el formato sistema corto ("12:15:30" o "12:15" en función de los parámetros del sistema).
En un list box en modo jerárquico, una ordenación estándar (efectuada haciendo clic en el encabezado de una columna del list box) siempre se construye de la siguiente forma:
En primer lugar, todos los niveles de la columna jerárquica (primera columna) se ordenan automáticamente en orden ascendente.
La ordenación se efectúa en orden ascendente o descendente (según la acción del usuario) en los valores de la columna en la que se hizo clic.
Todas las columnas se sincronizan.
Durante las ordenaciones posteriores de las columnas no jerárquicas del list box, sólo el último nivel de la primera columna se ordena. Es posible modificar la ordenación de esta columna haciendo clic en su encabezado.
Dado por ejemplo, el siguiente list box, en el que no se define ninguna ordenación especifica:
Si hace clic en "Población" para ordenar las poblaciones de forma ascendente (o alternativamente descendente), los datos aparecen así:
Como para todos los list box, puede desactivar el mecanismo de ordenación estándar deseleccionando la propiedad "Ordenable" para el list box y manejando la ordenación por programación.
Un list box jerárquico muestra un número variable de líneas en la pantalla de acuerdo al estado desplegado/contraído de los nodos jerárquicos. Esto no significa, sin embargo que el número de líneas de los arrays varíe. Sólo se modifica la visualización, no los datos.
Es importante entender este principio porque la gestión programada de list box jerárquicos se basa siempre en los datos de los arrays, no en los datos mostrados. En particular, las líneas de ruptura añadidas automáticamente no se tienen en cuenta en los arrays de opciones de visualización (consulte la sección "Gestión de líneas de ruptura").
Echemos un vistazo por ejemplo a los siguientes arrays:
Si estos arrays están representados jerárquicamente, la línea "Quimper" no se mostrará en la segunda línea, sino en la cuarta, debido a las dos líneas de ruptura añadidas:
Independientemente de cómo los datos se muestran en el list box (jerárquicamente o no), si quiere cambiar la línea que contiene "Quimper" a negrita, debe utilizar la instrucción Style{2} = bold. Sólo se tiene en cuenta la posición de la línea en los arrays.
Este principio se aplica para los arrays internos que se pueden utilizar para administrar:
colores
colores de fondo
estilos
líneas ocultas
selecciones
Por ejemplo, si desea seleccionar la fila que contiene Rennes, debe pasar:
->MiListbox{3}:=True
Representación no-jerárquica:
Representación jerárquica:
Nota: si una o más líneas se ocultan porque sus padres están contraídos, no se seleccionan más. Solo las líneas que son visibles (ya sea directamente o por desplazamiento) pueden seleccionarse. En otras palabras, las líneas no pueden estar a la vez ocultas y seleccionadas.
Al igual que con las selecciones, el comando LISTBOX GET CELL POSITION devuelve los mismos valores para un list box jerárquico y un list box no jerárquico. Esto significa que en los dos ejemplos a continuación, LISTBOX GET CELL POSITION devolverá la misma posición: (3;2).
Cuando todas las líneas de una subjerarquía están ocultas, la línea de ruptura se oculta automáticamente. En el ejemplo anterior, si las líneas 1 a 3 están ocultas, la línea de ruptura "Brittany" no aparecerá.
Si el usuario selecciona una línea de ruptura, LISTBOX GET CELL POSITION devuelve la primera ocurrencia de la línea en el array correspondiente. En el siguiente caso:
Las líneas de ruptura no se tienen en cuenta en los arrays internos utilizados para administrar la apariencia gráfica de los list box (estilos y colores). Sin embargo es posible modificar estas características para las líneas de ruptura vía los comandos de gestión gráfica para objetos (tema ). Sólo debe ejecutar los comandos apropiados en los arrays que constituyen la jerarquía.
Dado por ejemplo el siguiente list box (los nombres de los arrays asociados se especifican entre paréntesis):
Representación no-jerárquica:
Representación jerárquica:
En modo jerárquico, los niveles de ruptura no son tenidos en cuenta por los arrayas de modificación de estilo llamados tStyle y tColors. Para modificar el color o el estilo de los niveles de ruptura, debe ejecutar las siguientes instrucciones:
Nota: en este contexto, sólo la sintaxis que utiliza la variable array puede funcionar con los comandos de propiedad de objeto porque los arrays no tienen objeto asociado.
Puede optimizar la visualización y la gestión de los list box jerárquicos utilizando los eventos formulario On Expand y On Collapse.
Un list box jerárquico se construye a partir de los contenidos de sus arrays por lo que sólo se pueden mostrar cuando todos los arrays se cargan en memoria. Esto hace difícil la generación de list box jerárquicos de gran tamaño basados en arrays generados a partir de los datos (vía el comando SELECTION TO ARRAY), no sólo por la velocidad de visualización, sino también por el uso de la memoria.
El uso los eventos formulario On Expand y On Collapse permite superar estas limitaciones: por ejemplo, ahora se puede mostrar sólo una parte de la jerarquía y efectuar la carga y la descarga de los arrays sobre la marcha, en función de las acciones del usuario.
En el contexto de estos eventos, el comando LISTBOX GET CELL POSITION devuelve la celda donde el usuario hizo clic para expandir o contraer una línea.
En este caso, debe llenar y vaciar los arrays por código. Los principios a aplicar son:
Durante la visualización del list box, sólo el primer array debe llenarse. Sin embargo, usted debe crear un segundo array con valores vacíos para que el list box muestre los botones expandir/contraer:
Cuando un usuario hace clic en un botón de despliegue, puede procesar el evento On Expand. El comando LISTBOX GET CELL POSITION devuelve la celda en cuestión y le permite crear la jerarquía apropiada: se llena el primer array con los valores repetidos y el segundo con los valores enviados desde el comando SELECTION TO ARRAY e insertar en el list box tantas líneas como sea necesario utilizando el comando LISTBOX INSERT ROWS.
Cuando un usuario hace clic en un botón de contracción, puede procesar el evento On Collapse. El comando LISTBOX GET CELL POSITION devuelve la celda en cuestión: elimina del list box tantas líneas como sea necesario utilizando el comando LISTBOX DELETE ROWS.