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 :?)