4D v16.3

Gestión de list box jerárquicos

Inicio

 
4D v16.3
Gestión de list box jerárquicos

Gestión de list box jerárquicos  


 

 

4D 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 la información, incluyendo los valores repetidos y/o jerárquicamente dependientes (país/región/ciudad...).

Sólo los list box de tipo array pueden ser jerárquicos.

Los list boxes de tipo jerárquico son una forma de representación particular de los datos pero no modifican la estructura de estos datos (los arrays). Los list box jerárquicos se llenan y manejan exactamente del mismo modo que los list  box regulares (ver Gestión programada de los objetos de tipo List box).

Para especificar un list box jerárquico, hay tres posibilidades diferentes:

  • configurar manualmente los elementos jerárquicos utilizando la lista de propiedades del editor de formularios o utilizando el menú emergente de gestión de list box. Estos puntos se tratan en el Manual de Diseño de 4D.
  • utilizar los comandos LISTBOX SET HIERARCHY y LISTBOX GET HIERARCHY.

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 caracterizada por un país, una región, un nombre y un número de habitantes:

Si este list box se muestra en forma jerárquica (los tres primeros arrays se incluyen en la jerarquía), se obtiene:

Los arrays 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 expandir o contraer un "nodo" jerárquico, simplemente haga clic en él. Si presiona Alt+clic (Windows) u Opción+clic (Mac OS) en el nodo, todos sus sub-elementos se expandirán o contraerán. Estas operaciones también pueden realizarse por programación utilizando los comandos LISTBOX EXPAND y LISTBOX COLLAPSE.

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. Sólo 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).

Representación no-jerárquica:

Representación jerárquica:

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: 

... LISTBOX GET CELL POSITION devuelve (2;4). Para seleccionar una línea de ruptura por programación, debe utilizar el comando LISTBOX SELECT BREAK.

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:

 OBJECT SET RGB COLORS(T1;0x0000FF;0xB0B0B0)
 OBJECT SET FONT STYLE(T2;Bold)

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. 

Resultado:

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á.

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.



Ver también 

Gestión programada de los objetos de tipo List box
LISTBOX GET HIERARCHY
LISTBOX SELECT BREAK
LISTBOX SET HIERARCHY

 
PROPIEDADES 

Producto: 4D
Tema: List Box

 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)