Capturar tecla ESC y RETURN en TTreeview

Post Reply
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Capturar tecla ESC y RETURN en TTreeview

Post 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 ?
Un Saludo,
Joaquín Martínez
horacio
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Capturar tecla ESC y RETURN en TTreeview

Post by horacio »

Fijate si te sirve

viewtopic.php?f=6&t=29404

Saludos
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post by jmartial »

Horacio,
¿Pero como capturo return y Esc?
Un Saludo,
Joaquín Martínez
User avatar
carlos vargas
Posts: 1723
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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.
Un Saludo,
Joaquín Martínez
User avatar
karinha
Posts: 7964
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 5 times
Contact:

Re: Capturar tecla ESC y RETURN en TTreeview

Post by karinha »

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
Antonio Linares
Site Admin
Posts: 42662
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 69 times
Been thanked: 96 times
Contact:

Re: Capturar tecla ESC y RETURN en TTreeview

Post by Antonio Linares »

Joaquin,

Prueba a implementar el método KeyDown() en la clase TTreeView
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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 )
Un Saludo,
Joaquín Martínez
User avatar
Antonio Linares
Site Admin
Posts: 42662
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 69 times
Been thanked: 96 times
Contact:

Re: Capturar tecla ESC y RETURN en TTreeview

Post by Antonio Linares »

Joaquín,

Para mantener la lógica de FiveWin, lo has intentado asi ?

case nMsg == WM_KEYDOWN
...

ó

case nMsg == WM_CHAR
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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.
Un Saludo,
Joaquín Martínez
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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 ) ?
Un Saludo,
Joaquín Martínez
User avatar
Antonio Linares
Site Admin
Posts: 42662
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 69 times
Been thanked: 96 times
Contact:

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
jmartial
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Capturar tecla ESC y RETURN en TTreeview

Post 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.
Un Saludo,
Joaquín Martínez
User avatar
Antonio Linares
Site Admin
Posts: 42662
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 69 times
Been thanked: 96 times
Contact:

Re: Capturar tecla ESC y RETURN en TTreeview

Post by Antonio Linares »

Joaquin,

correcto, gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply