Começando um programa

Foto de Anderson

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:

Menu Principal

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.

Downloads: 

menu.prg — Baixado 109 vezes
Total votes: 0