FoxPro/Visual FoxPro - valor de celda de grid a variable

   
Vista:

valor de celda de grid a variable

Publicado por Matías (5 intervenciones) el 20/08/2017 01:11:14
Buenas tardes, espero poder expresarme lo mejor posible para que me entiendan y me ayuden !

Tengo un grid, con estas columnas:

Codigo Nombre Domicilio Telefono etc .....

quiero lograr grabar en una variable el valor del campo codigo de la fila en la que haga click o me mueva y quede seleccionada....

en parte lo logré con este código:

var = thisform.grid1.column1.text1.value

mientras haga click en la columna codigo funciona, me muestra el codigo de la fila seleccionada...

pero si hago click en otra columna... como nombre, domicilio, etc... se selecciona la fila, pero no me muestra
en la variable el valor del campo codigo...

como puedo solucionar esto?

cual es la forma de obtener los datos de un campo del grid de la fila seleccionada sin hacer click justamente en ese campo,
solo haciendo click en algún lugar de la fila?

muchas gracias!!
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
Imágen de perfil de Leonardo Daniel A.

valor de celda de grid a variable

Publicado por Leonardo Daniel A. (217 intervenciones) el 20/08/2017 06:15:23
El Grid de Vfox es muy limitado, no tiene evento para el click de una fila

la opcion, es en el menu formulario entrar a Crear nuevo Metodo, y llamalo TraeCodigo y rentro de el pones un Return codigo

y en el evento click del text de cada columna tienes que mandarlo llamar

codigo = thisform.TraeCodigo()

te adjunto la prueba que hice
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

valor de celda de grid a variable

Publicado por Fidel José (561 intervenciones) el 20/08/2017 15:40:20
Acá propongo un método basado en BindEvent()
Esto funciona con VFP9 SP2.
Si bien parece algo complicado, es conveniente estudiarlo porque muestra el camino para solucionar una gran variedad de temas de índole similar, dependiendo del ingenio del programador.

La alternativa de colocar código en los CurrentControl de las Columns de un Grid, no es válida, porque este código puede desaparecer por completo en tiempo de ejecución.
Si se dominan las clases visuales, siempre es recomendable una clase grid y de los objetos que sean currentcontrol de las columnas (text1, checkbox1, etc) y cargarlos en tiempo de ejecución en reemplazo de los nativos.

Si no se tiene dominio sobre clases visuales y no visuales, o la situación no merece la creacion de clases, siempre hablando de VFP9, se puede utilizar BindEvent(), más o menos como el ejemplo 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
*<Load>
	* También pueden crearse las propiedades en tiempo de diseño
	* Definir Propiedad Pick_Data en el formulario
	Addproperty(Thisform,"Pick_Data","")	&& columnas del grid que se capturan (csv)
	* Definir Propiedad _Separator en el formulario
	Addproperty(Thisform,"_Separator","")	&& para Excel CHR(9), para otros, el que sea [ chr(124), chr(44), chr(59) ]
*</Load>
 
*<Init del form>
	* Los valores pueden depender de una condición pasada por parámetro
	* También pueden depender de la tabla o cursor asociado al grid
	* O pueden depender de una acción del usuario en el formulario.
 
	This.Pick_Data = "1,2,3,5"    && Puede alterarse el orden, pe "1,3,5,2"
	This._Separator = CHR(9)
*</Init del form>
 
*<Introducir BindEvent()>
	* Este código debe ejecutarse una vez finalizada la configuración del Control Grid
	* Suponiendo que tenemos un control grid llamado "grilla"
	* En este caso se lia el evento DblClick. Cambiar por "Click" o "RightClick"
	FOR i = 1 TO this.grilla.ColumnCount
		lcCurrentControl = this.grilla.Columns(i).CurrentControl
		BINDEVENT(this.grilla.Columns(i).&lcCurrentControl,"DblClick",thisform,"dlg_response")
	NEXT
*</Introducir BindEvent()>
 
 
*<Método delegado de BindEvent>
	* Method Name: "dlg_Response"
	* Este método es llamado solamente por BindEvent()
	* Los métodos delegados deben contener exactamente los mismos parametros que el evento sustituido
	* Para el caso, el evento DblClick no tiene parámetros, por lo que no debe incluirse ninguno.
	TRY
 
		LOCAL lnEvents,;
			loControl as Object,;
			loGrid as Object,;
			loex as Exception,;
			lcSTring,;
			lcCursor,;
			lnColumns,;
			lcPickData,;
			i,;
			lnCol
 
		LOCAL ARRAY laEvents(1)
 
		lcString = ""
		*	Si Empty(this.pick_data), tomará el valor de la celda seleccionada
		*	this.pick_data = "1,2,3,4"
		*	this.pick_data = ""
		*	this._separator = CHR(9)
 
		lnEvents = AEVENTS(laEvents,0)
 
		IF m.lnEvents > 0
			loControl = laEvents(1)
			loGrid = loControl.parent.parent
			lcCursor = loGrid.recordsource
			lnColumns = loGrid.ColumnCount
 
			IF EMPTY(this.pick_data)
				IF AT(".",loControl.ControlSource)>0
					lcString = EVALUATE(loControl.ControlSource)
				ELSE
					lcString = EVALUATE(m.lcCursor+"."+loControl.ControlSource)
				ENDIF
			ELSE
				FOR i = 1 TO GETWORDCOUNT(this.pick_data,CHR(44))
					lnCol = VAL(GETWORDNUM(this.pick_data,m.i,CHR(44)))
					IF m.lnCol > 0
						lcControlSource = loGrid.Columns(m.i).ControlSource
						IF AT(".",m.lcControlsource)>0
							lcCapture = EVALUATE(m.lcControlSource)
						ELSE
							lcCapture = EVALUATE(m.lcCursor+"."+m.lcControlSource)
						ENDIF
						lcString = m.lcString ;
							+ IIF(EMPTY(m.lcString),"",this._separator);
							+ m.lcCapture
					ENDIF
				NEXT
			ENDIF
		ENDIF
		* En este punto se puede enviar el valor de m.lcString a un cuadro de texto
 
		* También puede dispararse un método del form o de una clase mediante raiseevent()
		* Por ejemplo, si incluimos en el formulario un método llamado "Disparador"
		* En el Load o Init del form
		*	Addproperty(thisform,"oClass",Thisform)					&& referencia al objeto que contiene el método
		*	Addproperty(thisform,"cRaise_DblClick","Disparador")	&& nombre del método que debe lanzarse
		*
		* Si se asigna un objeto a la propiedad .oClass, no olvidar
		*	<Destroy>
		*	This.oClass = null
		* 	</Destroy>
		* De otra forma puede que no se libere el formulario.
		*
 
		IF VARTYPE(this.oclass)="O" ;
			AND !EMPTY(this.cRaise_DblClick) ;
			AND PEMSTATUS(this.oclass,this.cRaise_DblClick,5)
			RAISEEVENT(this.oclass,this.cRaise_DblClick,m.lcString)
		ENDIF
 
	CATCH TO loex
		loex.UserValue = PROGRAM()
		*ShowError(loex)	&& Rutina que muestra el error
 
	FINALLY
		loControl = null
		loGrid = null
		* Enviar el resultado al clipboard de Windows
		_cliptext = m.lcString
	ENDTRY
 
*</Método>
 
*<Metodo para RaiseEvent() - Name="Disparador"
	LPARAMETERS tcString
	Messagebox(m.tcString)
*</Metodo>
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
Imágen de perfil de Leonardo Daniel A.

valor de celda de grid a variable

Publicado por Leonardo Daniel A. (217 intervenciones) el 20/08/2017 20:26:42
mejor cambiate a PowerBuilder, jeje, lo vas a amar
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 Ever Ramirez

valor de celda de grid a variable

Publicado por Ever Ramirez (24 intervenciones) el 20/08/2017 22:18:11
Se supone q tu registros lo tenes en un cursor.
Supongamos q lo tenes en un cursor llamdo mycusor
Entonces lo q haces es lo siguientes:
1 — asignar curdor al grid
1
2
3
Thisform.grid1.recordsource= "mycursor"
Thisform.grid1.recorsourcetype=1
Thisform.grid1.refresh

2— en el grid en el evento AfterRowColChange colocas lo siguiente:
1
Var= mycursor.codigo
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

valor de celda de grid a variable

Publicado por Matías (5 intervenciones) el 21/08/2017 18:02:02
Muchas gracias a todos los que respondieron, está genial la ayuda que brindan los que saben más !

Ever, lo primero que probé fue tu código, por ser el mas sencillo, y lo bueno es que me funcionó a
la perfección, era lo que estaba buscando lograr...

Muchas 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
Imágen de perfil de Leonardo Daniel A.

valor de celda de grid a variable

Publicado por Leonardo Daniel A. (217 intervenciones) el 21/08/2017 18:33:37
mmm entonces como llenabas el grid...... debe estar ligado a una tabla.... por eso te subi el ejemplo...


pero buenoo
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

valor de celda de grid a variable

Publicado por Matías (5 intervenciones) el 22/08/2017 16:23:43
Hola Leonardo, estuve mirando el ejemplo que me pasaste, y aparte de funcionar perfecto para lo que yo necesitaba,
aprendí otras cosas nuevas, como llamar al método y a escribir codigo en el text de cada columna,
(no encontraba el click en header, columna tocando el grid, hasta que lo encontre en el desplegable... aprendo todo nuevo)

te agradeco mucho tu tiempo y conocimientos y el form que hiciste como ejemplo, me sirvió mucho..!!
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
Imágen de perfil de Leonardo Daniel A.

valor de celda de grid a variable

Publicado por Leonardo Daniel A. (217 intervenciones) el 25/08/2017 05:15:18
que bueno me da gusto
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
Revisar política de publicidad