FoxPro/Visual FoxPro - Asignar valores a varios texbox desde un solo combobox

   
Vista:
Imágen de perfil de Heriberto

Asignar valores a varios texbox desde un solo combobox

Publicado por Heriberto nicknamenow@hotmail.com (9 intervenciones) el 02/03/2016 18:42:16
codigo
PUC

Saludos amigos.

Tengo un form en el cual recibo datos de cuentas contables segun sea el caso. Son aproximadamente 30 texbox los cuales deben recibir informacion de dos combobox. Cuenado el usuario de click sobre cualquiera de los texbox, se debe asignar uno de los dos combobox segun sea el caso. Seguido, debe permitir que el usuario escoja una cuenta contable y seguido debe asignar ese valor al texbox por medio del cual fue asignado.

Esto lo puedo hacer, validando mediante una variable que texbox llamo al combobox pero como podran observar son demasiadas validaciones y se que debe haber una forma mas simplificada de que el combobox asigne el valor al texbox respectivo. Me podrian ayudar informandome con ejemplos que eventos del combobox puedo afectar y que lineas y comandos de programacion debo usar para simplificar esta tarea.

Gracias por su ayuda...
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

Asignar valores a varios texbox desde un solo combobox

Publicado por Fidel José (321 intervenciones) el 02/03/2016 22:40:52
Te envío un ejemplo de cómo lo puedes hacer sin tanto código.
De hecho, sería mucho mejor si los combobox fueran una clase con un método de usuario para recibir un parámetro.
De todos modos los puedes hacer con elementos estandar, creando una propiedad en el Init de cada Combobox (en el ejemplo, "objRetVal" es el nombre de la propiedad.

Esta propiedad que se iniciala como .null. tomará su valor en el Click de cada TextBox :

This.parent.combobox.ObjRetVal = This && sin comillas ni agregados
This.parent.combobox.SetFocus && envía el foco al combobox indicado.

Para evitar repetir el tema, también puedes hacer una clase textbox que haga eso, o trabajar con los textbox estandar. Crea el código necesario en uno y luego lo replicas tantas veces como necesitas.
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
Imágen de perfil de Heriberto

Asignar valores a varios texbox desde un solo combobox

Publicado por Heriberto (9 intervenciones) el 03/03/2016 01:33:01
Gracias Fidel por tu ayuda, estube ojeando tu ejemplo y me quedo una duda en lo sifuiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ADDPROPERTY(this,"objRetVal",null)
ADDPROPERTY(thisform,"cs_combo1","")
lcListVer ="Cuenta1,Cuenta2,Cuenta3,Cuenta4"
lcListCod ="ACA001,EGD020,EBG050,PCD014"
 
WITH this
	.BoundColumn=2
	.ControlSource = 'Thisform.cs_combo1'
	.AddListItem("(Seleccione Cuenta)",1,1)
	.AddListItem("",1,2)
	FOR i = 1 TO GETWORDCOUNT(lcListVer,",")
		.AddListItem(GETWORDNUM(m.lcListVer,i,","),i+1,1)
		.AddListItem(GETWORDNUM(m.lclistCod,i,","),i+1,2)
	NEXT
	.Requery
	.Refresh
ENDWITH

Aqui en el evento init del combobox, creo entender que crear el cursor cs_cursor y al mismo tiempo le asignas un valor a mostrar lcListVer y otro oculto al usuario lcListCod. En mi caso estoy creando un cursor alimentado por una tabla nativa con SELECT y necesito que me muestre tanto el codigo de la cuenta como su respectivo nombre. Me podrias explicar. Gracias....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Asignar valores a varios texbox desde un solo combobox

Publicado por Fidel José (321 intervenciones) el 03/03/2016 12:49:59
Heriberto.
1) Sobre el rellenado de combobox

No debes preocuparte por el método de rellenado del combo, porque esto depende de varias cuestiones.
En el ejemplo, para no embarullar con una tabla o cursor que también tendría que haber adjuntado, uso un par de listas con el método AddListitem, para RowSourceType = 0. Puedes pensar que el par de listas corresponde a un cursor de dos columnas.

En el form de ejemplo puedes reemplazar el código del Init del Combobox por el siguiente:

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
*<Nuevas Propiedades>
ADDPROPERTY(this,"objRetVal",null)	&& agrega una propiedad al combo
ADDPROPERTY(thisform,"cs_combo1","")  && agrega una propiedad al form
*</Nuevas Propiedades>
 
*<Creación de un cursor>
lcListVer ="Cuenta1,Cuenta2,Cuenta3,Cuenta4"
lcListCod ="ACA001,EGD020,EBG050,PCD014"
 
CREATE CURSOR cur_Combo1 ("CODIGO" C(6),"DESCRIP" C(40))
INSERT INTO cur_Combo1 (codigo,Descrip) VALUES ("","(Seleccione Cuenta)")
 
FOR i = 1 TO GETWORDCOUNT(lcListCod,",")
	INSERT INTO cur_Combo1 (codigo,descrip) ;
		VALUES (GETWORDNUM(lcListCod,i,","),;
			GETWORDNUM(lcListVer,i,","))
NEXT
*</Creación de un cursor>
 
WITH this
	.BoundColumn=2
	.ControlSource = 'Thisform.cs_combo1'
	.RowSourceType = 6
 
	.RowSource = "cur_combo1.descrip,codigo"
 
	.Requery
	.Refresh
ENDWITH

En esta versión, con las listas lcListCod y lcListVer genero un cursor (cur_combo1) y relleno el combobox con ese cursor.
1) Todo esto de la generación del cursor no estará en tu modelo porque ya tienes ese cursor generado.
2) La propiedad agregada al form (cs_combo1) que figura como ControlSource del combobox, tiene por objeto que el combobox no se muestre vacío. Fijate que para eso, agrego un registro al cursor, donde el campo "Codigo" está vacío y en el campo "descrip" va la leyenda "(Seleccione Cuenta)".
Alternativamente, podría haber puesto
.ControlSource = 'cur_combo1.codigo'.
Pero esto me obliga a posicionar el puntero de registro del cursor en un lugar determinado.

Si necesitas que el combobox vuelva a su posición por defecto:
Thisform.cs_combo1=""
thisform.container1.combo1.refresh

Si necesitas que el combobox muestre el valor del cuadro que se enfoca:
*<GotFocus Event>
Thisform.cs_combo1 = alltrim(this.text)
This.parent.combo1.refresh
*</GotFocus Event>
Fijate que con este código, si el textbox está vacío, el combobox mostrará "(seleccione Cuenta)" y si no, mostrará el nombre de la cuenta coincidente.

2) Sobre la mecánica de selección y asignación de valores
Acá juega la propiedad agregada al combobox (ObjRetVal).
Al asignar
This.parent.combo1.ObjRetVal = This
dentro del objeto Textbox de que se trate, le estamos diciendo al combobox cuál es el objeto al que debe dirigir la respuesta y el foco posterior.
La propiedad ObjRetVal no contiene el nombre del objeto, sino la referencia de objeto, con lo cual podemos operar directamente como si la propiedad fuera el objeto mismo.
De ahí que en el Click Event del ComboBox, podemos hacer
1
2
3
4
5
6
7
8
9
10
11
LOCAL lnItem,lcValue
lnItem = this.ListItemId
IF lnItem # 0
	lcValue = this.ListItem(lnItem,2)
	IF NOT EMPTY(m.lcValue)                 && si está vacío, no produce respuesta
		IF VARTYPE(this.objRetVal)="O"         && puede que sea el valor null porque no se cliqueó ningún textbox.
			this.objRetVal.Value = m.lcValue           && coloca el valor en el textbox que corresponde a la referencia de objeto
			this.objRetVal.SetFocus                         && envía el foco al textbox que corresponde a la referencia de objeto
		ENDIF
	ENDIF
ENDIF
Fijate que al perder el foco el Combobox (Combo1.LostFocus) la propiedad ObjRetVal vuelve a tomar el valor nulo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Heriberto

Asignar valores a varios texbox desde un solo combobox

Publicado por Heriberto nicknamenow@hotmail.com (9 intervenciones) el 04/03/2016 01:51:42
Gracias Fidel, tu ayuda a sido clara y me ha sacado de esta trinchera... jejejejee... Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar