Clipper On Line • Ver Tópico - Menus dentro de outro(s) menu(s)

Menus dentro de outro(s) menu(s)

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Menus dentro de outro(s) menu(s)

Mensagempor billy1943 » 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.

***** 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.
Nota de Moderação:
Pablo César: Mensagem re-editada para separar código fonte de mensagem de erro.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes

Menus dentro de outro(s) menu(s)

Mensagempor Pablo César » 16 Jun 2013 18:43

Olá Billy,

Veja se é isto que você procurava:
#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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5539
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 151 vezes

Menus dentro de outro(s) menu(s)

Mensagempor billy1943 » 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.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar de usuário

billy1943
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 574
Data de registro: 12 Mai 2009 17:33
Cidade/Estado: Bauru-SP
Curtiu: 1 vez
Mens.Curtidas: 18 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro