Página 1 de 1

Menus dentro de outro(s) menu(s)

Enviado: 16 Jun 2013 15:00
por billy1943
Estou a queimar neurônios e fosfato para descobrir o que pode estar errado na estrutura (reduzida) de programa abaixo exposta.

Pediria os colegas que me apontassem os erros, pois fiz tal estrutura baseando-me em um monte de exemplos de programas que tem janelas abertas em rotinas secundárias.

Código: Selecionar todos

***** Programa principal

FUNCTION Main()

	DEFINE WINDOW Win_1 ;
		AT 0,0 ;
		WIDTH 400 ;
		HEIGHT 400 ;
		TITLE ' Exemplo de EAN13' ;
		MAIN 

		DEFINE MAIN MENU
		
			DEFINE POPUP 'Arquivo'
				MENUITEM 'Usando .DBF' ACTION PrintEAN13()
			END POPUP
			
			DEFINE POPUP 'Etiqueta'
				MENUITEM 'Digitar o código EAN13' ACTION Print_UM_EAN13()
			END POPUP
			
			DEFINE POPUP 'Produtos'
				MENUITEM 'Browse Arquivo  Produtos' ACTION Produtos()
			END POPUP
			
			DEFINE POPUP 'Saida'
				MENUITEM 'Exit' ACTION DoMethod("Win_1","Release")
			END POPUP

		END MENU

	END WINDOW

	CENTER WINDOW Win_1
	ACTIVATE WINDOW Win_1
	
return

***********************
***** rotina secundária   - chamada pela ACTION Produtos()
***********************

FUNCTION produtos()
Local bColor := { || if ( deleted() , RGB( 255, 0, 0 ) , RGB( 255, 255, 255 ) ) }	
Local var := 'Test'

	REQUEST DBFNTX

	SET EXCLUSIVE ON
	SET CENTURY ON
	SET DELETED OFF
	SET BROWSESYNC ON	

	DEFINE WINDOW FORM_1 ;
		AT 0,0 ;
		WIDTH 640 HEIGHT 480 ;
		TITLE 'Produtos' ;
		ON INIT OpenTable() ;
		ON RELEASE CloseTable()

               *** trecho onde está acusando o erro
		DEFINE WINDOW MENU1
		
			POPUP 'Arquivo'
				ITEM 'Adicionar'	ACTION Append_record()
				ITEM 'Deletar/Retornar'	ACTION Delete_record()
				SEPARATOR
				ITEM 'Saída'	ACTION Form_1.Release
			END POPUP
			POPUP 'Ajuda'
				ITEM 'Sobre'	ACTION MsgInfo ("Visualiza Produtos") 
			END POPUP
                ****  até aqui 
		END MENU1

	    CENTER WINDOW menu1
	    ACTIVATE WINDOW menu1
		
		DEFINE STATUSBAR
			STATUSITEM ''
		END STATUSBAR

		@ 10,10 BROWSE Browse_1 ;
			WIDTH 610 ; 
			HEIGHT 313 ; 	
			HEADERS { 'X' , 'Código Barras' , 'Código Prod' , 'Nome Produto', 'Quantidade', 'Ítens' , 'Preço Unitário' } ;
			WIDTHS { 30 , 100 , 150 , 50 , 50 , 50 , 50 } ;
			WORKAREA &var ;
			FIELDS {'Etiq->(iif(deleted(),"*"," "))' , 'Etiq->Codbarras' , 'Etiq->Codpro' , 'Etiq->Nomepro' , 'Etiq->Quantid' , 'Etiq->Itens' , 'Etiq->Precounit' } ;
			ON CHANGE ChangeTest() ;
			JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT} ;
			TOOLTIP 'Browse Produto' ;
			DYNAMICBACKCOLOR { bColor, bColor, bColor, bColor, bColor, bColor, bColor } ;
			EDIT

                @ 350,150 BUTTON Button_1 ;
                          CAPTION 'Adiciona registro' ;
                          WIDTH 140 ;
                          ACTION Append_record() ;
                          TOOLTIP 'Adiciona um novo registro'

                @ 350,300 BUTTON Button_2 ;
                          CAPTION 'Deleta/Recupera' ;
                          WIDTH 140 ;
                          ACTION Delete_record() ;
                          TOOLTIP 'Deletar / Recupera o registro corrente'

	END WINDOW 

	CENTER WINDOW Form_1

	ACTIVATE WINDOW Form_1

Return Nil
Os erros apontados no Error.LOG são os seguintes:
Harbour 3.2.0dev (r1305080957)
Copyright (c) 1999-2013, http://harbour-project.org/

Exemplo.prg(59) Error E0030 Syntax error "syntax error at 'WINDOW'" ---> linha
Exemplo.prg(57) Error E0030 Syntax error "syntax error at 'END'"

2 errors
Observação: as linhas foram modificadas para se mostrar no trecho acima onde eles ocorreram.

Menus dentro de outro(s) menu(s)

Enviado: 16 Jun 2013 18:43
por Pablo César
Olá Billy,

Veja se é isto que você procurava:

Código: Selecionar todos

#include <hmg.ch>

FUNCTION Main()
DEFINE WINDOW Win_1 ;
   AT 0,0 ;
   WIDTH 400 ;
   HEIGHT 400 ;
   TITLE ' Exemplo de EAN13' ;
   MAIN 

   DEFINE MAIN MENU
   
      DEFINE POPUP 'Arquivo'
         MENUITEM 'Usando .DBF' ACTION PrintEAN13()
      END POPUP
      
      DEFINE POPUP 'Etiqueta'
         MENUITEM 'Digitar o código EAN13' ACTION Print_UM_EAN13()
      END POPUP
      
      DEFINE POPUP 'Produtos'
         MENUITEM 'Browse Arquivo  Produtos' ACTION Produtos()
      END POPUP
      
      DEFINE POPUP 'Saida'
         MENUITEM 'Exit' ACTION DoMethod("Win_1","Release")
      END POPUP

   END MENU

END WINDOW
CENTER WINDOW Win_1
ACTIVATE WINDOW Win_1
Return Nil

***********************
***** rotina secundária   - chamada pela ACTION Produtos()
***********************

FUNCTION produtos()
Local bColor := { || if ( deleted() , RGB( 255, 0, 0 ) , RGB( 255, 255, 255 ) ) }   
Local var := 'Test'

REQUEST DBFNTX

SET EXCLUSIVE ON
SET CENTURY ON
SET DELETED OFF
SET BROWSESYNC ON   

DEFINE WINDOW FORM_1 AT 0,0 ;
   WIDTH 640 HEIGHT 480 ;
   TITLE 'Produtos' ;
   ON INIT OpenTable() ;
   ON RELEASE CloseTable()

            *** trecho onde está acusando o erro
   DEFINE MAIN MENU
	POPUP 'Arquivo'
		ITEM 'Adicionar'   ACTION Append_record()
		ITEM 'Deletar/Retornar'   ACTION Delete_record()
		SEPARATOR
		ITEM 'Saída'   ACTION Form_1.Release
	END POPUP
	
	POPUP 'Ajuda'
		ITEM 'Sobre'   ACTION MsgInfo ("Visualiza Produtos") 
	END POPUP
   END MENU
   
   DEFINE STATUSBAR
      STATUSITEM ''
   END STATUSBAR

   @ 20,10 BROWSE Browse_1 ;
      WIDTH 610 ; 
      HEIGHT 313 ;    
      HEADERS { 'X' , 'Código Barras' , 'Código Prod' , 'Nome Produto', 'Quantidade', 'Ítens' , 'Preço Unitário' } ;
      WIDTHS { 30 , 100 , 150 , 50 , 50 , 50 , 50 } ;
      WORKAREA &var ;
      FIELDS {'Etiq->(iif(deleted(),"*"," "))' , 'Etiq->Codbarras' , 'Etiq->Codpro' , 'Etiq->Nomepro' , 'Etiq->Quantid' , 'Etiq->Itens' , 'Etiq->Precounit' } ;
      ON CHANGE ChangeTest() ;
      JUSTIFY { BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_LEFT, BROWSE_JTFY_RIGHT, BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT,BROWSE_JTFY_RIGHT} ;
      TOOLTIP 'Browse Produto' ;
      DYNAMICBACKCOLOR { bColor, bColor, bColor, bColor, bColor, bColor, bColor } ;
      EDIT

      @ 350,150 BUTTON Button_1 ;
                CAPTION 'Adiciona registro' ;
                WIDTH 140 ;
                ACTION Append_record() ;
                TOOLTIP 'Adiciona um novo registro'

      @ 350,300 BUTTON Button_2 ;
                CAPTION 'Deleta/Recupera' ;
                WIDTH 140 ;
                ACTION Delete_record() ;
                TOOLTIP 'Deletar / Recupera o registro corrente'

END WINDOW 
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil

Function OpenTable()
Return Nil

Function Print_UM_EAN13()
Return Nil

Function PrintEAN13()
Return Nil

Function CloseTable()
Return Nil

Function ChangeTest()

Function Append_Record()

Function Delete_Record()
Na minha opinião, esse erro primeiramente é porque você está tranzendo o mesmo conceito da programação do tipo console de "pintar" uma janela dentro de outra. E na programação GUI deve seguir uma regra mais estrita. Pois não se pode declarar para criação de outra janela dentro de uma que ainda não foi devidamente fechada (em Minigui: END WINDOW). Sempre é bom criar suas sub-janelas em funções separadas do Main. O main chama a principal e depois as outras mediante de EVENTOS. Outro detalhe que faltou, é que no menu da segunda janela, não tinha sido declarado como DEFINE MAIN MENU e por isso não deve ter exibido o menu da segunda janela nas suas primeiras tentativas.

Menus dentro de outro(s) menu(s)

Enviado: 17 Jun 2013 11:43
por billy1943
Oi, amigo Pablo César !!

Deu certo !
Vou estudar atentamente o que eu estava fazendo de "errado", pois o que eu verifiquei de exemplos, e não tinha a sua explanação.