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=29404

Saludos

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:

Code: Select all | Expand


METHOD GetDlgCode( nLastKey ) INLINE DLGC_WANTALLKEYS
 


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 :-)