FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Buttonbar + Menu VS. Ribbonbar
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Buttonbar + Menu VS. Ribbonbar
Posted: Wed Mar 13, 2019 04:17 PM
Buenos días a todos, recién estoy tratando de migrar mi viejo menu que implemente usando Buttonbar a usar Ribbonbar, tengo algunas dudas, con Buttonbar puedo generar de forma dinámica mis menús, basado en los atributos de mis usuarios Ejemplo:

Defino la barra de botones con acceso controlado de acuerdo a la "firma" (ID de usuario) o por el nivel del mismo)
Code (fw): Select all Collapse
define window oVentprinc from 0,0 to 9,165 title "Sistema principal" menu creamenu()
define buttonbar oBarra of oVentprinc 3dlook size 50,50
   aFirmarr:={"MAR","VSJ","JAV"}
   cFirrr:=ascan(aFirmarr,firma)
   if cFirrr<>0
    define button of oBarra resource "BMPIMAGEN" action reporte1() tooltip "Procesar reporte"
   endif
   define button of oBarra resource "BMPMARKET" action marketin() tooltip "Telemarketing"
   define button of oBarra resource "BMPMARCON" action consmark() tooltip "Consulta telemarketing"
   define button of oBarra resource "BMPCALEND" action calendar() tooltip "Calendario de grupo"
   if leve="A" .or. lAdmrh=.T. 
    define button of oBarra resource "BMPUSUARIOS" action Admusers() tooltip "Administra usuarios"
   endif
   activate window oVentprinc



Función para crear el menú, las opciones del mismo también están controladas de acuerdo a los atributos del usuario
Code (fw): Select all Collapse
Function creamenu()
   local oMenu
   menu oMenu 2015
   menuitem "&CONSULTAS"
   menu
      if firma="MAR" .or. firma="ABC"
        menuitem "Consulta de cliente" action cons_clie()
        endif
   endmenu
   if firma="MAR" .or. firma="ABC"
    menuitem "&TAREAS ESPECIALES"
        menu
           menuitem "&Especial 1" action Esp1()
           separator
           menuitem "Especial 2" action Esp2()
       if firma="MAR"
          menuitem "Espcecial 3" action Esp3()
       endif
         endmenu
   endif


Como se ve en este pequeño ejemplo solo se mostrarán los menús si el usuario que se "firmo" cumple con ciertos requisitos, así mismo algunas de las opcion es de dichos menús solo se mostrarán si se cumplen algunos criterios, la pregunta es:
¿Es posible administrar estas opciones usando un RibbonBar? Leyendo encontré que se pueden deshabilitar los "Tabs" del RibbonBar (oRBar:aEnable[NoDeTab]:=.F.) y efectivamente lo deshabilita, pero me gustaría poder esconderlo (trate con la opción oRBar:hide[2]:=.T., pero no funciona).

Cualquier ayuda será muy agradecida.

Saludos.
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Mar 13, 2019 04:25 PM

Bien, no sé si te he entendido bien, pero al igual que en la buttonbar, o en los menús, defines las opciones que quieres mostrar, aquí puedes hacer lo mismo, con la condición que necesites y utilizando el metodo AddTab de la Ribbon, y no definir los prompts al principio junto a la definición de la Ribbon.
Espero haberme explicado

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Mar 13, 2019 04:32 PM

Muchas gracias por tu respuesta, tendrás un pequeño ejemplo de como lo manejas?

Gracias.

Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Mar 13, 2019 05:52 PM

Me respondo, me puse a revisar el archivo rbdesign.prg, ahi viene como generar el ribbonBar desde 0.

oRBar:AddTab( "CIERRE DIARIO" )

Gracias por no darme el pescado y forzarme a buscarlo por mi mismo.

Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Mar 13, 2019 08:30 PM

Gracias a ti por entender que es mejor explicar el concepto y continuar investigando ....

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Thu Mar 14, 2019 11:44 AM

Hola Mario:
Cuando armas un menú personalizado según los permisos que tiene el usuario, te puedes encontrar que algunos tabs pueden no tener contenido (el usuario no tiene permiso a ningun subitem). En estos casos el método :DeleteTab(n) que aplica al ribbonbar te puede ser útil.
También, como aquí para que quede prolijo, el ancho del grupo de botones va a depender de la cantidad de items que tenga permiso, otro método que puede serte útil es :SetSize(n) que aplica a un grupo del ribbonbar.
Espero que te sea de utilidad...
Saludos

Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Mon Apr 01, 2019 04:39 PM
Muchas gracias por sus aportes, ya quedó finalmente implementado y se ve bastante bien, como comenta Cesar, tuve que hacer un reacomodo de todos los items de cada grupo para que no quedaran (o quedaran los menos posibles) de espacios en blanco.

El login al sistema quedo así:


Y la RibbonBar:



Ahora se me ha metido a la cabeza la idea de generar un grupo que sea construido por el usuario, básicamente mi ídea es que le den click derecho del mouse a la opción deseada y que les aparezca un menu contextual que les de la opción de agregar o quitar del grupo de favoritos, obviamente al agregar/quitar voy a guardar en una tabla el ID del usuario, el nombre del item y la función que llama, para que la siguiente vez que se firme el usuario se pueda construir este grupo "favoritos"

Una idea es hacerlo asi:
Code (fw): Select all Collapse
if firma="MAR"
cFunc1:="GetMacAdd()"
add group oGr2_6 ribbon oRBar to option 6 prompt "DESARROLLO" width 310
@3,155 add button oBtn4_2_6 prompt "Obtener MAC address" group oGr2_6 bitmap "mac_add" action &cFunc1 size 150,20 MOSTLEFT
oBtn4_2_6:bRButtonUp := { | nRow, nCol | checafav() }
endif


Function checafav
    if msgyesno("Desea agregar este comando a favoritos","Favoritos")
        ?"Si, agregar"
        *poner proceso para guardar datos en base de datos
    endif
return


Si tiene alguna idea mejor lea gradeceré los aportes.
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Mon Apr 01, 2019 05:04 PM

Bien, si he entendido lo que pretendes
No es exactamente eso lo que hace el ejemplo TBDESIGN.PRG ?

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Apr 03, 2019 06:55 PM
Buenos días, parcialmente si, pero necesito saber si hay alguna forma de conocer 3 valores del botón pulsado.

Por ejemplo de la línea:

@3,155 add button oBtn4_2_6 prompt "Obtener MAC address" group oGr2_6 bitmap "mac_add" action GetMacAdd() size 150,20 MOSTLEFT

1.- El prompt "Obtener MAC address"
2.- El bitmap "mac_add"
3.- El action "GetMacAdd()"

Estos tres valores los guardaría en una tabla asociados al ID del usuario que se ha firmado, de esa manera tendré los valores que necesito para reconstruir el menu "Favoritos" cada vez que el usuario ingrese al sistema.

Y la construiría asi:
Code (fw): Select all Collapse
select * from tablafavoritos where userid=cUsuario

for unid=1 to [Nregistros]
   cProm1:="Obtener MAC address"
   cBitm1:="mac_add"
   cFunc1:="GetMacAdd()"

   @3,140 add button oBtn4_2_6 prompt cProm1 group oGr2_6 bitmap cBitm1 action &cFunc1 size 145,20 MOSTLEFT
next


Es posible hacer esto?
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Apr 03, 2019 07:13 PM

Busca "detached" en el foro, es el concepto que necesitas para hacer eso, entendiendo que el query de respuesta de lo que buscas en la tabla ya lo tienes en un array

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Wed Apr 03, 2019 09:17 PM

Gracias Cristobal, el punto que los favoritos se van a ir agregando a la tabla conforme el usuario los vaya seleccionando, la idea original es que el usuario le de click derecho a alguna opción del sistema y le aparezca un menú para agregar o quitar de sus favoritos.

Como verás hay varios tabuladores y varios grupos dentro de cada unos de ellos y muchas opciones dentro de cada grupo, esa complejidad me impulsa a darles a los usuarios la opción de que tengan un lugar donde agrupen las opciones de las tareas que realizan con mayor frecuencia, por lo tanto los usuarios son los que decidirán que opciones irán agregando a sus favoritos.

Es por eso que necesito saber si es posible que al seleccionar la opción "Agregar a favoritos" pueda recibir estos tres parámetros de acuerdo al botón pulsado, una vez que tenga estos valores los almacenaría en la tabla de favoritos.

Espero haberme explicado con claridad.

Saludos.

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Mon Apr 08, 2019 05:31 AM
Mario,

Aqui tienes el ejemplo usando "detached locals" como te ha indicado Cristobal:

Code (fw): Select all Collapse
#include "FiveWin.ch"
#include "ribbon.ch"

function Main()

   local oWnd

   DEFINE WINDOW oWnd

   BuildRibbonBar( oWnd )

   ACTIVATE WINDOW oWnd

return nil

function BuildRibbonBar( oWnd ) 

   local oRBar, oGrp, oBtn, n

   DEFINE RIBBONBAR oRBar WINDOW oWnd PROMPT  "One", "Two", "Three" HEIGHT 134 TOPMARGIN 25

   ADD GROUP oGrp RIBBON oRBar TO OPTION 1 PROMPT "new" WIDTH 260 

   for n = 1 to 3
      @ 3, 3 + ( n - 1 ) * 80 ADD BUTTON oBtn PROMPT "new" + AllTrim( Str( n ) ) ;
         GROUP oGrp ACTION MsgInfo( "click" ) SIZE 80, 83 TOP
      oBtn:bRClicked = GenBlock( oBtn, n )
   next 

return nil

function GenBlock( oBtn, n )

return { || MsgInfo( n, oBtn:cCaption ) }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 131
Joined: Tue Dec 26, 2006 04:50 PM
Re: Buttonbar + Menu VS. Ribbonbar
Posted: Mon Apr 08, 2019 05:16 PM
Gracias Antonio, ya lo estoy probando y encontrando la luz al final de este tunel, solo un pequeño detalle más, cuando tengo un POPUP, como se diferencia el botón derecho y el izquierdo?

Actualmente, al darle click en una opción de un menu POPUP me da la misma acción, independietemente del botón del mouse que haya pulsado.

Code (fw): Select all Collapse
@3,175 add button oBtn4_2_5 prompt "Reportes de nomina" group oGr2_5 bitmap "nomina_semana" size 150,20 POPUP MOSTLEFT menu repor_nomina()          


Function repor_nomina
    local oPopuprn
    public cTipnom
    menu oPopuprn popup 2015
        menuitem "Semanal" action rep_incsem() resource "nomina_semana"
        menuitem "Quincenal" action (cTipnom:="Q",rep_incqui()) resource "nomina_quincena"
    endmenu
return oPopuprn


Quisiera obtener el valor de oMenuitem:cPrompt, solo cuando se pulse el botón derecho del mouse, en caso contrario que ejecute su clausula "ACTION" de forma normal.

Continue the discussion