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.