Para trabajar con combobox lo primero que debe hacerse es crear una clase combobox en una librería vcx, de modo que tus combobox tengan la apariencia que más te guste y no necesites escribir todo cada vez. Luego simplemente la arrastras de la clase al formulario o container y le atribuyes el nombre adecuado a su función.
Hay varias maneras de trabajar con combobox, pero siempre hay que tener en cuenta que la cantidad de items a mostrar no debe ser grande. En general, no debería tener más de 25 items y ya esto suele ser engorroso para el usuario. Cuando los items son muchos, lo mejor es crear un formulario con un grid.
A mi me ha resultado trabajar el combobox como RowSourceType = 0 y rellenarlo a través de .AddListItem, aún cuando sus datos provengan de un cursor o tabla. El ejemplo que voy a dar, está basado en ese concepto.
Para rellenar un combobox, lo mejor es crear un método en el formulario al cual se agrega la clase y llamarlo desde el INIT de ese formulario. Para el ejemplo, el combobox tiene como name = "cmb_locali" y el método agregado se llama "Gen_cmbLocali"
Entonces, en el init del form, tendremos una instrucción como la siguiente:
This.gen_cmbLocali()
Para probar la funcionalidad, puedes agregar el siguiente código al evento Click del combobox;
Ahora puedes probar que, si cambias el valor de la propiedad de control (thisform.codLocali) en cualquier parte del form y refrescas el combobox, éste se ajustará al valor de la propiedad
Thisform.codLocali = "c03"
thisform.cmb_locali.Refresh()
Nota1:
Al manipular el combobox, el valor de la propiedad thisform.codLocali, se asumirá recién en el lostFocus, como en cualquier otro cuadro de VFP, por lo que si debes lanzar un método a partir del evento Click() o del Evento InteractiveChange(), tendrás dos soluciones:
1) Pasar como parámetro el valor correspondiente (en el ejemplo sería m.lcCodigo)
2) Declarar el valor de la propiedad antes de lanzar el método
Thisform.codLocali = m.lcCodigo
En un supuesto botón de Aceptar del formulario, puedes testear si se ha seleccionado alguna Ciudad con
Puede resultarte útil el valor de la propiedad DisplayValue del combobox. Su contenido es justamente, lo que está viendo el usuario.
NOTA2:
A mi no me resulta práctico que se agreguen nuevos items al combobox directamente. Cuando el usuario puede agregar items, prefiero controlar el proceso a través de un método específico que agregue lo necesario en forma controlada. Con eso se evitan algunos disparates que suelen meter los usuarios (puntos, rayas, etc)
Para eso, hay por lo menos dos maneras:
1) Agreando un botón al costado del combobox (con un signo +, por ejemplo)
2) Si el combobox tiene una label asociada, utilizar el click de la label para agregar items.
Una vez que se aprobó el proceso de nuevos items, se vuelve a llamar al método Gen_CmbLocali() y todo seguirá bien.
De acuerdo a que se necesite o no que mantenga la selección de item preexistente, se puede pasar un parámetro al método Gen_cmbLocali:
Acá está el método modificado
Cuando lo llamas desde el Init del formulario;
This.gen_CmbLocali( .T. )
Mientras que la llamada, después de modificar la fuente de datos, será
Thisform.gen_cmbLocali(.F.)