Estudo da função MenuModal() para criação de menus (modo console)

Foto de Major Anilto

Categoria: 

(Texto de acordo com a documentação original do Clipper.)

A função MENUMODAL() ativa a barra superior de um menu (top bar).

Descrição:

MENUMODAL() é uma função de interface de usuário que implementa o sistema de menu suspenso em CA-Clipper.

Faz parte da arquitectura aberta do sistema GET do CA-Clipper. MENUMODAL() é similar ao comando READ na medida em que espera que o usuário execute uma ação. No entanto, a função MENUMODAL() só responderá a ações do menu.

Para implementar um objeto de menu ao mesmo tempo que outros objetos, utilize a função READMODAL() que tem um dos seus argumentos como objeto TopBarMenu.

Quando o utilizador escolhe um item do menu, o controle é passado para o bloco de códigos associado a esse item específico do menu. Os blocos de códigos são definidos utilizando a classe MenuItem.

Os itens do menu podem ser selecionados usando o teclado ou o mouse.

Para selecionar um item de menu com o mouse, basta selecionar o item TopBarMenu com o mouse e então escolher o item de menu PopUp apropriado.

Nota: A função MENUMODAL() irá pegar um evento do menu do usuário e então terminará. Para evitar isto, o seguinte pode ser usado, e o mesmo permitirá que o programa aceite continuamente os eventos do menu:

 

     DO WHILE (MENUMODAL(o_menu,...) <> ExitMenu)
     ENDDO

 

Sintaxe:

MENUMODAL( oTopBar, nSelection , nMsgRow, nMsgLeft, nMsgRight, cMsgColor ) --> MenuID

Argumentos:

oTopBar é um objeto TopBarMenu criado a partir da classe TopBarMenu.

nSelection é o item TopBarMenu selecionado por default.

nMsgRow o número da linha onde aparecerão as mensagens de item de menu.

nMsgLeft especifica a margem esquerda para as mensagens dos itens do menu.

nMsgRight especifica a margem direita para as mensagens dos itens do menu.

cMsgColor define a cadeia de cores para as mensagens do item de menu.É composto por um único par de primeiro plano/fundo.

 

Retorno:

MENUMODAL() devolve a ID do menu do item de menu escolhido. As IDs dos menus são atribuídas utilizando a classe MenuItem.

A tabela a seguir lista as teclas ativas que podem ser usadas durante o MENUMODAL():

Tecla ---- Ação

Seta esquerda, Ctrl+S: Move para o próximo item TopBarMenu à esquerda. Se não houver mais itens à esquerda, o item mais à direita do TopBarMenu será selecionado.

Seta direita, Ctrl+D: Move para o próximo item TopBarMenu à direita. Se não houver mais itens à direita, o item mais à esquerda do TopBarMenu será selecionado.

Seta para cima, Ctrl+E: Ir para o item anterior do menu PopUp. Se não houver mais itens acima do item atual, o item do menu na parte inferior será selecionado.

Seta para baixo, Ctrl+X: Move para o próximo item do menu PopUp. Se não houver mais itens abaixo do item atual, o item do menu no topo será selecionado.

 

Exemplos:

Veja o arquivo de exemplo Menu.prg no diretório \CLIP53\SOURCE\SAMPLE. O exemplo demonstra a combinação dos objetos TopBarMenu, PopUpMenu e MenuItem para criar um menu com uma série de opções disponíveis. Veja "Introdução ao Sistema de Menus" no Guia de Programação e Utilitários para mais informações sobre o uso desta função.

 

Arquivos:

Biblioteca: CLIPPER.LIB, arquivo fonte: SOURCE\SYS\MENUSYS.PRG

 

Um exemplo básico (com algumas melhorias Harbour):

/*
	Exemplo de menu usando menumodal e 
	menusys1 (menusys original modificado para eventos do mouse
	Major Anilto - 17Abr2020
*/

#include "button.ch"
#include "inkey.ch"
#include "box.ch"

/* Para usar acentuações, mouse, etc */
#include "hbgtinfo.ch"		//acrescentado no harbour
REQUEST HB_LANG_PT			//acrescentado no harbour - português
REQUEST HB_CODEPAGE_PTISO	//acrescentado no harbour - codepage 
REQUEST HB_GT_WVT_DEFAULT

Function Main()
	LOCAL oInfo
	LOCAL Retorno := 0
	LOCAL sai := "N"
	PUBLIC Coluna := 80
	PUBLIC Linha := 40
	
	/* Para usar acentuações, etc.) */
	HB_LANGSELECT('PT')
	HB_CDPSELECT('PTISO')   
   	HB_GtInfo( HB_GTI_MAXIMIZED, .F. )
	HB_GtInfo( HB_GTI_FONTNAME, "Courier Prime" )
	HB_GtInfo( HB_GTI_WINTITLE, "Teste de menu" )
	
	/* Configurações do ambiente */
	SET( _SET_EVENTMASK, INKEY_ALL )	   
	MSETCURSOR(.T.)
	set cursor off
	set score off
	setmode(Linha,Coluna)
	Cls
	/* Isto permite mudar toda a paleta de cores */
	PALETA()
	/* Chamada para criar um objeto de menu */
	oInfo:=CriaMenu()
	/* Loop para execução do menu */
	WHILE Retorno == 0
		Retorno := MENUMODAL(oInfo,1,Linha-1,0,Coluna-1,"W+/b")
		/* Aqui chama alguma função para tratar a saída do sistema */
	ENDDO
Return ( NIL )
	
/* Criação da estrutura do menu */
Function CriaMenu() // Usando a função MenuModal()
   LOCAL oTopBar, oPopUp, oPopUp1, oPopUp2
   LOCAL COR := "w/bg,W+/rb,gr+/bg,gr+/rb,w/N,w/B" 
   LOCAL COR1 := "w+/b,W+/rb,gr+/g,gr+/rb,w/N,w/B"
   
	/* Cria a barra de menus na linha 1, a partir da coluna 1 até a coluna Coluna-2) */
    oTopBar := TopBar( 1,0, Coluna - 1) 	/* linha, coluna tamanho */
    oTopBar:ColorSpec :=cor1				/* especifica as cores */
	
	/* Coloca os elementos do menu */
    oTopBar:AddItem( MenuItem ( "Pedido",{ || Pedido()},,"Novo pedido") )			
    oTopBar:AddItem( MenuItem ( "Cadastro",{ || Cadastro()},, "Cadastro de clientes") )	
    oTopBar:AddItem( MenuItem ( "Fornecedores",{ || Forn()},,"Cadastro de fornecedores") )		
    oTopBar:AddItem( MenuItem ( "Estoque",{ || Estoque()},, "Controle de estoque") )	
    oTopBar:AddItem( MenuItem ( "Utilitários",{ || Util()},,"POPUP") )	
	
Return ( oTopBar)

/* Funções chamadas pelos itens do menu */
Function Pedido()
Alert("Novos pedidos")
Return

Function Cadastro()
Alert("Cadastramento de clientes")
Return

Function Forn()
Alert("Cadastramento de fornecedores")
Return

Function Estoque()
Alert("Controle de estoque")
Return

Function Util()
Alert("Utilitários do sistema")
Return

/* Função que muda a paleta de cores */
Function paleta()
	local aPal := { 	0x000000, ; //0 N
						0xd27619, ; //1 B
						0x004d00, ; //2 G
						0xc1ac00, ; //3 BG
						0x1c1cb7, ; //4 R
						0xdaa89f, ; //5 RB
						0xc8ccd7, ; //6 GR
						0x222222, ; //7 N+
						0x888888, ; //8 W 
						0xfab481, ; //9 B+
						0x84c781, ; //10 G+
						0xf2ebb2, ; //11 BG+
						0x7373e5, ; //12 R+
						0xdb9db3, ; //13 RB+
						0x58eeff, ; //14  GR+
						0xffffff }  //15 W+
	aPal1 := HB_GtInfo( HB_GTI_PALETTE, aPal)

Return NIL

Downloads: 

menu3.zip — Baixado 628 vezes
Total votes: 0

Comentários

Sobre as variáveis oPopUp, oPopUp1, oPopUp2

Foto de Major Anilto

Comentário: 

As variáveis oPopUp, oPopUp1, oPopUp2  presentes no código menu3.prg não estão sendo utilizadas. Serão usadas quando forem definidos menus PopUp. Eu havia testado previamente este programa com popups, mas achei melhor apresentar inicialmente somente a barra de topo.

Sub-menu

Comentário: 

Poderia me dar pelo menos uma linha em código que cria um sub-menu para uma das opções do oTopBar?

Páginas