evento doble click de grid

779 views
Skip to first unread message

leonardo trujillo

unread,
Jun 9, 2014, 9:13:21 PM6/9/14
to grupo google vfp
gente, la pregunta es algo "trillada" pero no entiendo cómo resolver el problema.
Por lo que he leído, para hacer doble click sobre una fila de un grid y se dispare un evento, hay que poner la propiedad AllowCellSelection = .F. del grid (para que se seleccione toda la fila) y en vez de poner en cada método doble click del text de cada columna del grid el código (lo que quiero que haga), se utiliza BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])

Ahora, lo que he hecho es poner en el doble click del grid lo que quiero hacer y en el init del grid lo siguiente:
LOCAL nCol

WITH This
FOR nCol = 1 TO .ColumnCount
BINDEVENT(.Columns (nCol).Text1, "DblClick", ThisForm, "DblClick")
NEXT
ENDWITH

en el DblClick del grid tengo
thisform.varpara = thisform.grid1.column1.text1.Value
DO FORM orden_de_pago2 WITH thisform.varpara

lo que hago es pasarle al form el valor que aparece en el primer text de la columna 1.

Lo que ocurre es nada, solo hace lo deseado si hago doble click sobre cualquier fila de la columna uno, pero si hago click en cualquier otra columna, no me toma el valor correspondiente a su primer celda.

¿Alguna sugerencia para solucionar esto?
Está claro que estoy utilizando mal bindevent.
Sé que puedo resolverlo poniendo el código en cada text de cada columna, pero no me parece que demuestre mucho más conocimiento del poco que ya tengo...
Agradezco sus sugerencias

integral

unread,
Jun 9, 2014, 10:59:32 PM6/9/14
to publice...@googlegroups.com
Amigo Leonardo :
 
Te comento que un tiempo atras pensaba igual que tu, es decir en mejorar y utilizar una codificacion mas actual y acorde con los nuevos comandos que existen...
 
Pero hay que tener presente algo...
 
En la medida que sea complejo el problema que tengamos, mas aprenderemos a utilizar y mejorar nuestros conocimientos.
 
Y como bien me dijeron en una oportunidad para que complicarse... 
 
Mas adelante tendras otras oportunidades con la experiencia que vayas adquiriendo en mejorar y utilizar los nuevos comandos... 
 
Retomando tu pregunta....
 
Como una solucion crea un Metodo que contenga el proceso que deseas establecer y dicho metodo lo copias en cada columna y listo... 
   
Ej.- Thisform.Selecciona()
 
Saludos,
 
INTEGRAL

leonardo trujillo

unread,
Jun 9, 2014, 11:11:44 PM6/9/14
to grupo google vfp
gracias Integral, era en lo que andaba.
he dado tantas vueltas en un problema sencillo que me he mareado 
estoy viendo cómo obtengo el valor de la primer celda de la fila que selecciono (la columna 1 de la fila n) 

leonardo trujillo

unread,
Jun 9, 2014, 11:26:49 PM6/9/14
to grupo google vfp
bueno, me respondo a mi mismo... si a alguien le sirve, la respuesta la saqué de por aquí, juntando varias cosas (el BINDEVENT quedará para otra instancia)

enlacé el grid al cursor (el cursor se crea en el load del formulario), poniendo el recordsource del grid = nombre del cursor y el recorsourcetype = 1-alias.
Luego en cada text, correspondiente a las columnas del grid, en sus dblclick (porque lo quería ahí) puse 
thisform.varpara = cursorgrid.nroorden
DO FORM orden_de_pago WITH thisform.varpara

Fidel Charny

unread,
Jun 10, 2014, 7:31:57 AM6/10/14
to publice...@googlegroups.com
Leonardo:
Si AllowCellSelection=.F., debes utilizar el click o DblClick del grid y no el de los objetos de las columnas.
Si AllowCellSelection=.t. (default), debes utilizar el click o DblClick de los objetos de las columnas.

En tu caso, para ponerlo por BindEvent, con AllowCellSelection=.F.
1) Creas un método en el formulario, que acá llamo "GetAction"
PROCEDURE GETACTION
DO FORM orden_de_pago WITH cursorgrid.nroOrden

* Acá no necesitas (aparentemente) conocer nada de la celda en la que haces el doble click.
* Si necesitas conocer el valor de esa celda tienes que capturar el objeto. Y el código debería comenzar con:
LOCAL lnEvents, objBind
LOCAL ARRAY laEvents
lnEvents=Aevents(laEvents,0)
if lnEvents=0
        REturn
endif
objBind=laEvents[1]  && para este caso, objBind será el TExt1 en el que se hizo dblclick

* lcTomoValue = objBind.Value

do form TalForm with objBind.Value


2) Después de configurar el grid, i
For i=1 to Thisform.grid1.ColumnCount
       BindEvent(Thisform.GRid1.Columns[i].Text1,"DblClick",Thisform,"GetAction")
endfor
* La ventaja de esto es que si aumentas la cantidad de columnas, no tienes que hacer nada.
* También puedes hacer .grid1.ColumnCount=-1 y redefinir completamente el grid, incluído el BindEvent()

Si AllowCellSelection=.T.
<Grid1.DblClick>
DO FORM orden_de_pago WITH cursorgrid.nroOrden
</Grid1.DblClick>

leonardo trujillo

unread,
Jun 10, 2014, 7:55:45 AM6/10/14
to grupo vfp

Muchas gracias Fidel.

Reply all
Reply to author
Forward
0 new messages