Menu Principal de um programa em Clipper. Vou mostrar como podemos começar a programar. Esse exemplo pode ser compilado com o xHarbour ou Harbour.
Para compilar o menu.prg (disponível para download no fim da página) com o Harbour use:
hbmk2 menu c:\hb32\lib\win\mingw\libgtwin.a -lxhb.hbc -lhbxpp.hbc
A libgtwin.a é responsável pela acentuação gráfica da língua portuguesa na tela com o compilador Harbour.
Para compilar com o xHarbour, use:
hbmake menu /ex
O hbmake do xHarbour já compila tudo certinho.
Certifique-se de estar usando o Conjunto de caracteres > Europa Ocidental > OEM850. Abra o Notepad++, clique no menu Formatar e faça esta seleção. Esse é o conjunto de caracteres da nossa Língua Portuguesa.
Vamos configurar o sistema para trabalhar corretamente com arquivos de índice acentuados em nosso idioma Português; vamos utilizar os arquivos de índice DBFCDX; vamos configurar a época para 1980 e ficar imune ao Bug do Milênio; a data para o sistema britânico que é igual ao nosso dia, mês e ano; confirmar cada campo com <Enter>; posicionar mensagens na linha 24; não mostrar arquivos deletados etc. Para mais detalhes sobre cada função ou comando consulte o help online do Harbour em nosso site.
Configurando o sistema
REQUEST HB_LANG_PT // CONFIGURAÇÃO DA LINGUAGEM PORTUGUÊS REQUEST HB_CODEPAGE_PT850 // PARA INDEXAR CAMPOS ACENTUADOS Function Main() // TODO PROGRAMA EM xHARBOUR DEVE TER UM FUNCTION MAIN() INDICANDO O PROGRAMA PRINCIPAL #include "inkey.ch" *** SETs SET SCOREBOARD OFF SET DATE BRITISH // PADRÃO DE DATA BRITÂNICO DIA/MÊS/ANO SET MESSAGE TO 24 // POSICIONA AS MENSAGENS NA LINHA 24 SET DELETED ON // não mostra arquivos deletados SET EPOCH TO 1980 // Y2K COMPLIANT (FIX DO BUG DO MILÊNIO) SETMODE(25,80) // TELA PADRÃO SET OPTIMIZE ON SETMOUSE(.t.) SET(39,159) // MOUSE NOS GETs SET TIME FORMAT TO "hh:mm" SET CONFIRM ON // CONFIRMA CAMPOS C/SET HARDCOMMIT OFF // É MELHOR DAR UM DBCOMMIT() NO FINAL DE CADA TAREFA SET WRAP ON // CONFIGURAÇÃO DA LINGUAGEM PORTUGUÊS HB_LangSelect("PT") HB_SetCodePage("PT850") // CODEPAGE *** DEFINIR TIPO DE BANCO DE DADOS: DBFCDX Nativo *** // ANNOUNCE RDDSYS REQUEST DBFCDX REQUEST DBFFPT ANNOUNCE FPTCDX RDDSETDEFAULT("DBFCDX") RDDREGISTER( "DBFCDX", 1 ) // RDT_FULL SET AUTOPEN OFF CRIADBF() // CHAMA ROTINA DE CRIAÇÃO DE BANCO DE DADOS MENU() // CHAMA ROTINA DO MENU PRINCIPAL
Montando a tela do seu programa
Primeira coisa que você tem que saber é que a tela padrão do Clipper é a mesma do MS-DOS que comporta 80 colunas e 25 linhas. As coordenadas vão de 0 a 79 e 0 a 24 respectivamente.
Vamos montar uma linha de título; corpo e linha de status.
Para desenhar quadrados a gente usa o comando @...to...double com as coordenadas linha inicial, coluna inicial até linha final, coluna final.
Para exibir alguma coisa na tela usamos o comando @...SAY.
FUNCTION MENU() // MONTA A TELA DO SISTEMA SETCOLOR("W+/N, N/W,,,W+/BG") // DEFINE COR DA LETRA, SELECIONADO/FOCO, NÃO SELECIONADO/SEM FOCO. CLS // COMANDO PARA LIMPAR A TELA: CLear Screen @ 00,00 TO 02,79 DOUBLE // NOME DO SISTEMA @ 03,00 TO 05,79 DOUBLE // NOME DO PROGRAMA ATUAL @ 06,00 TO 23,79 DOUBLE // ÁREA DE TRABALHO @ 24,00 SAY SPACE(80) COLOR "W+/BG" // LINHA DE STATUS, MENSAGENS, ALERTAS ETC. cSISTEMA := "AGENDA TELEFÔNICA" cPROGRAMA := "MENU PRINCIPAL" @ 01,(80-LEN(cSISTEMA))/2 SAY cSISTEMA // (80 COLUNAS - TAMANHO DA STRING)/2 = MEIO DA TELA @ 04,(80-LEN(cPROGRAMA))/2 SAY cPROGRAMA @ 24,55 SAY "Tecle [Esc] para sair" COLOR "W+/BG"
Menu do sistema
Agora vamos montar o menu do sistema. Para dar escolhas ao usuário podemos usar o comando @..PROMPT dando as opções e armazenando a escolha com o comando MENU TO.
Atenção, o programa dará erro se você chamar uma função indefinida. Nesta página vamos criar apenas a função DBF().
// MONTA O MENU DO SISTEMA SETCOLOR("W+/BG") // PINTA UMA JANELA DE MENU @ 11,19 CLEAR TO 16,37 // LIMPA ESSA ÁREA @ 11,19 TO 16,37 DOUBLE // PÕE UMA MOLDURA NELA nMENU := 1 // DEFINE UMA VARIÁVEL NUMÉRICA = 1 PARA ARMAZENAR A ESCOLHA DO USUÁRIO @ 12,21 PROMPT " 1. Cadastro " MESSAGE "Cadastra número telefônico " @ 13,21 PROMPT " 2. Consulta " MESSAGE "Mostra números cadastrados na agenda " @ 14,21 PROMPT " 3. Deleta " MESSAGE "Deleta número cadastrado " @ 15,21 PROMPT " 4. Manutenção " MESSAGE "Recria arquivos de índices " MENU TO nMENU DO CASE CASE nMENU = 1 CADASTRO() // CHAMA SUBROTINA DE CADASTRO CASE nMENU = 2 CONSULTA() // CHAMA SUBROTINA DE CONSULTA CASE nMENU = 3 DELETA() // CHAMA SUBROTINA PARA DELETAR REGISTROS CASE nMENU = 4 ERASE("*"+INDEXEXT()) // APAGA TODOS OS ARQUIVOS DE ÍNDICE CRIADBF() // CHAMA A FUNÇÃO DE CRIAÇÃO DE BANCO DE DADOS E ÍNDICES OTHERWISE // CASO NENHUMA DAS ANTERIORES // QUANDO O USUÁRIO TECLA [Esc] nMENU = 0 QUIT // ENCERRA O PROGRAMA ENDCASE MENU() // CHAMA O MENU NOVAMENTE APÓS VOLTAR DE OUTRA SUBROTINA (FUNÇÃO)
Criando seu banco de dados
O ideal é que seu sistema seja capaz de criar seus próprios bancos de dados e arquivos de índices numa rotina específica. Arquivos de índices dão problema e precisam ser recriados eventualmente.
Para criar um arquivo de índice você tem que escolher um campo chave-única que não se repete como o CPF ou TELEFONE ou uma ordem que você deseja apresentar o banco de dados (NOME) em ordem alfabética.
Campos de chave única são muito importantes porque servem para relacionar um banco de dados com outro, normalmente é um número de CÓDIGO, CPF ou CNPJ.
O comando IF...ENDIF é muito utilizado em todos os sistemas. Eles executam os comandos se uma condição for satisfeita.
A função AADD() adiciona informações numa variável do tipo Array (matriz). Significa: Array Add = AADD(). Insere um vetor numa matriz.
A função FILE() retorna verdadeiro se o arquivo especificado existir.
O comando USE abre um banco de dados e o comando INDEX cria um arquivo de índice. O comando CLOSE fecha o banco de dados e arquivo de índice.
FUNCTION CRIADBF() // CRIA SUBROTINA CHAMADA DBF() // CRIA BANCO DE DADOS E ÍNDICES, CASO NÃO EXISTAM IF .NOT. FILE("AGENDA.DBF") // SE NÃO EXISTIR O ARQUIVO "AGENDA.DBF"... aDBF = {} // CRIA UMA VARIÁVEL DO TIPO ARRAY (MATRIZ) PARA ARMAZENAR A ESTRUTURA DO BANCO DE DADOS AADD(aDBF, {"NOME", "C", 30, 0}) // NOME, TIPO "C" CARACTER, TAMANHO 30, 0 CASAS DECIMAIS. AADD(aDBF, {"FONE", "N", 11, 0}) // FONE, TIPO "N" NUMÉRICO, TAMANHO 11, 0 CASAS DECIMAIS. AADD(aDBF, {"CPF", "N", 11, 0}) DBCREATE("AGENDA.DBF", aDBF) // FUNÇÃO QUE CRIA O BANCO DE DADOS COM BASE NUMA VARIÁVEL ARRAY (MATRIZ) ENDIF IF .NOT. FILE( "AGENDA"+INDEXEXT() ) // SE NÃO EXISTIR O ARQUIVO DE ÍNDICE DA AGENDA... USE AGENDA ALIAS FO EXCLUSIVE NEW // ABRE O BANCO DE DADOS AGENDA EM MODO EXCLUSIVO PARA INDEXAR INDEX ON NOME TAG NOME TO AGENDA // CRIA O ARQUIVO DE ÍNDICE INDEXANDO PELO NOME INDEX ON FONE TAG FONE TO AGENDA // CRIA O ARQUIVO DE ÍNDICE INDEXANDO PELO TELEFONE INDEX ON CPF TAG CPF TO AGENDA // CRIA O ARQUIVO DE ÍNDICE INDEXANDO PELO CPF CLOSE ENDIF RETURN
Para poder compilar sem erros precisa definir todas as funções que o sistema chama. Continue a leitura nas próximas páginas.
FUNCTION CADASTRO() // SUBROTINA A SER IMPLEMENTADA RETURN FUNCTION CONSULTA() // SUBROTINA A SER IMPLEMENTADA RETURN FUNCTION DELETA() // SUBROTINA A SER IMPLEMENTADA RETURN
Resultado:
Aprofunde-se mais, restrinja o acesso a usuários cadastrados antes de acessar o menu do sistema.
Abaixo está o código do nosso pequeno sistema de agenda completo num PRG só para download.
Comentários recentes