Page 1 of 1
Capturar tecla ESC y RETURN en TTreeview
Posted: Thu Oct 16, 2014 6:33 pm
by jmartial
Hola,
Pues eso, que no sé como hacer que con intro en un ttreeview sea como aceptar o con ESC me pueda salir o ejecutar una acción.
No sé como capturar estas teclas en un tree. ¿ Se puede hacer ?
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Thu Oct 16, 2014 10:01 pm
by horacio
Fijate si te sirve
viewtopic.php?f=6&t=29404Saludos
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Thu Oct 16, 2014 10:08 pm
by jmartial
Horacio,
¿Pero como capturo return y Esc?
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Thu Oct 16, 2014 11:25 pm
by carlos vargas
Code: Select all | Expand
oTree:bKeyDown := {|n| ProcKeyTree(n) }
...
function Prockey(n)
do case
case n==VK_ESC
...
return 1
case n==VK_RETURN
...
return 1
enddo
return nil
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Fri Oct 17, 2014 4:13 am
by jmartial
Hola Carlos,
¿ Ese código lo has probado con un ttreeview ?
Porque yo pongo otree:bkeydown :={|nkey| msginfo(nkey) }
Y nunca muestra nada con Enter ni Esc.
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Fri Oct 17, 2014 12:36 pm
by karinha
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Sat Oct 18, 2014 12:45 pm
by Antonio Linares
Joaquin,
Prueba a implementar el método KeyDown() en la clase TTreeView
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Sun Oct 19, 2014 8:02 pm
by jmartial
Antonio,
Esta es la única forma en la que he conseguido ejecutar bKeydown. Pero no estoy muy seguro de que sea correcto.
He cambiado este método en la clase Ttreeview:
Code: Select all | Expand
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TTreeView2
local oItem
do case
case nMsg == WM_CHAR
if nWParam == VK_RETURN
return 1
endif
case nWParam == VK_RETURN .or. nWParam == VK_ESCAPE
if ::bKeyDown != nil
return Eval( ::bKeyDown, nWParam, 0, Self )
endif
endcase
return ::Super:HandleEvent( nMsg, nWParam, nLParam )
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Mon Oct 20, 2014 2:00 pm
by Antonio Linares
Joaquín,
Para mantener la lógica de FiveWin, lo has intentado asi ?
case nMsg == WM_KEYDOWN
...
ó
case nMsg == WM_CHAR
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Mon Oct 20, 2014 2:54 pm
by jmartial
Antonio,
Ese es el principal problema, al pulsar Intro, se recibe nMsg==135
Que según veo, corresponde al define WM_GETDLGCODE. No recibe ni Keydown ni Char.
No sé como habría que hacerlo correctamente para capturar Return y Esc.
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Mon Oct 20, 2014 3:07 pm
by jmartial
Antonio,
Dime si así sería correcto:
En la definición de los métodos de la clase:
Y así el HandleEvent, y ya captura:
Code: Select all | Expand
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TTreeView
local oItem
do case
case nMsg == WM_KEYDOWN
if ::bKeyDown != nil
return Eval( ::bKeyDown, nWParam, 0, Self )
endif
return 0
endcase
return ::Super:HandleEvent( nMsg, nWParam, nLParam )
¿Me puedes explicar que hace el método GetDlgCode( nLastKey ) ?
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Mon Oct 20, 2014 3:41 pm
by Antonio Linares
Joaquín,
Todo ok, lo único que cambiaria es esto:
Code: Select all | Expand
case nMsg == WM_KEYDOWN
return ::KeyDown( nWParam, nLParam )
De esta forma el código queda más estructurado y además una clase que derivase de esta podría facilmente redefinir la funcionalidad del método KeyDown(). De dejar tu código ahi, obligarias a redefinir HandleEvent(). No es realmente necesario pero es la forma correcta de hacerlo

El método GetDlgCode() es la respuesta a un mensaje que envía Windows para interrogar al control acerca de las teclas que quiere procesar. Al devorlver DLGC_WANTALLKEYS el control responde que las quiere todas.
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Mon Oct 20, 2014 5:07 pm
by jmartial
Antonio,
Como me ha funcionado perfectamente y me captura tanto Return como ESCAPE, es con los siguientes pasos:
- Quitamos el método HandleEvent, parece ser que no sirve para nada, se usaría el del padre.
- Se redefinen los siguientes métodos en la definición de la clase:
Code: Select all | Expand
METHOD GetDlgCode( nLastKey ) INLINE DLGC_WANTALLKEYS
METHOD KeyDown( nKey, nFlags )
Y se redefine el método Keydown como sigue:
Code: Select all | Expand
METHOD KeyDown( nKey, nFlags ) CLASS TTreeView
if ::bKeyDown != nil
return Eval( ::bKeyDown, nKey, nFlags, Self )
endif
return ::Super:KeyDown( nKey, nFlags )
Si ves algo más limpio o algo que no guarde la lógica de eventos de FW, me lo dices, pero así se puede definir bKeyDown para capturar
VK_RETURN y VK_ESCAPE, además de funcionar las teclas del TreeView.
Re: Capturar tecla ESC y RETURN en TTreeview
Posted: Tue Oct 21, 2014 4:37 am
by Antonio Linares
Joaquin,
correcto, gracias
