You are on page 1of 11

ListBox y ComboBox

Son controles, es decir, no contienen otros objetos.


Ofrecen una lista con cualquier nmero de opciones. Funcionalmente
son muy similares, salvo detalles.
Son ms poderosos que un OptionGroup, cuyas opciones son pocas.
Pueden prescindir de usar ControlSource. Si lo usan, ste puede ser un
campo de cualquier tipo.
Las opciones pueden estar formadas por una sola columna:
Pero pueden estar formadas por dos o ms columnas:
lvarez Anala Jujuy 475 15380
Garca Juan Laprida 1048 03475
Hernndez Alejandro Santa Fe 2038 00926
lvarez Anala
Garca Juan
Hernndez Alejandro
Para definir cuntas columnas tendr el objeto, se usa la propiedad
ColumnCount. Para el primer ejemplo, ColumnCount es 1 y para el segundo
ejemplo ColumnCount es 3.
Hay varias formas de originar las opciones. Veremos dos:
Valores introducidos manualmente. En la propiedad RowSourceType
se elige 1 - Valor y en la propiedad RowSource se escriben los valores,
separndolo con comas.
lvarez Anala,Garca Juan,Hernndez Alejandro
Para el ejemplo de opciones con una columna, RowSource ser:
Para el ejemplo de opciones con tres columnas, RowSource ser:
lvarez Anala,Jujuy 475,15380,Garca Juan,Laprida
1048,03475,Hernndez Alejandro,Santa Fe 2038,00926
Origen de las opciones
Valores tomados de una tabla. Si hay miles de clientes, sera imposible
escribir a mano los datos de cada opcin. Como la tabla Cli ya posee esos
datos, se pueden construir las opciones automticamente a partir de ella.
Por ejemplo, si queremos un ListBox cuyas opciones sean tomadas de los
campos Nom y Cli de la tabla Cli, formando 2 columnas, RowSource ser:
cli.nom,cli
En la propiedad RowSourceType se elige 6 - Campos y en la propiedad
RowSource se escribe la tabla, un punto y un campo por cada columna a
producir, separndolos por comas.
Para que las opciones aparezcan ordenadas por la primera columna, se
debe activar el ndice Nom en la propiedad Order del cursor de la tabla Cli.
Ancho de las columnas
ListBox y ComboBox, volvemos a decir, son controles. Esto significa que
no contienen objetos Column.
Cmo lograr, entonces, un ancho adecuado de las columnas que forman las
opciones?
Se usa la propiedad ColumnWidths, que es un listado de anchos, uno por
columna, separados por comas.
Si queremos que una columna sea invisible, su ancho debe ser 0. Esto no
significa que esa columna no exista.
Sincronizacin entre opciones y registros
Cuando las opciones se generan a partir de campos de una tabla, cada vez
que se elige una opcin en tiempo de ejecucin, VFP selecciona el registro
que le da origen, produciendo un salto del puntero de registros.
Esta sincrona entre desplazamiento por la lista de opciones y desplazamiento
por los registros de la tabla sirve para manejar un Grid subordinado.
Hemos visto ejemplos de un Grid1 independiente y un Grid2 subordinado
a la tabla de Grid1. Cambiando de registro en Grid1 se produca el efecto
de subordinacin en Grid2.
Tambin hemos visto una tabla independiente cuyos campos se mostraban en
TextBoxes y un Grid que mostraba otra tabla, subordinado a la primera. Para
cambiar de registro en la tabla independiente usamos botones de navegacin.
Al cambiar de registro, se produca el efecto de subordinacin.
Ahora podemos lograr una nueva forma de cambiar de registro en la tabla
independiente, usando un ListBox o un ComboBox.
Necesitaremos un ListBox (o ComboBox) y un Grid subordinado. El ListBox
mostrar la tabla independiente.
Al cambiar de opcin en el ListBox (o ComboBox), por la sincronizacin
estaremos cambiando de registro en la tabla independiente.
El cambio de registro en la tabla independiente produce que cambien los
registros que muestra el Grid subordinado.
Observen que no hemos usado la propiedad ControlSource del ListBox o
ComboBox.
Uso de ControlSource
Ser posible guardar la opcin elegida en el campo de una tabla?
S es posible, con algunas precauciones.
Si la opcin tiene varias columnas, hay que indicar cul columna de la
opcin se va a guardar en ControlSource. Para ello se usa la propiedad
BoundColumn, cuyo valor por defecto es 1.
Sea un ListBox (o ComboBox) cuyas opciones estn construidas con los
campos Nombre, Domicilio y Cdigo de cliente de la tabla Cli, es decir,
RowSourceType = 6 Campos y RowSource = cli.nom,dom,cli.
Si se quiere guardar el domicilio, BoundColumn deber ser 2.
Si se quiere guardar el cdigo de cliente, BoundColumn deber ser 3.
VFP arma en memoria una matriz con las opciones del ListBox o ComboBox,
sean stas introducidas manualmente o a partir de una tabla.
Esa matriz tiene tantas filas como opciones y tantas columnas como se
define en ColumnCount.
Esto hace que, cuando ControlSource sea un campo numrico, por defecto
VFP guarde el nmero de fila de la matriz, no el valor que vemos en la
opcin.
Como esto no es lo que normalmente queremos, porque lo normal es
guardar el nmero que vemos en la opcin, no el nmero de la fila, hay
que corregir la propiedad BoundTo.
Si BoundTo es .F., se guarda el nmero de fila. Si BoundTo es .T., se
guarda el valor que vemos en la opcin.
Si las opciones del ListBox o ComboBox se originan a partir de una tabla, el
campo indicado en ControlSource nunca es un campo de la tabla que origina
las opciones. Debe ser el campo de otra tabla.
La restriccin anterior se entiende con un ejemplo.
Asemejemos la tabla a la gua telefnica, con las columnas nombre,
domicilio y telfono de los abonados.
Sea que necesitamos completar un formulario de socios con sus telfonos.
Al procesar cada formulario, buscamos el nombre del socio en la gua
telefnica. Si lo encontramos, trascribimos el telfono al formulario.
No trascribimos el telfono a la gua, porque ya est ah.
El formulario de socios ejemplifica la otra tabla. El lugar donde transcribimos
el telfono es similar al campo declarado como ControlSource.
Cuando se usa ControlSource, el comportamiento de ListBox y ComboBox es
similar a como acta la funcin BuscarV de Excel.
En BuscarV hace falta un valor a buscar en una matriz, la matriz y el lugar
donde depositar el resultado.
La matriz est formada por opciones dispuestas en filas. Cada opcin est
formada por dos o ms columnas.
El valor a buscar se escribe en una celda. Excel busca el correspondiente
en la primera columna de la matriz. Cuando lo encuentra, devuelve el valor
que est en la columna 2, 3, etc., segn expresa el indicador de columna.
El valor devuelto se guarda en la celda que tiene la funcin BuscarV.
En ListBox y ComboBox, el valor a buscar se toma en el ejemplo del
formulario de socios, pero puede ser el valor de un campo. La matriz donde
se busca es la lista de opciones. La bsqueda se hace por la primera
columna. Cuando se encuentra la opcin deseada y se la elige, VFP
devuelve el valor que est en la columna 2, 3, etc., segn indica
BoundColumn. El valor devuelto se guarda en el campo indicado en
ControlSource.

You might also like