Page 1 of 1

Menu PopUp automatico al presionar sobre boton Tbar

Posted: Sat Sep 30, 2017 12:52 pm
by RSalazarU
Hola amigos del foro:

Estoy intentando hacer los siguiente:

"al hacer click sobre un botón de la barra de herramienta, que aparezca el menú PopUp automáticamente y si no se selecciona una opción del menú, que se ejecute la acción del botón"

Para esto modifique la clase TBtnBmp:

Code: Select all

METHOD LButtonDown( nRow, nCol ) CLASS TBtnBmp
   local oWnd

   if ::lDrag .or. ! Empty( ::oDragCursor )
      return Super:LButtonDown( nRow, nCol )
   endif

   ::lWorking = .T.
   ::lBtnUp   = .F.

   SetFocus( ::hWnd )    // To let the main window child control
   SysRefresh()          // process its valid

   //Aca el cambio...
   //copiado de ::LButtonUp() (codigo que muestra PopUp)
   if ::oPopup != nil
      if ::oWnd:oWnd != nil .and. Upper( ::oWnd:oWnd:Classname() ) == "TBAR"
         oWnd := ::oWnd:oWnd
      else
         oWnd := ::oWnd
      endif
      //oWnd:NcMouseMove() // close the tooltip
      oWnd:oPopup = If( ValType( ::oPopup ) == 'B', Eval( ::oPopUp, Self ), ::oPopUp )

      oWnd:oPopup:Activate( ::nTop + ::nHeight(), Max( ::nLeft, 1 ), oWnd, .F. )
      if ValType( ::oPopUp ) == 'B'
         oWnd:oPopUp:End()
      endif
      oWnd:oPopup = nil
      ::Refresh()
   endif
   //...hasta aca

   if GetFocus() == ::hWnd
      ::lCaptured = .T.
      ::lPressed  = .T.
      ::Capture()
      ::Refresh() // .F.
   endif

   ::lWorking = .F.

   if ::lBtnUp
      ::LButtonUp( nRow, nCol )
      ::lBtnUp = .F.
   endif

return 0
 
Este cambio casi logra el efecto deseado, solo falta la parte de:

".... si no se selecciona una opción del menú, que se ejecute la acción del botón"

Alguien habrá realizado algo similar.

De antemano, cualquier ayuda sera bienvenida.

Rolando
Cochabamba, Bolivia.
FWH 13.02, xharbour 121 Rev 6717

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Sat Sep 30, 2017 3:29 pm
by cnavarro
Rolando, no entiendo bien lo que necesitas, pero para que aparezca un menu popup en un boton ...

Code: Select all


   DEFINE BUTTON ::oBtnSave OF ::oBar RESOURCE "save" ;
      PROMPT "Save" ;
      ACTION ( ::SaveFile( , , , ), ::oActivo:SetFocus() ) ;   //AQUI
      MENU ::MenuSaveAs() ;                                             //AQUI
      TOOLTIP FWString( "Save" )


 

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Sun Oct 01, 2017 3:12 am
by RSalazarU
Cristobal, gracias por responder.

lo que quiero hacer es los siguiente:

"al hacer click sobre un botón de la barra de herramienta, que aparezca el menú PopUp automáticamente y si no se selecciona una opción del menú, que se ejecute la acción del botón"

Colocar/asignar un menu PopUp a un boton de la barra es sencillo, pero para "mi gusto" no es muy practico.
No es practico porque el usuario tiene que presionar sobre la "flechita" negra que aparece a la derecha del botón; el área de la "flechita" es muy pequeña y a veces el usuario ni se percata que existe.

Seria mas practico que al hacer click sobre el boton aparezca el menu PopUp (automaticamente) y si el usuario NO selecciona, ninguna opcion del menu PopUp entonces "deberia" ejecutarse la accion del boton (por haber hecho click sobre el boton)

Para lograr esto modifique el metodo LButtonDown(..) de la clase TBtnBmp()

Code: Select all

METHOD LButtonDown( nRow, nCol ) CLASS TBtnBmp
   local oWnd

   if ::lDrag .or. ! Empty( ::oDragCursor )
      return Super:LButtonDown( nRow, nCol )
   endif

   ::lWorking = .T.
   ::lBtnUp   = .F.

   SetFocus( ::hWnd )    // To let the main window child control
   SysRefresh()          // process its valid

   //Aca el cambio...
   //copiado de ::LButtonUp() (codigo que muestra PopUp)
   if ::oPopup != nil
      if ::oWnd:oWnd != nil .and. Upper( ::oWnd:oWnd:Classname() ) == "TBAR"
         oWnd := ::oWnd:oWnd
      else
         oWnd := ::oWnd
      endif
      //oWnd:NcMouseMove() // close the tooltip
      oWnd:oPopup = If( ValType( ::oPopup ) == 'B', Eval( ::oPopUp, Self ), ::oPopUp )

      oWnd:oPopup:Activate( ::nTop + ::nHeight(), Max( ::nLeft, 1 ), oWnd, .F. )
      if ValType( ::oPopUp ) == 'B'
         oWnd:oPopUp:End()
      endif
      oWnd:oPopup = nil
      ::Refresh()
   endif
   //...hasta aca

   if GetFocus() == ::hWnd
      ::lCaptured = .T.
      ::lPressed  = .T.
      ::Capture()
      ::Refresh() // .F.
   endif

   ::lWorking = .F.

   if ::lBtnUp
      ::LButtonUp( nRow, nCol )
      ::lBtnUp = .F.
   endif

return 0
 
Espero haberme hecho entender.

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Sun Oct 01, 2017 8:28 pm
by Giovany Vecchi
Talvez seja isto
Invoque o method ShowPopUp()

Code: Select all

  DEFINE BUTTON ::oBtnImpressoes of ::oBar          ;
    RESOURCE "B32_PRINTER"  noborder             ;
    TOOLTIP {"Impressões validas do atual Título Posicionado","Impressões - F9"}    ;
        ACTION (  ::oBtnImpressoes:ShowPopUp(),;
                  ::oBrwProtesto:SetFocus()) ;
        MENU ::oMenuPrns          
 

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Mon Oct 02, 2017 12:54 am
by RSalazarU
Giovany, gracias por contestar.

Tu código muestra el PopUp, pero no logra cumplir la ultima parte del enunciado:

".... si no se selecciona una opción del menú, que se ejecute la acción del botón"

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Mon Oct 02, 2017 11:45 pm
by rubenfernandez01
Hola Rsalazar.
Al dar click en el botón que muestra el menú popup, deberías colocar un timer de x segundos y si nadie seleccionó una opción popup largas una acción.

Saludos
Ruben Dario Fernandez

Gracias y saludos cordiales.
Rubén Dario Fernández
Fwh 16.08 - Bcc 7.2 - Synwrite

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Mon Oct 02, 2017 11:49 pm
by rubenfernandez01
RSalazar, lo mejor sería una ribbonbar. El botín muestra una flechita, si quiere el menú, acciona la flechita, sino es click en el botón y listo.
Saludos

Gracias y saludos cordiales.
Rubén Dario Fernández
Fwh 16.08 - Bcc 7.2 - Synwrite

Re: Menu PopUp automatico al presionar sobre boton Tbar

Posted: Tue Oct 03, 2017 2:29 am
by RSalazarU
Ruben, gracias por responder.

El problema en la solución del timer es poder indicar el tiempo, cuanto tiempo.

la Ribbonbar es una mejor solución, el "botin" indica que hay mas opciones, sin embargo no tiene el efecto que busco.

De todas maneras, gracias.