Error con los aceleradores del menú

Error con los aceleradores del menú

Postby quique » Thu Apr 11, 2013 2:22 am

Que tengo que hacer para evitar la perdida de las teclas aceleradoras del menú

1. para comprobar el error compilar el siguiente código
2. ejecutarlo
3. presionar la tecla F5
4. en cuanto aparezca el diálogo presionar ESC para cerrarlo
5. presionar F5

Como se puede ver, no vuelve a crear el diálogo, y de hecho, debería funcionar presionar F5 en el diálogo y mostrar un mensaje, pero tampoco lo hace, pero si utilizamos el menú directamente, funciona correctamente.

Code: Select all  Expand view

#include "fivewin.ch"

function main
   local oWnd, oMenu
   menu oMenu
      menuItem "&Uno"
         menu
            menuItem "Diálogo   F5" action dialogo() accelerator ACC_NORMAL,VK_F5
         endMenu
      menuItem "&Dos"
         menu
            separator
         endMenu
   endMenu
   define window oWnd mdi menu oMenu
   activate window oWnd on init tMdiChild():new(,,,,,,,oWnd):activate()
return nil

function dialogo
   local oDlg, oMenu
   menu oMenu
      menuItem "&Menu"
         menu
            menuItem "F5" action msgInfo( "F5" ) accelerator ACC_NORMAL,VK_F5
         endMenu
   endMenu
   define dialog oDlg
   activate dialog oDlg on init oDlg:setMenu( oMenu )
return nil
 
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby Antonio Linares » Thu Apr 11, 2013 10:25 am

Quique,

Con este codeblock en bGotFocus de la ventana se restaura su tabla de aceleradores:

Code: Select all  Expand view
  define window oWnd mdi menu oMenu
   
   oWnd:bGotFocus = { || oMenu:oAccTable:Activate() }
   
   activate window oWnd ;
      on init tMdiChild():new(,,,,,,,oWnd):activate()


Vamos a revisar ahora porque no se activa en el diálogo, gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby Antonio Linares » Thu Apr 11, 2013 11:22 am

El activar los aceleradores en un diálogo es un poco más complicado, pero parece funcionar bien :-)

Estos son los cambios requeridos:

en dialog.prg:
Code: Select all  Expand view
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TDialog

   if ::oMenu != nil
      TranslateAccelerator( ::hWnd, ::oMenu:oAccTable:nHandle,;
                            GetFocus(), nMsg, nWParam, nLParam )
   endif  

   ...
 


Code: Select all  Expand view
METHOD Command( nWParam, nLParam ) CLASS TDialog

   local oWnd, nNotifyCode, nID, hWndCtl

   nNotifyCode = nHiWord( nWParam )
   nID         = nLoWord( nWParam )
   hWndCtl     = nLParam

   do case
      case ::oPopup != nil
           ::oPopup:Command( nID )

      case hWndCtl == 0 .and. ::oMenu != nil .and. ;
           If( nNotifyCode == BN_CLICKED, nID != IDCANCEL, .f. )
           ::oMenu:Command( nID )

      case GetClassName( hWndCtl ) == "ToolbarWindow32"
           oWndFromHwnd( hWndCtl ):Command( nWParam, nLParam )
           return .T. // otherwise a child dialog gets closed

      case ::oMenu != nil .and. nId != 2 .and. nNotifyCode != BN_CLICKED
           if nNotifyCode == 1
              ::oMenu:Command( nID )
           endif  

      case nID != 0
           ...
 


En control.prg
Code: Select all  Expand view
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TControl

   local nResult

   if ::oWnd:oMenu != nil
      TranslateAccelerator( ::oWnd:hWnd, ::oWnd:oMenu:oAccTable:nHandle,;
                            GetFocus(), nMsg, nWParam, nLParam )
   endif  

   do case
        ...
 


Ahora hay que probar estos cambios en distintas aplicaciones y ver si tienen algún efecto colateral. Se agradece el feedback que todos podais aportar, gracias! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby quique » Thu Apr 11, 2013 2:09 pm

Antonio Linares wrote:Con este codeblock en bGotFocus de la ventana se restaura su tabla de aceleradores:


En el ejemplo que puse si funciona, pero en mi programa no :(

Lo manejé de 3 maneras con dos variantes, la variable ::oMenu no existía, la cree para ver si así funciona porque el menú lo creo en otro método que regresa el objeto

Code: Select all  Expand view
  define window ::oWnd mdi menu ::menuPrincipal() title " " + ::cTitulo menuInfo 7
 


En la ventana principal

Code: Select all  Expand view
  ::oWnd:bGotFocus = { || msgbeep(),::oWnd:oMenu:oAccTable:Activate() }

y

   ::oWnd:bGotFocus = { || msgbeep(),::oMenu:oAccTable:Activate() }

 


En la ventana hija

Code: Select all  Expand view
  ::oWnd:bGotFocus := { || msgBeep(), oIde:oWnd:oMenu:oAccTable:Activate() }

y

   ::oWnd:bGotFocus := { || msgBeep(), oIde:oMenu:oAccTable:Activate() }

 


Directamente en el contrl utilizado en la ventana hija

Code: Select all  Expand view

   ::oWnd:bGotFocus := { || msgBeep(), oIde:oWnd:oMenu:oAccTable:Activate() }
   ::oWnd:setControl( self )

y

   ::oWnd:bGotFocus := { || msgBeep(), oIde:oMenu:oAccTable:Activate() }
   ::oWnd:setControl( self )
 


En todos los intentos suena el beep, pero no se recupera el menú, solamente funciona si minimizo o cambio de aplicación y regreso (con ALT+TAB)

Tratare de hacer pruebas con los ejemplos del diálogo que no he probado, para ver si funciona algo en este menú, me preocupa mucho mas el menú de la ventana principal que el del diálogo, porque la operatividad del programa se basa en esos aceleradores.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby Antonio Linares » Thu Apr 11, 2013 2:23 pm

Quique,

Al menu de la ventana ó al de un diálogo puedes acceder con oWnd:oMenu

Que control tiene el foco en la ventana principal ? Esto es lo más importante

Si tienes un timer (podrias usar el de la barra de mensajes) puedes probar a hacer oWnd:SetText( GetClassName( GetFocus() ) ) y asi saber la Clase del control que tiene el foco. Otra forma seria: oWnd:SetText( oWndFromHwnd( GetFocus() ):ClassName() )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby Antonio Linares » Thu Apr 11, 2013 2:25 pm

Quique,

Puedes mostrar una captura de pantalla de la ventana principal de tu aplicación ? gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby quique » Thu Apr 11, 2013 2:43 pm

El foco lo tiene el control utilizado en la ventana hija, en este caso es un obtejo editorPrg() hijo de la clase editor() hija de la clase tTxtEdit(), no es necesario el timer porque si puedo, por ejemplo, borrar inmediatamente despues de regresar del diálogo, pero no puedo acceder a los aceleradores.

¿como le hago para subir una imagen en la respuesta?

¿quieres conecectarte por teamviewer para ver el problema?
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby quique » Fri Apr 12, 2013 3:48 pm

He estado descartando (recortando el código fuente) aparentemente, casi seguro porque quitando eso ya no falla, el problema está en la función donde creo el menú, con eso descartaría casi todo, esa función afecta los procesos del menú, keydown y keychar, aunque como el problema afecta con los aceleradores o directamente picando el menú, pienso que el problema es en el menú. Por lo pronto tendré que dejar esto y ponerme a trabajar con lo de la oficina para que no me corran por trabajar en cosas personales :P

Pero al rato retomo el punto.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby quique » Fri Apr 12, 2013 3:56 pm

Por cierto, una corrección, si utilizo gráficos sobre la clase, los cargo con createMemBitmap().
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby quique » Fri Apr 12, 2013 4:50 pm

Sorry, los dos ultimos mensajes eran para "Error con un programa de fivewin en una maquina virtual", pero por lo que estoy viendo, es posible que vayan ligados.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby Antonio Linares » Fri Apr 12, 2013 7:53 pm

Quique,

FiveWin realiza un "hook" del teclado, para implementar F1 y pienso que VirtualBox tambien hace un hook del teclado para tener control de ciertas teclas, como luego tu aplicación volvería a hacer el "hook", tal vez de ahi venga el problema.

Es solo una idea...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby quique » Fri Apr 12, 2013 7:56 pm

¿Que es un hook? ¿se puede hacer algo contra eso?
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby Antonio Linares » Sat Apr 13, 2013 6:15 am

Quique,

No puedes preparar un ejemplo con tu clase que falle ? Lo ideal es que lo pueda probar aqui, gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Error con los aceleradores del menú

Postby quique » Sat Apr 13, 2013 1:12 pm

Sip, eso voy a intentar, lo que pasa es que ayer estuve toda la tarde tratando de resolver el otro problema, este creo que va a ser mas complicado despejarlo, porque hace el llamado a otra clase para la creación de ventanas, aunque después del ejemplo anterior, espero no me cueste tanto trabajo.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Error con los aceleradores del menú

Postby quique » Sun Apr 14, 2013 2:21 am

Aquí está la manera para reproducirlo:

1. Presionar ctrl+alt+v
2. Al aparecer el diálogo dar esc
3. Presionar ctrl+alt+v y no aparece el diálogo, pero si se escucha el beep que es cuando debería recuperar los aceleradores

Si en el código fuente quitan el acelerador del menú del diálogo funciona bien

Code: Select all  Expand view

#include "FiveWin.ch"

function main()
   local oWnd, oMenu

   menu oMenu
      menuItem "Diálogo" action verVentana() accelerator ACC_ALT + ACC_CONTROL, asc( "V" )
   endMenu

   define window oWnd mdi menu oMenu menuInfo 7
   oWnd:bGotFocus = { || msgBeep(), oWnd:oMenu:oAccTable:Activate() }
   activate window oWnd
return nil

function verVentana
   local oMenu, oDlg
   menu oMenu
      menuItem "Hola" action msgInfo( "hola" ) accelerator ACC_NORMAL,VK_F5
   endMenu
   define dialog oDlg
   activate dialog oDlg nowait
   oDlg:setMenu( oMenu )
return nil
 
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 58 guests