Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com

Inicio

 
4D v20 R7
Gestión programada de los objetos de tipo List box

Gestión programada de los objetos de tipo List box  


 

 

Los comandos de este tema están dedicados a la gestión de objetos de formulario de tipo List box.

Los list boxes permiten representar los datos en forma de columnas y de filas seleccionables y proponen numerosas funciones de interfaz como la posibilidad de introducir valores, ordenar columnas, mostrar una jerarquía, definir colores alternos, etc.

Es posible configurar completamente un list box en el editor de formularios de 4D e igualmente puede controlarlo por programación. Para mayor información sobre la creación y definición de objetos de tipo list box en el editor de formularios como también sobre su uso, consulte el Manual de Diseño de la documentación 4D.

La programación de objetos de tipo List box se efectúa de la misma forma que para los otros objetos de formulario en lista de 4D. Sin embargo, se deben seguir las reglas específicas, descritas en esta sección.

Un list box puede contener una o más columnas y puede estar asociado a arrays 4D, a una selección de registros, a una colección o a una selección de entidades (entity selection). En el caso de los list box de tipo selección o colección/entity selection, las columnas son asociadas a las expresiones (las columnas de list box de tipo selección pueden igualmente asociarse a los campos).

No es posible combinar en un mismo list box tipos de fuentes de datos diferentes (arrays, selecciones, colecciones o selecciones de entidades). La definición de la fuente de datos se efectúa en el momento de la creación del list box en el editor de formularios, vía la Lista de propiedades. Entonces ya no es posible modificarlo por programación.

En este tipo de list box, cada columna está asociada a un array 4D de una dimensión; todos los tipos de array pueden utilizarse, a excepción de los arrays de punteros. El formato de salida de cada columna puede definirse en el editor de formularios o utilizando el comando OBJECT SET FORMAT.

Utilizando el lenguaje, los valores de las columnas (entrada y visualización de datos) se administran utilizando los comandos de alto nivel del tema List box (tales como LISTBOX INSERT ROWS o LISTBOX INSERT COLUMN) como también los comandos de manipulación de arrays.

Por ejemplo, para inicializar el contenido de una columna, puede utilizar la siguiente instrucción:

 ARRAY TEXT(ColumnName;size)

Igualmente puede utilizar una lista:

 LIST TO ARRAY("ListName";ColumnName)

Advertencia: cuando un list box contiene varias columnas de diferentes tamaños, sólo se muestra el número de elementos del array más pequeño (columna). Debe asegurarse de que cada array tenga el mismo número de elementos que los otros. Igualmente, si una columna de la list box está vacía (esto ocurre cuando el array asociado no fue declarado correctamente o dimensionado utilizando el lenguaje), la list box no muestra nada.

En este tipo de list box, cada columna puede estar asociada con un campo o una expresión. El contenido de cada fila se evalúa de acuerdo a una selección de registros: la selección actual de una tabla o una selección temporal.

Cuando la selección actual es la fuente de datos, todas las modificaciones realizadas en la base son reportadas automáticamente en el list box y viceversa. La selección actual es entonces siempre la misma en ambas ubicaciones. Note que los comandos LISTBOX INSERT ROWS y LISTBOX DELETE ROWS no pueden utilizarse con list boxes de tipo selección.

Puede asociar una columna de list box a una expresión. La expresión puede estar basada en uno o más campos (por ejemplo [Empleados]Apellido+" "+[Empleados]Nombre) o simplemente en una fórmula (por ejemplo String(Milliseconds)). La expresión también puede tener un método de proyecto, una variable o un elemento de array.

El comando LISTBOX SET TABLE SOURCE puede utilizarse para modificar la tabla asociada con el list box por programación.

En este tipo de list box, cada columna debe estar asociada a una expresión. El contenido de cada línea se evalúa para cada elemento de la colección o para cada entidad de la selección de entidades (entity selection). La colección debe haberse definido a través del comando _O_C_COLLECTION. Toda modificación realizada en la colección, por ejemplo, utilizando los diversos métodos del tema Colecciones, se transmite a través del list box y viceversa.

Cada elemento de la colección o cada entidad está disponible como un objeto al que se puede acceder a través del comando This .

La expresión de la columna puede ser un método proyecto, una variable o cualquier fórmula, accediendo a cada objeto entidad o elemento de colección vía This, por ejemplo This.<propertyPath> (o This.value en el caso de una colección de valores escalares). Puede utilizar los comandos LISTBOX SET COLUMN FORMULA y LISTBOX INSERT COLUMN FORMULA para modificar columnas por programación.

Cuando la fuente de datos es una selección de entidades, cualquier modificación realizada del lado del list box se guarda automáticamente en la base de datos. Por otro lado, las modificaciones realizadas del lado de la base son visibles en el list box después de que las entidades tocadas hayan sido recargadas

Cuando la fuente de datos es una colección, cualquier modificación realizada en los valores del list box colección se refleja en la colección. Por otro lado, si se realizan modificaciones en la colección utilizando, por ejemplo, los diversos métodos del tema Colecciones, deberá notificar explícitamente a 4D al reasignar la variable colección a sí misma, de modo que el contenido del list box se refresque. Por ejemplo:

 myCol:=myCol.push("new value") //display new value in list box

Un objeto List box está compuesto de cuatro tipos de elementos diferentes:

  • el objeto mismo,
  • las columnas,
  • los encabezados de las columnas (pueden mostrarse u ocultarse, se muestran por defecto),
  • los pies de las columnas (pueden mostrarse u ocultarse, se ocultan por defecto),

Estos elementos pueden seleccionarse individualmente en el editor de formularios. Cada uno tiene su propio nombre de objeto y nombre de variable y puede ser manejado por separado.

Por defecto, las columnas se llaman Columna1 a n y los encabezados Título1 a n en el formulario, independientemente de los objetos list box. Note que por defecto, el mismo nombres se utiliza para los objetos y sus variables asociadas, a excepción de los pies (por defecto las variables están vacías para los pies, 4D utiliza las variables dinámicas).
Cada tipo de elemento contiene características propias y características compartidas con los otros elementos. Por ejemplo, la fuente de los caracteres puede ser asignada globalmente al objeto list box o por separado a las columnas, a los encabezados y/o a los pies. Por otra parte, las propiedades de entrada sólo pueden definirse para las columnas.

Estos principios se aplican a los comandos del tema “Propiedades de los objetos” que pueden utilizarse con los list box. Dependiendo de su funcionalidad, cada comando puede utilizarse con el list box, las columnas, los encabezados y/o los pies de las columnas. Para definir el tipo de elemento en el cual quiere trabajar, simplemente pase el nombre o la variable asociada a él.

La siguiente tabla detalla el alcance de cada comando del tema “Propiedades de los objetos” que puede utilizarse con los objetos de tipo list box:

Comandos Prop. de los objetosObjetoColumnaEncabezado de columnaPie de columna
OBJECT MOVEX
OBJECT GET COORDINATES XXXX
OBJECT SET RESIZING OPTIONS X
OBJECT GET RESIZING OPTIONS  X
OBJECT GET BEST SIZEX
OBJECT SET FILTERX
OBJECT SET FORMAT XX
OBJECT SET ENTERABLE X
OBJECT SET LIST BY NAME X
OBJECT SET TITLEX
_o_OBJECT SET COLORXXXX
OBJECT SET RGB COLORSXXXX
OBJECT SET FONTXXXX
OBJECT SET FONT SIZEXXXX
OBJECT SET FONT STYLEXXXX
OBJECT SET HORIZONTAL ALIGNMENTXXXX
OBJECT Get horizontal alignmentXXXX
OBJECT SET VERTICAL ALIGNMENTXXXX
OBJECT Get vertical alignmentXXXX
OBJECT SET VISIBLEXXXX
OBJECT SET SCROLLBARX
OBJECT SET SCROLL POSITION X
OBJECT SET HELP TIPXXX
OBJECT Get help tipXXX

Nota: con list boxes de tipo array, es posible especificar el estilo, color de fuente, color de fondo y visibilidad para cada línea por separado. Esto se administra por medio de arrays asociados con el list box en la lista de propiedades. Puede recuperar los nombres de estos arrays por programación utilizando el comando LISTBOX GET ARRAYS.

Es posible añadir un método de objeto al objeto list box en su conjunto y/o a cada columna de la list box.
Los métodos de objeto se llaman en la siguiente orden:

  1. Método de objeto de la columna
  2. Método de objeto del list box
El método de objeto de la columna recibe los eventos que ocurren en su encabezado y en su pie.

Cuando el comando OBJECT SET VISIBLE se utiliza con un encabezado o un pie de list box, se utiliza en todos los encabezados o todos los pies del objeto List box, sin importar el elemento individual especificado por el comando.
Por ejemplo, la instrucción OBJECT SET VISIBLE(*;"encabezado3";False) ocultará todos los encabezados del objeto List box al cual pertenece el encabezado3 y no únicamente este encabezado.
Note que para poder manejar la visibilidad de estos objetos utilizando el comando OBJECT SET VISIBLE, debe haber sido mostrados en el list box a nivel del editor de formularios (la opción Mostrar encabezados y/o Mostrar pies debe estar seleccionada para el objeto).

La función OBJECT Get pointer utilizada con la constante Object with focus u Object current (antiguas funciones Focus object y Self) puede ser utilizada en el método de objeto de un list box o de una columna de list box.
Devuelven un puntero al list box, la columna(1) list box o la variable del encabezado en función del tipo de evento de formulario. La siguiente tabla detalla este funcionamiento:

EventoObjeto focoObjeto actual
On Clickedlist boxcolumna
On Double Clickedlist boxcolumna
On Before Keystrokecolumnacolumna
On After Keystrokecolumnacolumna
On After Editcolumnacolumna
On Getting Focuscolumna o list box (*)columna o list box (*)
On Losing Focuscolumna o list box (*)columna o list box (*)
On Droplist box sourcelist box (*)
On Drag Overlist box sourcelist box (*)
On Begin Drag Overlist boxlist box (*)
On Mouse Enterlist box (**)list box (**)
On Mouse Movelist box (**)list box (**)
On Mouse Leavelist box (**)list box (**)
On Data Changecolumnacolumna
On Selection Changelist box (**)list box (**)
On Before Data Entrycolumnacolumna
On Column Movedlist boxcolumna
On Row Movedlist boxlist box
On Column Resizelist boxcolumna
On Open DetailNillist box (**)
On Close DetailNillist box (**)
On Header Clicklist boxencabezado
On Footer Clicklist boxfooter
On After Sortlist boxencabezado

(*) Cuando el foco se modifica dentro de un list box, se devuelve a la columna un puntero. Cuando el foco se modifica a nivel del formulario, se devuelve un puntero al list box. En el contexto de un método de objeto de columna, se devuelve un puntero a la columna.

(**) No ejecutado en el contexto de un método de objeto de columna.

(1) Cuando se devuelve un puntero a una columna, el objeto al cual se apunta depende del tipo del list box. Con un array de tipo list box, la función OBJECT Get pointer devuelve un puntero al array). El mecanismo de punteros de 4D permite conocer el número del elemento del array modificado. Por ejemplo, suponiendo que el usuario modificó la quinta fila de la columna col2:

 $Column:=OBJECT Get pointer(Object with focus)
  ` $Column contiene un puntero a col2
 $Fila:=$Column-> `$Fila igual a 5

En el caso de un list box de tipo selección, la función OBJECT Get pointer devuelve:

  • Para una columna asociada a un campo, un puntero al campo asociado,
  • Para una columna asociada a una variable, un puntero a la variable,
  • Para una columna asociada a una expresión, el puntero Nil.

El comando OBJECT SET SCROLL POSITION (tema “Propiedades de los objetos") puede utilizarse con un objeto de tipo list box. Ese comando permite desplazar las líneas de la list box para mostrar la primera línea seleccionada o una línea específica.

El comando EDIT ITEM (tema “Gestión de entrada”) le permite pasar a modo edición una celda de un objeto list box.

REDRAW  

Cuando se aplica a un listbox en modo selección, el comando REDRAW (tema "Interfaz de usuario") dispara la actualización de los datos mostrados en el list box.

Nota: el comando REDRAW no es soportado con los list box de tipo entity selection.

El comando Displayed line number (tema "Selecciones") funciona en el contexto del evento de formulario On Display Detail para un objeto list box.

Los eventos de formulario específicos están destinados a facilitar la gestión programada del list box, en particular con lo relacionado a las operaciones de arrastrar y soltar y ordenar. Para mayor información, consulte la descripción del comando Form event.

La gestión de arrastrar y soltar de datos en los list boxes está soportada por los comandos Drop position y DRAG AND DROP PROPERTIES. Estos comandos han sido adaptados especialmente para los list boxes.

Tenga cuidado en no confundir arrastrar y soltar con mover filas y columnas, soportado por los comandos LISTBOX MOVED ROW NUMBER y LISTBOX MOVED COLUMN NUMBER.

Para que una celda de list box sea editable, ambas de las siguientes condiciones deben cumplirse:

  • La columna de la celda debe haberse definido como Editable (de lo contrario, las celdas de la columna no serán editables).
  • En el evento formulario On Before Data Entry, $0 no devuelve -1.
    Cuando el cursor llega a la celda, el evento On Before Data Entry se genera en el método de la columna. Si, en el contexto de este evento, $0 toma el valor -1, la celda se considera como no editable. Si el evento se generó luego de presionar Tab o Mayús+Tab, el foco va a la celda siguiente o anterior respectivamente. Si $0 no vale -1 (por defecto $0 es 0), la celda es editable y pasa a modo edición.

Imaginemos por ejemplo un list box que contiene dos arrays, de tipo fecha y texto. El array fecha no es editable pero el array texto es editable si la fecha no ha pasado. 

Este es el método de la columna arrText:

 Case of
    :(FORM Event=On Before Data Entry// una celda obtiene el foco
       LISTBOX GET CELL POSITION(*;"lb";$col;$row)
  // identificación de la celda
       If(arrDate{$row}<Current date// si la fecha es anterior a la de hoy
          $0:=-1 // la celda NO es editable
       Else
  // de lo contrario, la celda es editable
       End if
 End case

Nota: a partir de 4D v13, el evento On Before Data Entry se devuelve antes de On Getting Focus.

Con el fin de preservar la coherencia de los datos para los list box de tipo selección, todo registro/entidad modificado(a) se guarda tan pronto como se valida la celda, es decir:

  • cuando la celda está desactivada (el usuario presiona la pestaña, clics, etc.)
  • cuando el listbox ya no tiene el foco,
  • cuando el formulario ya no tiene el primer plano.

La secuencia típica de eventos generada durante la entrada o la modificación de datos es la siguiente:

AcciónTipos de listboxSecuencia de eventos
Una celda pasa a modo ediciónTodosOn Before Data Entry
TodosOn Getting Focus
Su valor se modificaTodosOn Before Keystroke
TodosOn After Keystroke
TodosOn After Edit
Un usuario valida y sale de la celdaList box selección Save
List box selección de registrosDispara On saving an existing record (si definido)
List box selecciónOn Data Change(*)
List box Entity selectionLa entidad se guarda con la opción automerge, bloqueo optimista (ver [#title id="9310"/]). En caso de guardar correctamente, la entidad se actualiza con la última actualización realizada. Si la operación de guardar falla, se muestra un error
TodosOn Losing Focus

(*) Con los list box de tipo entity selection, en el evento On Data Change:

  • el objeto Elemento actual (ver Tema Fuente de datos) contiene el valor antes de modificación.
  • el objeto This contiene el valor modificado.

Nota: la entrada de datos en los list boxes de tipo colección/entity selection tiene una limitación cuando la expresión se evalúa como null. En este caso, no es posible editar o eliminar el valor null en la celda.

Por defecto, la list box administra automáticamente la ordenación estándar de columnas en caso de clic en el encabezado. Una ordenación estándar es una ordenación alfanumérica de valores de la columna, de forma alterna ascendente/descendente con cada clic. Todas las columnas siempre se sincronizan automáticamente.
Puede evitar las ordenaciones de usuario estándar deseleccionando la propiedad “Ordenable” del list box.

Por defecto, el list box maneja automáticamente las ordenaciones estándar de columnas en caso de clic en el encabezado. Una ordenación estándar es una ordenación alfanumérica de los valores de la columna, alternamente ascendente/descendente con cada clic sucesivo. Todas las columnas siempre se sincronizan automáticamente.
Usted puede prohibir ordenar al usuario estándar deseleccionando la propiedad "Ordenable" para el listbox.

El desarrollador puede configurar ordenaciones personalizadas utilizando el comando LISTBOX SORT COLUMNS y/o combinando los eventos de formulario On Header Click y On After Sort (ver el comando Form event) y los comandos 4D de gestión de arrays.

Nota: la propiedad “Ordenable” únicamente afecta la ordenación del usuario estándar; el comando LISTBOX SORT COLUMNS no tiene en cuenta esta propiedad.

El valor de la variable asociada al título de la columna le permite administrar información adicional: la ordenación actual de la columna (lectura) y la visualización de la flecha de ordenación.

  • Si la variable vale 0, la columna no se ordena y no se muestra la flecha de ordenación;

  • Si la variable vale 1, la columna se ordena de forma ascendente y se muestra la flecha de ordenación;

  • Si la variable vale 2, la columna se ordena de forma descendente y se muestra la flecha de ordenación.

Es posible fija el valor de la variable (por ejemplo, Titulo2:=2) para “forzar” la visualización de la flecha de ordenación. La ordenación de la columna misma no se modifica en este caso; está en manos del desarrollador manejarlo.

Nota: el comando OBJECT SET FORMAT ofrece un soporte específico para los íconos en los encabezados de list box, útil cuando desea trabajar con un icono de ordenación personalizado.

La gestión de selecciones se efectúa de manera diferente para los list box de tipo array, selección de registros, o colección/entity selection.

  • List box de tipo selección: las selecciones son administradas por intermedio de un conjunto llamado por defecto $ListboxSetN (N comienza en 0 y se incrementa en función del número de list box en el formulario), puede modificarlo si es necesario. Este conjunto se define en las propiedades del list box. Es mantenido automáticamente por 4D: si el usuario selecciona una o más filas en el list box, el conjunto se actualiza inmediatamente. Por otra parte, también es posible utilizar los comandos del tema "Conjuntos" con el fin de modificar por programación la selección del list box.
  • List box de tipo colección/Entity selection: las selecciones son manejadas por medio de las propiedades de list box dedicadas: Elemento actual es un objeto que recibirá el elemento/entidad seleccionado, Elementos seleccionados es una colección de elementos seleccionados, y Posición elemento actual devuelve la posición del elemento o entidad seleccionado. Para mayor información, consulte la sección  Tema Fuente de datos
  • List box de tipo array: el comando LISTBOX SELECT ROW puede utilizarse para seleccionar por programación una o más líneas de list box.

La variable asociada al objeto List box se utiliza para obtener, fijar o almacenar las selecciones de filas del objeto.

Esta variable corresponde a un array de booleanos que es creada y mantenida automáticamente por 4D. El tamaño de este array se determina por el tamaño del list box: contiene el mismo número de elementos que el array más pequeño asociado a las columnas.

Cada elemento de este array contiene True si la fila correspondiente se selecciona y de lo contrario False. 4D actualiza los contenidos de este array dependiendo de las acciones del usuario. A la inversa, usted puede modificar el valor de los elementos de este array para modificar la selección en el list box.

Por otra parte, no es posible insertar o borrar filas en este array; tampoco es posible digitar filas nuevamente.

Nota: el comando Count in array es útil para conocer el número de líneas seleccionadas.

Por ejemplo, este método permite invertir la selección de la primera línea del list box (tipo array):

 ARRAY BOOLEAN(tBListBox;10)
 \\tBListBox es el nombre de la variable asociada al list box en el formulario
 If(tBListBox{1}=True)
    tBListBox{1}:=False
 Else
    tBListBox{1}:=True
 End if

Si seleccionó la opción Ocultar la selección resaltada para un list box, necesitará volver las selecciones de list box visibles utilizando las opciones de interfaz disponibles. Para más información sobre cómo hacer esto, consulte Personalizar la apariencia de las selecciones.

Nota: las especificaciones de la gestión de las selecciones en los list box en modo jerárquico se detallan en la sección [#title id="2774"/].

Es posible imprimir list boxes a partir de 4D v12. Están disponibles dos modos de impresión: modo previsualización, el cual puede permite imprimir un list box como un objeto de formulario y el modo avanzado, permite controlar la impresión del objeto list box mismo dentro del formulario. Note que la apariencia "Impresión" está disponible para los objetos list box en el editor de formularios.

La impresión de un list box en modo previsualización consiste en imprimir directamente el list box con el formulario que lo contiene utilizando los comandos de impresión estándar o el comando de menú Print. El list box se imprime como está en el formulario. Este modo no permite controlar con precisión la impresión del objeto; en particular, no permite imprimir todas las líneas de un list box que contenga más líneas de las que pueda mostrar.

En este modo, la impresión de los list box se efectúa por programación, vía el comando Print object (los formularios proyecto y los formularios tabla se tienen en cuenta). El comando LISTBOX GET PRINT INFORMATION se utiliza para controlar la impresión del objeto. 

En este modo:

  • La altura del objeto list box se reduce automáticamente cuando el número de líneas a imprimir es menor a la altura original del objeto (no hay líneas "vacías" impresas). Por el contrario, la altura no aumenta automáticamente  en función del contenido del objeto. El tamaño del objeto efectivamente impreso puede obtenerse vía el comando LISTBOX GET PRINT INFORMATION.
  • El objeto list box se imprime "tal cual", en otras palabras, teniendo en cuenta sus parámetros de visualización actuales: visibilidad de encabezados y rejillas, líneas mostradas y ocultas, etc.
    Estos parámetros también incluyen la primera línea a imprimir: si llama al comando OBJECT SET SCROLL POSITION antes del lanzar la impresión, la primera línea impresa en el list box será la designada por el comando. 
  • Un mecanismo automático facilita la impresión de los list box que contienen más líneas de las que es posible mostrar: llamadas sucesivas a Print object permiten imprimir un nuevo conjunto de líneas cada vez. El comando LISTBOX GET PRINT INFORMATION permite controlar el estado de la impresión.

Hay varios modos distintos de configurar los colores de fondo, colores de fuente y estilos de fuente para los list boxes:

  • a nivel de las propiedades del objeto list box,
  • a nivel de las propiedades de la columna,
  • utilizando arrays o métodos para el list box y/o para cada columna,
  • a nivel del texto de cada celda (si texto multiestilo).

Se observan principios de prioridad y de herencia.

propiedades del objeto list box o columna, el uso de arrays o métodos para el list box o por columna y definición a nivel de celdas (si son de texto multiestilo).

Cuando una misma propiedad se define en más de un nivel, el orden de prioridad es el siguiente:

Prioridad elevadaCelda (si texto multiestilo)
Array/métodos de columna
Array/métodos de listbox
Propiedades de la columna
Prioridad bajaPropiedades del list box
low priorityExpresión Meta Info (list box de tipo colección o entity selection)

Por ejemplo, si define un estilo de caracteres en las propiedades del list box y otro utilizando un array de estilo para la columna, se tendrá en cuenta este último.

Dado un list box cuyas filas tienen un color alterno gris/gris claro, definido en las propiedades del list box. Un array de color de fondo también se ha definido para el list box con el fin de cambiar el color de las filas en las que al menos un valor es negativo por naranja:

 <>_BgndColors{$i}:=0x00FFD0B0 // orange
 <>_BgndColors{$i}:=-255 // valor por defecto

A continuación, vamos a colorear los valores negativos de color naranja oscuro. Para ello , se define un array de color de fondo para cada columna, por ejemplo <>_BgndColor_1, <>_BgndColor_2 and <>_BgndColor_3.  Los valores de estos arrays serán prioritarios sobre los definidos en las propiedades del list box, así como las del array general de color de fondo:

 <>_BgndColorsCol_3{2}:=0x00FF8000 // naranja oscuro
 <>_BgndColorsCol_2{5}:=0x00FF8000
 <>_BgndColorsCol_1{9}:=0x00FF8000
 <>_BgndColorsCol_1{16}:=0x00FF8000

Puede obtener el mismo resultado utilizando los nuevos comandos LISTBOX SET ROW FONT STYLE y LISTBOX SET ROW COLOR. Tienen la ventaja de que le permite evitar tener que predefinir los arrays de estilo/color de las columnas: son creados dinámicamente por los comandos.

Para cada atributo (estilo, color y color de fondo), la herencia se aplica cuando se utiliza el valor por defecto:

  • para los atributos de las celdas: valores de atributos de líneas
  • para los atributos de las líneas: valores de los atributos de las columnas
  • para los atributos de las columnas: valores de los atributos del listbox

De esta manera, si quiere que un objeto herede el valor del atributo de un nivel superior, pase la constante lk inherited (valor por defecto) al comando de definición o directamente en el elemento del array de estilo/color correspondiente.

Dado un listbox que contiene una estilo de fuente estándar con colores alternativos: 

Puede realizar las modificaciones siguientes:

  • cambiar el fondo de la fila 2 a rojo con la propiedad Array colores de fondo del objeto list box,
  • cambiar el estilo de la fila 4 a itálica por la propiedad Array de estilos del objeto list box,
  • dos elementos de la columna 5 se pasan a negrita por la propiedad Array de estilos del objeto columna 5,
  • los elementos de la fila 2 de las columnas 1 y 2 se cambian a fondo azul utilizando la propiedad Array colores de fondo de los objetos columna 1 y 2:

Puede realizar las modificaciones siguientes:
  • pase la constante lk inherited en los elementos 2 de los arrays de fondo de las columnas 1 y 2: a continuación, heredan el color de fondo rojo de la línea.
  • pase la constante lk inherited en los elementos 3 y 4 de los arrays de estilo de la columna 5: entonces heredan el estilo estándar, excepto el elemento 4, que cambia a itálica como se define en el array de estilo del list box
  • pase la constante lk inherited en el elemento 4 del array de estilo del list box con el fin de suprimir el estilo itálica.
  • pase la constante lk inherited en el elemento 2 del array de colores de fondo del list box con el fin de restaurar el color alterno original del list box.

Puede definir las propiedades de interfaz "oculta", "desactivada" y "seleccionable"  para cada línea de list box de tipo array.

Estas funcionalidades se pueden manejar por medio del Array de control de líneas, el cual puede designar utilizando el comando LISTBOX SET ARRAY o vía la Lista de propiedades:

Un array de control de líneas debe ser de tipo Entero largo e incluir el número de líneas que el list box. Para obtener más información, consulte la sección Propiedades específicas de los list box.

Cada elemento del Array de control de líneas define el estado de la interfaz de la línea correspondiente en el list box. Tres propiedades de interfaz están disponibles usando las constantes del tema "List box":

Constante Tipo Valor Comentario
lk row is disabled Entero largo 2 La línea correspondiente se desactiva. El texto y los controles tales como casillas de selección se atenúan o se ponen grises. Las áreas de entrada de texto editables ya no son editables. Valor por defecto: Activado
lk row is hidden Entero largo 1 La línea correspondiente está oculta. Ocultar las líneas sólo afecta la visualización del list box.
Las líneas ocultas siguen presentes en los arrays y pueden ser manipuladas por programación. Los comandos del lenguaje, más concretamente LISTBOX Get number of rows o [#cmd id="971"/], no tienen en cuenta el estado visible/oculto de las líneas. Por ejemplo, en un list box con 10 líneas donde las primeras 9 líneas se ocultan, LISTBOX Get number of rows devuelve10. Desde el punto de vista del usuario, la presencia de líneas ocultas en un list box no es visiblemente discernible. Sólo líneas visibles pueden ser seleccionadas (por ejemplo utilizando el comando Seleccionar todo). Valor por defecto: Visible
lk row is not selectable Entero largo 4 La línea correspondiente no se puede seleccionar (resaltarla no es posible). Las áreas de entrada de texto editables ya no son editables a menos de que la opción "Editar en clic único" esté activada. Los controles tales como casillas de selección y listas siguen siendo funcionales sin embargo. Este parámetro se ignora si el modo de selección del list box es "Ninguno". Valor por defecto: seleccionable

Para cambiar el estado de una línea, sólo tiene que pasar las constantes apropiadas en el elemento correspondiente. Por ejemplo, si o quiere que la línea #10 sea seleccionable, puede escribir:

 aLControlArr{10}:=lk row is not selectable

Puede definir varias propiedades de la interfaz a la vez:

Tenga en cuenta que la definición de una propiedad para un elemento anula cualquier otro valor de este elemento (si no reinicializa). Por ejemplo:

 aLControlArr{6}:=lk row is disabled+lk row is not selectable //define la línea 6 como desactivada Y no seleccionable
 aLControlArr{6}:=lk row is disabled //define la línea 6 como desactivado pero seleccionable nuevamente

Cuando se selecciona la opción Ocultar el resaltado de selección (ver la sección Tema Apariencia), debe hacer que las selecciones del list box estén visibles utilizando las opciones de interfaz disponibles. Dado que las selecciones todavía están totalmente gestionadas por 4D, esto significa:

  • Para los list boxes de tipo array, debe analizar la variable de array booleana asociada con el list box para determinar qué filas están seleccionadas o no.
  • Para los list boxes de tipo selección, debe comprobar si el registro actual (fila) pertenece al conjunto especificado en la propiedad Resaltar conjunto del list box.

A continuación, puede definir colores de fondo específicos, colores de fuente y/o estilos de fuente por programación para personalizar la apariencia de las filas seleccionadas. Esto se puede hacer utilizando matrices o expresiones, dependiendo del tipo de list box que se muestre (consulte las siguientes secciones).

Nota: puede utilizar la constante lk inherited para imitar la apariencia actual del list box (color de fondo, estilo de fuente, etc.). (por ejemplo, color de fuente, color de fondo, estilo de fuente, etc.). Para más información acerca de cómo funciona la constante lk inherited, consulte la sección Herencia.

Para determinar qué filas están seleccionadas, debe comprobar si están incluidas en el conjunto indicado en la propiedad Resaltar conjunto del list box:

A continuación, puede definir la apariencia de las filas seleccionadas utilizando una o más de las siguientes expresiones especificadas en la Lista de propiedades:

  • Expresión de color de fondo (tema Fondo y Borde)
  • Expresión de color de fuente (tema Texto)
  • Expresión de estilo (tema Texto)

Nota:  tenga en cuenta que las expresiones se revalúan automáticamente cada vez que:

  • La selección del list box cambia.
  • El list box obtiene o pierde el foco.
  • La ventana del formulario que contiene el list box se convierte en, o deja de ser, la ventana frontal.

Las líneas de ruptura no se pueden resaltar cuando la opción Ocultar el resaltado de selección está seleccionada.

Dado que no es posible tener colores distintos para los encabezados del mismo nivel, no hay forma de resaltar una línea de ruptura específica por programación.

Debe analizar la variable de array booleana asociada con el list box para determinar si las líneas están seleccionadas o no:

A continuación, puede definir la apariencia de las líneas seleccionadas utilizando una o más de las siguientes arrays especificadas en la Lista de propiedades:

  • Array de color de fondo de línea (Tema Fondo y Borde)
  • Array de color de fuente de línea (tema Texto)
  • Array de estilo de línea (tema Texto)

Tenga en cuenta que los arrays de list box utilizados para definir la apariencia de líneas seleccionadas deben ser recalculados durante el evento de formulario On Selection Change; sin embargo, también puede modificar estos arrays basándose en los siguientes eventos de formulario adicionales:

  • On Getting Focus (propiedad list box)
  • On Losing Focus (propiedad list box)
  • On Activate (propiedad formulario)
  • On Deactivate (propiedad formulario)

... dependiendo de cómo desea representar visualmente los cambios de enfoque en las selecciones.

Ejemplo  

Usted ha optado por ocultar el resaltado del sistema y desea mostrar selecciones de list box con un color de fondo verde, como se muestra aquí:

Para un list box de tipo array, debe agregar un método de objeto para actualizar la propiedad Array de fondo de línea:

En este método de objeto, puede escribir:

 Case of
    :(FORM Event=On Selection Change)
       $n:=Size of array(LB_Arrays)
       ARRAY LONGINT(_ListboxBackground;$n// <span id="result_box" lang="es"><span title="ARRAY LONGINT(_ListboxBackground;$n) // row background colors ">colores de fondo de línea</span></span>
       For($i;1;$n)
          If(LB_Arrays{$i}=True// seleccionado
             _ListboxBackground{$i}:=0x0080C080 // <span id="result_box" lang="es"><span title="_ListboxBackground{$i}:=0x0080C080 // green background ">fondo verde</span></span>
          Else // no seleccionado
             _ListboxBackground{$i}:=lk inherited
          End if
       End for
 End case

Para un list box de tipo de selección, para producir el mismo efecto, puede utilizar un método para actualizar la Expresión de color de fondo basada en el conjunto especificado en la propiedad Resaltar conjunto. Por ejemplo:

En el método UI_SetColor, puede escribir:

 If(Is in set("$SampleSet"))
    $color:=0x0080C080 // fondo verde
 Else
    $color:=lk inherited
 End if
 
 $0:=$color

Atención: no olvidar seleccionar la opción Ocultar el resaltado de selección para desactivar el resaltado del sistema (ver arriba).

Es posible poner directamente el resultado de una petición SQL en un list box de tipo array. Esta función ofrece un medio rápido de visualizar el resultado de peticiones SQL. Sólo pueden utilizarse las peticiones de tipo SELECT. Este mecanismo no puede utilizarse con una base SQL externa. 

Esto funciona de acuerdo a los siguientes principios:

  • Cree el list box que recibirá los resultados de la petición. La fuente de datos del list box debe ser Arrays.
  • Ejecute la petición SQL de tipo SELECT y asigne el resultado a la
    variable asociada al list box. Puede utilizar las palabras claves Begin SQL/End SQL (ver el manual de Lenguaje de 4D).
  • Las columnas del list box son ordenables y modificables por el usuario.
  • Cada nueva ejecución de una petición SELECT con la list box provoca la reinicialización de las columnas (no es posible llenar el mismo list box progresivamente utilizando varias peticiones SELECT).   
  • Se recomienda dar al list box el mismo número de columnas que las que tendrá en el resultado de petición SQL. Si el número de columnas del list box es inferior al del necesario para la petición SELECT, las columnas se añaden automáticamente. Si el número de columnas del list box es superior al necesario para la petición SELECT, se
    ocultan las columnas innecesarias.
    Nota: las columnas añadidas automáticamente están relacionadas con las de tipo array. Estos arrays dinámicos permanecen siempre y cuando el formulario exista. Una variable dinámica se crea igualmente para cada encabezado. Cuando se llama el comando LISTBOX GET ARRAYS, el parámetro arrVarCols contiene los punteros a los arrays dinámicos y el parámetro arrVarEncabezados contiene los punteros a las variables de encabezados dinámicos. Si una columna añadida es por ejemplo la quinta columna, su nombre es sql_column5 y su nombre de encabezado es sql_header5.
  • En modo interpretado, los arrays existentes utilizados por el list box pueden redigitarse automáticamente de acuerdo a los datos enviados por la petición SQL

Ejemplo
Queremos recuperar todos los campos de la tabla PERSONAS y ubicar su contenido en el list box cuyo nombre de variable es vlistbox. En el método de objeto de un botón (por ejemplo), es suficiente escribir:

 Begin SQL
    SELECT * FROM PEOPLE INTO <<vlistbox>>
 End SQL



Ver también 

Customize Highlight Color (4D blog)
Download HDI database
Tutoriaux sur les list box

 
PROPIEDADES 

Producto: 4D
Tema: List Box

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

Modificado: 4D v15 R4
Modificado: 4D v16 R2
Modificado: 4D v17

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v20 R7)