Clipper On Line • Ver Tópico - Super sistema de menus para a migração de sua aplicação

Super sistema de menus para a migração de sua aplicação

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Super sistema de menus para a migração de sua aplicação

Mensagempor rochinha » 05 Mar 2006 16:34

Amiguinhos

O meu sistema é totalmente configurável externamente pois para cada cliente eu disponibilizo o que for necessário usando uma mesma base.

Para tanto desenvolvi um esquema que torna a minha tela de entrada mais intuitiva, ou seja, os menus de meu sistema são gerados a partir de um arquivo externo.

Desta forma voce pode colocar um menu de acesso aos modulos de seu sistema, segurar o cliente e ir adaptando todo o resto de forma gradativa, produzindo o restante do seu aplicativo usando partes em Fivewin, DOS, MiniGUI, blablablaGUI, etc.

O codigo foi preparado para Fivewin, é bem simples de entender, e serve para todas as versões.

A codificação do menu é feita a partir de uma arquivo .PRG que segue o padrão da estrutura de criaçào de menus do Fivewin, mas totalmente externo.

Codigo MENU.PRG
#include "FiveWin.ch"

static oWnd, oClients, oClient, oName
static cName
static oSplit

//----------------------------------------------------------------------------//
FUNCTION Main(cTitle,cRegistro)
   public oMenu
   default cTitle    := "Interface de Menus Versao 1.0",;
           cRegistro := "Forum Clipper On-Line"
   SET _3DLOOK ON
   DEFINE WINDOW oWnd TITLE cTitle MDI ;
          MENU CheckMNUMenu() COLOR "N/W"
   DEFINE BUTTONBAR OF oWnd
   SET MESSAGE OF oWnd TO cRegistro NOINSET KEYBOARD CLOCK DATE
   ACTIVATE WINDOW oWnd MAXIMIZED ;
      VALID MsgYesNo( "Deseja terminar?" )
   return nil

//----------------------------------------------------------------------------//
FUNCTION CheckMNUMenu()
  local cAction, oMenu
  errfile    := memoread("menu.mnu")
  errLen     := mlcount(errfile,150)
  errLine    := 2
  espaco     := 3
  MENU oMenu
  DO WHILE .t.
     cLineTXT  := upper(alltrim(MEMOLINE(errfile,150,errLine)))
     nAction   := AT('ACTION',cLineTXT)-1
     cMenuItem := clearchr(alltrim(substr(cLineTXT,AT('MENUITEM',cLineTXT)+9,nAction-9)))
     cAction   := iif('ACTION'    $ cLineTXT,alltrim(substr(cLineTXT,AT('ACTION',cLineTXT)+7)),'{|| fun("nada configurado") }' )
     lAction   := iif('ACTION'    $ cLineTXT,.T. ,.F. )
     lMenuPop  := iif('MENUPOP'   $ cLineTXT,.T. ,.F. )
     lMenuItem := iif('MENUITEM'  $ cLineTXT,.T. ,.F. )
     lEndMenu  := iif('ENDMENU'   $ cLineTXT,.T. ,.F. )
     lSeparator:= iif('SEPARATOR' $ cLineTXT,.T. ,.F. )
     //
     DO CASE
        CASE lMenuPop
             MENUITEM &(alltrim(substr(cLineTXT,AT('MENUPOP',cLineTXT)+8)))
             MENU
             espaco := espaco + 3
        CASE lSeparator
             SEPARATOR
        CASE lEndMenu
             espaco := espaco - 3
             ENDMENU
        CASE lMenuItem
             MENUITEM cMenuItem BLOCK &( cAction ) // ACTION winexec( cAction ) //
     ENDCASE
     errLine := errLine + 1
     IF errLine > errLen
        EXIT
     ENDIF
  ENDDO
  return oMenu

//----------------------------------------------------------------------------//
FUNCTION fun( oque )
  msgstop( oque )
  return .t.

//----------------------------------------------------------------------------//
FUNCTION CLEARCHR( CICCGC )
   CICCGC = STRTRAN(CICCGC, '>', '')
   CICCGC = STRTRAN(CICCGC, '<', '')
   CICCGC = STRTRAN(CICCGC, '.', '')
   CICCGC = STRTRAN(CICCGC, '-', '')
   CICCGC = STRTRAN(CICCGC, '(', '')
   CICCGC = STRTRAN(CICCGC, ')', '')
   CICCGC = STRTRAN(CICCGC, '=', '')
   CICCGC = STRTRAN(CICCGC, '+', '')
   CICCGC = STRTRAN(CICCGC, '\', '')
   CICCGC = STRTRAN(CICCGC, '/', '')
   CICCGC = STRTRAN(CICCGC, '*', '')
   CICCGC = STRTRAN(CICCGC, ['], '')
   CICCGC = ALLTRIM(CICCGC)
   RETURN CICCGC

//----------------------------------------------------------------------------//
Func WaitRunDOS( event )
   lCHDIR( cFilePath( event ) )
   cPif := '_RD'+substr(strtran(time(),":",""),4,3)+".pif"
   oPif := tPif():new('Editor MS-DOS ('+dtoc(Date())+')', event )
   oPif:lWarnExit   := .F.
   oPif:lToolBar    := .F.
   oPif:lFullScreen := .F.
   oPif:lWorkInBG   := .F.
   oPif:write( cPif )
   WaitRun( cPif )
   lCHDIR( cFilePath( GetModuleFileName( GetInstance() ) ) )
   return nil


Codigo MENU.MNU
MENU oMenu
   MENUPOP 'ADMINISTRACAO'
   MENU
     MENUITEM 'CLIENTES'        ACTION {|| WinExec( "testdlg.exe" ) }
     MENUITEM 'FORNECEDORES'    ACTION {|| WinExec( "testdlg.exe" ) }
     SEPARATOR
     MENUPOP 'CATEGORIAS'
     MENU
       MENUITEM 'TIPOS DE LINHAS'     ACTION {|| WinExec( "testdlg.exe" ) }
       MENUITEM 'TIPOS DE CLIENTES'   ACTION {|| WinExec( "testdlg.exe" ) }
       MENUITEM 'TIPOS DE TRANSACOES' ACTION {|| WinExec( "testdlg.exe" ) }
       MENUITEM 'TIPOS DE PRODUTOS'   ACTION {|| WinExec( "testdlg.exe" ) }
       MENUITEM 'TIPOS DE SITUACOES'  ACTION {|| WinExec( "testdlg.exe" ) }
     ENDMENU
     MENUPOP 'TABELAS AUXILIARES'
     MENU
       MENUITEM 'GRUPOS DE CONTAS'       ACTION {|| fun( "teste" ) }
       MENUITEM 'TIPOS DE CONTAS'        ACTION {|| fun( "teste" ) }
       MENUITEM 'DOCUMENTOS'             ACTION {|| fun( "teste" ) }
       MENUITEM 'PORTADORES'             ACTION {|| fun( "teste" ) }
       MENUITEM 'REGIOES'                ACTION {|| fun( "teste" ) }
       MENUITEM 'SIGLAS'                 ACTION {|| fun( "teste" ) }
       MENUITEM 'CIDADES E D.D.D'        ACTION {|| fun( "teste" ) }
       MENUITEM 'CONDICOES DE PAGAMENTO' ACTION {|| fun( "teste" ) }
       MENUITEM 'INSTRUCOES GERAIS'      ACTION {|| fun( "teste" ) }
     ENDMENU
     SEPARATOR
     MENUPOP 'PRODUTOS'
     MENU
       MENUITEM 'MANUTENCAO'    ACTION {|| fun( "teste" ) }
       MENUITEM 'ETIQUETAS'     ACTION {|| fun( "teste" ) }
     ENDMENU
     MENUITEM 'ALMOXARIFADO'    ACTION {|| fun( "teste" ) }
   ENDMENU

   MENUPOP 'VENDAS'
   MENU
     MENUPOP 'FATURAMENTO'
     MENU
       MENUITEM 'PEDIDO DE VENDAS'         ACTION {|| WaitRunDOS( "c:\win2003\notepad.exe" ) }
       SEPARATOR
       MENUITEM 'EMISSAO DE PEDIDOS'       ACTION {|| fun( "teste" ) }
       MENUITEM 'EMISSAO DE NOTA FISCAL'   ACTION {|| fun( "teste" ) }
       MENUITEM 'EMISSAO DE DUPLICATAS'    ACTION {|| fun( "teste" ) }
       MENUITEM 'EMISSAO DE BOLETOS'       ACTION {|| fun( "teste" ) }
       MENUITEM 'EMISSAO DE PROMISSORIAS'  ACTION {|| fun( "teste" ) }
     ENDMENU
   ENDMENU
   MENUPOP 'FINANCEIRO'
   MENU
     MENUITEM 'CONTAS A PAGAR'             ACTION {|| fun( "teste" ) }
     MENUITEM 'CONTAS PAGAS'               ACTION {|| fun( "teste" ) }
     MENUITEM 'CONTAS A RECEBER'           ACTION {|| fun( "teste" ) }
     MENUITEM 'CONTAS RECEBIDAS'           ACTION {|| fun( "teste" ) }
     SEPARATOR
     MENUITEM 'CONTAS-CORRENTE'            ACTION {|| fun( "teste" ) }
   ENDMENU
ENDMENU
return oMenu


Para executar o menu basta digitar o comando assim:

MENU "Nome de Meu Aplicativo" "Registrado para Empresa XYZ"

Para executar modulos em DOS use a função WaitRunDOS().

As versões posteriores eu colocarei botões, modulo de registro e modulo de acesso.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 246 vezes

Mensagempor rochinha » 12 Mar 2006 23:10

Amiguinhos

Dando continuação a este tópico apresento o codigo da versão 2.0 do nosso super sistema de menus.

Esta versão incirpora outro recurso. menu de boões.

Agora voce poderá acrescentar à barra de menus botões para acesso a opções extras.

codigo MENU.BTN
BAR oBar OF oWnd _3D
   BUTTONBAR OF oBar BITMAP "exit.bmp" ACTION fun( "teste 1" ) MESSAGE "Teste 1"
   BUTTONBAR OF oBar BITMAP "open.bmp" ACTION fun( "teste 2" ) MESSAGE "Teste 2"
   BUTTONBAR OF oBar BITMAP "cut.bmp" ACTION WinExec( "teste.exe" ) MESSAGE "Teste 2"
ENDBAR


Codigo versão 2.0 do MENU.PRG
#include "FiveWin.ch"

static oWnd, oClients, oClient, oName
static cName
static oSplit

//----------------------------------------------------------------------------//
FUNCTION Main(cTitle,cRegistro)
   public oMenu, oBar
   default cTitle    := "Interface de Menus Versao 1.0",;
           cRegistro := "Forum Clipper On-Line"
   SET _3DLOOK ON
   DEFINE WINDOW oWnd TITLE cTitle MDI MENU CheckMNUMenu() COLOR "N/W"
          CheckBTNMenu(oBar,oWnd,.f.)
   SET MESSAGE OF oWnd TO cRegistro NOINSET KEYBOARD CLOCK DATE
   ACTIVATE WINDOW oWnd MAXIMIZED ;
      VALID MsgYesNo( "Deseja terminar?" )
   return nil

//----------------------------------------------------------------------------//
FUNCTION CheckMNUMenu()
  local cAction, oMenu
  errfile    := memoread("menu.mnu")
  errLen     := mlcount(errfile,150)
  errLine    := 2
  espaco     := 3
  MENU oMenu
  DO WHILE .t.
     cLineTXT  := upper(alltrim(MEMOLINE(errfile,150,errLine)))
     nAction   := AT('ACTION',cLineTXT)-1
     cMenuItem := clearchr(alltrim(substr(cLineTXT,AT('MENUITEM',cLineTXT)+9,nAction-9)))
     cAction   := iif('ACTION'    $ cLineTXT,alltrim(substr(cLineTXT,AT('ACTION',cLineTXT)+7)),'{|| fun("nada configurado") }' )
     lAction   := iif('ACTION'    $ cLineTXT,.T. ,.F. )
     lMenuPop  := iif('MENUPOP'   $ cLineTXT,.T. ,.F. )
     lMenuItem := iif('MENUITEM'  $ cLineTXT,.T. ,.F. )
     lEndMenu  := iif('ENDMENU'   $ cLineTXT,.T. ,.F. )
     lSeparator:= iif('SEPARATOR' $ cLineTXT,.T. ,.F. )
     //
     DO CASE
        CASE lMenuPop
             MenuAddItem( &(alltrim(substr(cLineTXT,AT("MENUPOP",cLineTXT)+8))),, .F.,,,,,,,,, .F.,,, .F. )
             MenuBegin( .F. )
             espaco := espaco + 3
        CASE lSeparator
             MenuAddItem()
        CASE lEndMenu
             espaco := espaco - 3
             MenuEnd()
        CASE lMenuItem
             MenuAddItem( cMenuItem,, .F.,,,,,, &( cAction ),,, .F.,,, .F. )
     ENDCASE
     errLine := errLine + 1
     IF errLine > errLen
        EXIT
     ENDIF
  ENDDO
  return oMenu

//----------------------------------------------------------------------------//
FUNCTION CheckBTNMenu(oBar,oWnd,l3D)
  local cAction
  public oBtnBar := Array(20)
  errfile    := memoread("menu.btn")
  errLen     := mlcount(errfile,150)
  errLine    := 2
  espaco     := 3
  nBtnNumber := 1
  //DEFINE BUTTONBAR oBar OF oWnd _3D
  oBar := TBar():New( oWnd,,,l3D,, )
  DO WHILE .t.
     cLineTXT  := upper(alltrim(MEMOLINE(errfile,150,errLine)))
     nAction   := AT('ACTION',cLineTXT)-1                       
     nMessage1 := AT('ACTION',cLineTXT)+7
     nMessage2 := AT('MESSAGE',cLineTXT)-1         
     cMessage  := clearchr(alltrim(substr(cLineTXT,AT('MESSAGE',cLineTXT)+8,nAction-8)))
     cMenuItem := clearchr(alltrim(substr(cLineTXT,AT('BUTTONBA',cLineTXT)+9,nAction-9)))
     cAction   := iif('ACTION'    $ cLineTXT,alltrim(substr(cLineTXT,nMessage1,nMessage2-nMessage1)),'{|| fun("sem mensagem") }' )
     cBmpFile  := iif('BITMAP'    $ cLineTXT,alltrim(substr(cLineTXT,AT('BITMAP',cLineTXT)+7,(AT('ACTION',cLineTXT)-1)-(AT('BITMAP',cLineTXT)+7))),'bitmap.bmp' )
     lAction   := iif('ACTION'    $ cLineTXT,.T. ,.F. )     
     lMenuPop  := iif('MENUPOP'   $ cLineTXT,.T. ,.F. )     
     lMenuItem := iif('BUTTONBA'  $ cLineTXT,.T. ,.F. )
     lEndMenu  := iif('ENDMENU'   $ cLineTXT,.T. ,.F. )
     lSeparator:= iif('SEPARATOR' $ cLineTXT,.T. ,.F. )
     //
     DO CASE
        CASE lMenuPop
             MENUITEM &(alltrim(substr(cLineTXT,AT('MENUPOP',cLineTXT)+8)))
             MENU
             espaco := espaco + 3
        CASE lSeparator
             SEPARATOR
        CASE lEndMenu
             espaco := espaco - 3
             //ENDMENU
        CASE lMenuItem
             oBtnBar[nBtnNumber] := TBtnBmp():NewBar(,,&(cBmpFile),, cMessage,&("{|This|"+cAction+"}"), .F., oBar, .F.,, cMessage, .F.,,cAction,,,,,,,, )
             nBtnNumber := nBtnNumber + 1
     ENDCASE
     errLine := errLine + 1
     IF errLine > errLen
        EXIT
     ENDIF
  ENDDO
  return oBar

//----------------------------------------------------------------------------//
FUNCTION fun( oque )
  msgstop( oque )
  return .t.

//----------------------------------------------------------------------------//
FUNCTION CLEARCHR( CICCGC )
   CICCGC = STRTRAN(CICCGC, '>', '')
   CICCGC = STRTRAN(CICCGC, '<', '')
   CICCGC = STRTRAN(CICCGC, '.', '')
   CICCGC = STRTRAN(CICCGC, '-', '')
   CICCGC = STRTRAN(CICCGC, '(', '')
   CICCGC = STRTRAN(CICCGC, ')', '')
   CICCGC = STRTRAN(CICCGC, '=', '')
   CICCGC = STRTRAN(CICCGC, '+', '')
   CICCGC = STRTRAN(CICCGC, '\', '')
   CICCGC = STRTRAN(CICCGC, '/', '')
   CICCGC = STRTRAN(CICCGC, '*', '')
   CICCGC = STRTRAN(CICCGC, ['], '')
   CICCGC = ALLTRIM(CICCGC)
   RETURN CICCGC

//----------------------------------------------------------------------------//
Func WaitRunDOS( event )
   lCHDIR( cFilePath( event ) )
   cPif := '_RD'+substr(strtran(time(),":",""),4,3)+".pif"
   oPif := tPif():new('Editor MS-DOS ('+dtoc(Date())+')', event )
   oPif:lWarnExit   := .F.
   oPif:lToolBar    := .F.
   oPif:lFullScreen := .F.
   oPif:lWorkInBG   := .F.
   oPif:write( cPif )
   WaitRun( cPif )
   lCHDIR( cFilePath( GetModuleFileName( GetInstance() ) ) )
   return nil


Agora voce pode melhorar o seu sistema de menus. Minha preferencia é que ele seja stand-alone, ou seja, separado do resto do sistema, voce terá maior controle.

O próximo tópico já tá no forno com opção de pedido de registro do software. Aguardem.

PS:espero o feedback com criticas, idéias, etc, todas colocadas na sessão Fivewin.

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 246 vezes

Mensagempor Marcos » 06 Fev 2007 17:40

Boa tarde Rochinha,
Primeiramente, parabéns pelo belíssimo código, gostaria de saber c dá para usar ele em xHarbour?
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar de usuário

Marcos
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 336
Data de registro: 20 Set 2003 09:16
Cidade/Estado: Cáceres/Mato Grosso
Curtiu: 6 vezes
Mens.Curtidas: 1 vez

Mensagempor rochinha » 06 Fev 2007 17:51

Amiguinho

Ele foi feito quando eu tinha a versão 16bits. Se voce for utiliza-lo com Fivewin for Harbour ou xHarbour não tera problema pois eu uso hoje com o meu sistema 32bits em Harbour.

Se for utilizar com outra GUI basta modificar os comandos visuais e pronto.

Direcione seu foco de trabalho para as funções CheckMNUMenu e CheckBTNMenu.

Como voce percebeu ele trabalha com arquivos TXT com formatacao parecida com XML portanto ao errar a abertura e fechadura das tags ele pode não funcionar direito.

Usei este método no começo para migrar rapido meus aplicativos e hoje não uso mais o arquivo .MNU e sim um .DBF com campos de flag para desabilitar/habilitar menus e usuarios.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4547
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 806 vezes
Mens.Curtidas: 246 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


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