Página 1 de 1
menu dinamico vindo de uma tabela
Enviado: 28 Jul 2017 16:07
por claudiochaves
Pessoal, boa tarde.
Tenho um menu :
Código: Selecionar todos
MENU OF oMainWindow
MENU TITLE "&Ferramentas"
MENUITEM "Opcao 1" ID 1001 ACTION Opcao1()
MENUITEM "Opcao 2" ID 1002 ACTION Opcao2()
SEPARATOR
MENUITEM "Opcao 3" ID 1003 ACTION Opcao3()
MENUITEM "Opcao 4" ID 1004 ACTION Opcao4()
SEPARATOR
MENUITEM "Opcao 5" ID 1005 ACTION Opcao5()
MENUITEM "Opcao 6" ID 1006 ACTION Opcao6()
MENU TITLE "SubMenu 1"
MENUITEM "SubMenu 1->Opcao 1" ID 1007 ACTION Sub1_Opcao1()
MENUITEM "SubMenu 1->Opcao 2" ID 1008 ACTION Sub1_Opcao2()
SEPARATOR
MENUITEM "SubMenu 1->Opcao 3" ID 1009 ACTION Sub1_Opcao3()
MENUITEM "SubMenu 1->Opcao 4" ID 1010 ACTION Sub1_Opcao4()
ENDMENU
MENU TITLE "SubMenu 2"
MENUITEM "SubMenu 2->Opcao 1" ID 1011 ACTION Sub2_Opcao1()
MENUITEM "SubMenu 2->Opcao 2" ID 1012 ACTION Sub2_Opcao2()
SEPARATOR
MENUITEM "SubMenu 2->Opcao 3" ID 1013 ACTION Sub2_Opcao3()
MENUITEM "SubMenu 2->Opcao 4" ID 1014 ACTION Sub2_Opcao4()
ENDMENU
ENDMENU
ENDMENU
Gostaria de tornar ele dinâmico, vindo de uma tabela do banco de dados. Pesquisei as funções de criação de menu, mas não consegui . Alguém teria algum exemplo para compartilhar usando a hwgui ?
Obrigado, abraços
menu dinamico vindo de uma tabela
Enviado: 28 Jul 2017 21:56
por JoséQuintas
Ué... acabou de mostrar como é.
menu dinamico vindo de uma tabela
Enviado: 28 Jul 2017 23:23
por JoséQuintas
Código: Selecionar todos
#include "windows.ch"
#include "guilib.ch"
PROCEDURE Main
LOCAL oMainWindow, oMenu
INIT WINDOW oMainWindow SIZE 800, 500
oMenu := MenuCria()
MENU OF oMainWindow
CriaMenu( oMenu )
ENDMENU
ACTIVATE WINDOW oMainWindow
RETURN
FUNCTION CriaMenu( oMenu )
LOCAL oElement
FOR EACH oElement IN oMenu
IF Len( oElement[ 2 ] ) == 0
MENUITEM oElement[ 1 ] ACTION Do( oElement[ 3 ] )
ELSE
MENU TITLE oElement[ 1 ]
CriaMenu( oElement[ 2 ] )
ENDMENU
ENDIF
NEXT
RETURN NIL
menu dinamico vindo de uma tabela
Enviado: 28 Jul 2017 23:25
por JoséQuintas
O resto é só um único array, o tradicional de menus.
Pelo menos pra mim é tradicional, depois de 30 anos de uso..... rs
menu dinamico vindo de uma tabela
Enviado: 29 Jul 2017 10:00
por claudiochaves
Ola Quintas, bom dia.
Obrigado pelo exemplo e pelo código, vai me ajudar a iniciar no que eu pretendo.
O que eu vou fazer é transferir as opções de menu que estão no código fonte para uma tabela no banco de dados. Desta forma, vou controlar as permissões de acesso do menu usando a tabela que já tenho. Hoje quando crio uma opção nova, preciso ir no código , acrescentar um item na codificação do menu, ir na tabela de permissão inserir o mesmo item, sempre quis mudar isto e chegou a hora.
Vi que você usa 2 funcoes menudrop e menuundrop para controlar o nivel de menu, a partir disto já tenho ideia de como seguir.
Não sei trabalhar direito ainda com objetos, então a sua função criamenu me elucidou a menu/endmenu que sempre foi aonde eu parava.
Pergunta, o MENUITEM quando colocamos "-' vira SEPARATOR ?
Obrigado novamente, abraços
menu dinamico vindo de uma tabela
Enviado: 29 Jul 2017 10:27
por JoséQuintas
A parte curiosa é que virou sim.
Fiz isso no Clipper, e na HWGUI acabou também assumindo traço.
Aproveitando:
Meu menu é desse jeito.
O controle de acessos apenas elimina opções do menu.
A configuração de acessos, apenas faz uso desse menu - já postei por aqui o controle de acessos, incluindo usuário/grupo
O help on-line também parte desse menu
E até impressão de manual também parte desse menu
Então, acho que é tudo de bom.... rs
Agora que estou separando em LIB, estou colocando um elemento adicional, só pra "puxar" os fontes.
Código: Selecionar todos
Add( oMenu, { "nome do menu", "NOMEDOFONTE", { || nomedofonte() } )
O objeto do codeblock é apenas pra garantir que todas as funções foram compiladas.
Sobre a configuração de acessos: (console/gtwvg)
https://pctoledo.org/forum/viewto ... 43&t=16321
Nota:
Não estou usando hwgui, só criei a rotina em hwgui ontem por curiosidade.
Inclusive acabei com a allgui, que permitia misturar hwgui+minigui+outras.
Cansei de refazer as mesmas alterações ao atualizar...e já que não uso...
menu dinamico vindo de uma tabela
Enviado: 29 Jul 2017 11:29
por JoséQuintas
Só a título de curiosidade, partindo do mesmo array em GTWVG.
Código: Selecionar todos
STATIC FUNCTION MenuWvg( mMenuOpt )
LOCAL oMenu, nKey // , oImage // , oButton
oMenu := wvgSetAppWindow():MenuBar()
BuildMenu( oMenu, mMenuOpt )
DO WHILE .T.
nKey := Inkey( 0 )
DO CASE
CASE nKey == HB_K_GOTFOCUS
CASE nKey == HB_K_LOSTFOCUS
CASE nKey == K_ESC
EXIT
ENDCASE
ENDDO
wvgSetAppWindow():oMenu := NIL
wapi_SetMenu( wapi_GetActiveWindow(), NIL )
wapi_DestroyMenu( oMenu:hWnd )
RETURN NIL
FUNCTION BuildMenu( oMenu, acMenu )
LOCAL oElement, oSubMenu, cbCode, m_ProgTxt
MEMVAR m_Prog
FOR EACH oElement IN acMenu
IF Len( oElement[ 2 ] ) == 0
m_Prog := oElement[ 3 ]
IF ValType( m_Prog ) == "C"
m_ProgTxt := AppEmpresaApelido() + " (" + AppUserName() + ") (" + m_Prog + ") " + Upper( oElement[ 1 ] )
cbCode := [{ || RunModule( "] + m_Prog + [", "] + m_ProgTxt + [" ) }]
oMenu:AddItem( oElement[ 1 ] , &( cbCode ) )
ELSE
oMenu:AddItem( oElement[ 1 ], oElement[ 3 ] )
ENDIF
ELSE
oSubMenu := WvgMenu():new( oMenu, , .T. ):Create()
BuildMenu( oSubMenu, oElement[ 2 ] )
oMenu:AddItem( oSubMenu, oElement[ 1 ] )
ENDIF
NEXT
RETURN NIL


Ou seja, não importa a LIB, a rotina de criar menu é a mesma.
Só criar a rotina de uso do array em cada LIB.
Acho que nem precisa dizer, a em Harbour/console é a maior de todas.
Mas é a que gosto mais. Dá pra clicar em qualquer posição do menu, seja da frente, de trás, de cima, do lado, etc.
E aproveitando: é aí que entra uma coisa que já comentei: dá pra trabalhar pra LIB gráfica sem mexer na LIB gráfica. Meu menu mesmo é um exemplo, tá pronto pra qualquer LIB.... rs
Até na época do Visual Basic usei algo parecido.
menu dinamico vindo de uma tabela
Enviado: 29 Jul 2017 11:36
por claudiochaves
Tem muita coisa na hwgui que segue o padrão do clipper, acho que foi feito para auxiliar na migração.
Obrigado novamente e vou estudar o post de usuarios/grupo. Hoje trabalho por usuário , mas vai ser bom implementar grupos.