menu dinamico vindo de uma tabela

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

claudiochaves
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 28 Jul 2017 15:48
Localização: campinas/sp

menu dinamico vindo de uma tabela

Mensagem 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
Editado pela última vez por Toledo em 28 Jul 2017 21:54, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Claudio Chaves
Desenvolvedor
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

menu dinamico vindo de uma tabela

Mensagem por JoséQuintas »

Ué... acabou de mostrar como é.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

menu dinamico vindo de uma tabela

Mensagem 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
hwgui.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

menu dinamico vindo de uma tabela

Mensagem 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
Anexos
test.zip
(502.23 KiB) Baixado 201 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
claudiochaves
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 28 Jul 2017 15:48
Localização: campinas/sp

menu dinamico vindo de uma tabela

Mensagem 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
Claudio Chaves
Desenvolvedor
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

menu dinamico vindo de uma tabela

Mensagem 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...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

menu dinamico vindo de uma tabela

Mensagem 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
wvg.png
clipper.png
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
claudiochaves
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 28 Jul 2017 15:48
Localização: campinas/sp

menu dinamico vindo de uma tabela

Mensagem 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.
Claudio Chaves
Desenvolvedor
Responder