Clipper On Line • Ver Tópico - Menus dentro de outro(s) menu(s)
Mudar para estilo Clássico
Projeto MiniGui - Biblioteca visual para Harbour/xHarbour
Postar uma resposta

Menus dentro de outro(s) menu(s)

16 Jun 2013 15:00

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:
***** 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.
Editado pela última vez por Pablo César em 16 Jun 2013 17:59, num total de 1 vezes
Razão: Mensagem re-editada para separar código fonte de mensagem de erro.

Menus dentro de outro(s) menu(s)

16 Jun 2013 18:43

Olá Billy,

Veja se é isto que você procurava:
Código:
#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)

17 Jun 2013 11:43

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.
Postar uma resposta