FoxPro/Visual FoxPro - Ejemplos de Combobox

 
Vista:
sin imagen de perfil
Val: 96
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejemplos de Combobox

Publicado por roberto (55 intervenciones) el 15/01/2020 15:18:33
Hola buenas, necesito pedir un favor, alguien podría decirme o facilitarme ejemplo de la utilización del objeto combobox.

Necesito lo mas básico de lo básico ya que la información que he logrado reunir es demasiado avanzada y todavía no logro conocer algunas cosas que necesito y que son básicas.

Por ejemplo como llenar un combobox con los datos que muestro a continuación y como después tener acceso a ellos en el despliegue y la selección.

codigo descripcion distanncia
c01 ciudad 1 km 1
c02 ciudad 2 km 2
c03 ciudad 3 km 3



c0n ciudad n km 4


Lo he hecho por el método carretero pero me gustaría conocer mas opciones.

Agradecido
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejemplos de Combobox

Publicado por Fidel José (657 intervenciones) el 15/01/2020 23:36:00
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()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
* gen_cmbLocali (Método del formulario)
LOCAL lcText,;
	lnLines,;
	i
 
LOCAL ARRAY laLines(1)
 
* Fuente de datos (podría ser un cursor o un Array)
TEXT TO lcTExt NOSHOW PRETEXT 7
c01,ciudad 1,km 1
c02,ciudad 2,km 2
c03,ciudad 3,km 3
c04,ciudad 4,km 4
ENDTEXT
 
* Agrega una propiedad al formulario para controlar el combobox
* Esta propiedad es mejor crearla en formulario con lo cual se evita la comprobación de PEMSTATUS()
 
IF !PEMSTATUS(thisform,"codLocali",5)
	ADDPROPERTY(thisform,"codLocali","")
ELSE
	this.codlocali = ""
ENDIF
 
* Genera un Array a partir del texto
lnLines = ALINES(laLines,m.lcText,1+4,CHR(9),CHR(10),CHR(13))
 
* Rellenado del combobox
WITH this.cmb_locali
	.clear
	.boundcolumn = 2
	.ControlSource = "Thisform.codLocali"
	.AddListItem("(Seleccione Localidad)",1,1)
	.AddListitem("",1,2)
	.addListitem("",1,3)
 
	FOR i = 1 TO m.lnLines
		.AddListItem(GETWORDNUM(laLines[i],2,CHR(44)),i+1,1)
		.AddListItem(GETWORDNUM(laLines[i],1,CHR(44)),i+1,2)
		.AddListItem(GETWORDNUM(laLines[i],3,CHR(44)),i+1,3)
	NEXT
	.requery
	.refresh
ENDWITH

Para probar la funcionalidad, puedes agregar el siguiente código al evento Click del combobox;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
* cmb_locali.Click()
LOCAL lnItem,;
	lcCodigo,;
	lcCiudad,;
	lcKilomet,;
	lnKilomet,;
	lcString
 
lnItem = this.ListItemId
IF !EMPTY(m.lnItem)
 
	lcCodigo = this.ListItem(m.lnItem,2)
	lcCiudad = this.ListItem(m.lnItem,1)
	lcString = this.ListItem(m.lnItem,3)
 
	* Quita cualquier caracter que no sea un dígito.
	lcKilomet = CHRTRAN(m.lcString,CHRTRAN(m.lcString,"1234567890",""),"")
	lnKilomet = VAL(m.lcKilomet)
 
	MESSAGEBOX("Código="+m.lcCodigo + CHR(13) ;
		+ "Ciudad="+m.lcCiudad + CHR(13) ;
		+ "Kilómetros="+m.lcKilomet)
 
ENDIF

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
1
2
3
4
5
IF EMPTY(thisform.codLocali)
	MESSAGEBOX("No seleccionó una localidad")
	thisform.cmb_locali.SetFocus()
	RETURN
ENDIF

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
LPARAMETERS tl_EsInit
 
LOCAL lcText,;
	lnLines,;
	i
 
LOCAL ARRAY laLines(1)
 
* Fuente de datos (podría ser un cursor o un Array)
TEXT TO lcTExt NOSHOW PRETEXT 7
c01,ciudad 1,km 1
c02,ciudad 2,km 2
c03,ciudad 3,km 3
c04,ciudad 4,km 4
ENDTEXT
 
* Agrega una propiedad al formulario para controlar el combobox
IF !m.tl_EsInit
	IF !PEMSTATUS(thisform,"codLocali",5)
		ADDPROPERTY(thisform,"codLocali","")
	ELSE
		this.codlocali = ""
	ENDIF
ENDIF
 
* Genera un Array a partir del texto
lnLines = ALINES(laLines,m.lcText,1+4,CHR(9),CHR(10),CHR(13))
 
* Rellenado del combobox
WITH this.cmb_locali
	.clear
	.boundcolumn = 2
	.ControlSource = "Thisform.codLocali"
	.AddListItem("(Seleccione Localidad)",1,1)
	.AddListitem("",1,2)
	.addListitem("",1,3)
 
	FOR i = 1 TO m.lnLines
		.AddListItem(GETWORDNUM(laLines[i],2,CHR(44)),i+1,1)
		.AddListItem(GETWORDNUM(laLines[i],1,CHR(44)),i+1,2)
		.AddListItem(GETWORDNUM(laLines[i],3,CHR(44)),i+1,3)
	NEXT
	.requery
	.refresh
ENDWITH
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.)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar