Você está na página 1de 19

Exerccio 2 Sistema de Entrada de Pedidos: DELPHI 7

Neste Exerccio sero criados as seguintes tabelas:

Tabela Clientes;
Tabela Pedidos;
Tabela Itens-Pedidos;
Tabela Produtos.

Criando o Alias.

Escolha no menu Iniciar, Todos os Programas, Borland Delphi7, BDE


Administrator, ou d dois cliques no cone com o mesmo nome na
rea de trabalho;

Selecione Object / New no menu principal. Na janela New Dababase


Alias confirme clicando em OK;

Para entrar com o nome para o Alias, altere o nome apresentado


(STANDARD1) para Pedidos;

Para localizar as tabelas no campo PATH, na aba Definition, clique


nos trs pontinhos () da linha PATH e defina o caminho utilizado
na criao da pasta do projeto:

K:\Arq_Delphi6\Exercicios_em_Delphi-6\Exerc_2-Pedidos\Fontes

Em seguida confirme OK e certifique-se de gravar, clicando no


boto Apply ou indo ao menu Object / Apply (Crtl + A). Confirme em
OK.

Criando as Tabelas de Dados

Acesse o Database Desktop no menu do Windows em menu Iniciar,


Todos os Programas, Borland Delphi7/Database Desktop, ou pelo menu
do Delphi 7 em Tool/Database Destop;

Selecione o menu File/New/Tabel para abrir a caixa de dilogo


Create Table. Na caixa de combinao Table type escolha o tipo de
tabela padro, Paradox 7;

Clique em OK para exibir a caixa de dilogo Create Paradox 7


Table;

Para criar a tabela, Clientes, digite em Field Name o nome do


primeiro campo, CODIGO;

Na coluna Type digit +, para criar o campo AutoIncremet;


Na coluna Key d um duplo clique ou pressione uma tecla para
marcar este campo como sendo campo chave.
Para criar os ndices secundrios, localize na janela Create Table
Paradox 7: (Untitled) a caixa de combinao (combo) Table
properties e selecione a opo Secundary Indexes.

Aps selecionar a opo Secondary Indexes, abrir a janela para


definio dos ndices secundrios, com a lista dos campos da
tabela Clientes;

Na janela Define Secondary Index dentre os campos (Filds:)


exibidos, escolha aqueles os quais pretende criar os ndices. Em
nosso exerccio criaremos os ndices do campo RazaoSocial.

Para isso, clique no campo RazaoSocial na coluna Fields,


selecionando-o. Em seguida, clique no boto com a seta para
direita, o que ir transferir o campo para a coluna Indexed
fields.
Sua janela dever ser algo como a figura abaixo:

Clique no boto OK e na caixa de dilogo Save Index As digite o


nome do ndice secundrio (IRazaoSocial), clicando em OK novamente

Clique no boto Save As para salvar nossa tabela. Na caixa de


dilogo Save Table As selecione no combo Alias o alias que criamos
para nosso banco de dados (Pedidos). Note que ao selecionar o
alias, a combo Salvar indica a Pasta Dados, para onde ns
definimos o path do mesmo.

Em nome do arquivo, digite o nome que ser dado a tabela, neste


caso Clientes.db (ou apenas Clientes, pois a extenso ser
adicionada automaticamente de acordo com o tipo de arquivo sendo
criado).

Antes de criar-mos as tabelas restantes, vamos a uma dica: Para


que no selecionar o alias toda vez que for gravar uma nova tabela
que criar ou ao abri-la para modificao, podemos informar ao
Database Desktop que estaremos trabalhando com um alias em
particular, tornando-o o alias padro.

Para isso v ao menu File | Working directory e selecione o alias


Pedidos clicando em seguida no boto OK.
Est feito, d prxima vez que for salvar a tabela, o nosso alias
j estar selecionado.

Crie as tabelas restantes, pois necessitaremos delas nas prximas


aulas, onde estaremos iniciando a criao do nosso aplicativo.

Criando nosso Formulrio Principal

Criando o Menu

O componente do
menu o segundo na pgina Standard da paleta de componentes (o
primeiro, Frames, na verdade no um componente, apenas permite
inserir um frame dentro do form).

Selecione-o e coloque o menu no form. O cone aparece mas ainda


no h nenhuma barra de menu. Para entrar no Menu Editor (editor
de menu) necessrio um duplo clique no cone do componente que
foi colocado form. Note que quando o editor ativado o Object
Inspector passa a mostrar as propriedades e eventos dos itens de
menu.

Conhecendo o Object Inspector do Delphi 7:


No Object Inspector selecione a propriedade Caption e digite
&Arquivo. O menu passa a mostrar agora uma opo para Arquivo e um
retngulo pontilhado ao lado. Note que o & (& comercial)
utilizado antes da palavra Arquivo serviu para identificar que a
letra A ser um atalho para esta opo de menu, que poder ser
acessada no sistema atravs das teclas Alt+A.

Clique no retngulo, selecione a propriedade Caption e digite C&adastros.


Repita a operao e coloque mais um item para A&juda.

Para criar um sub-menu do menu principal, basta clicar na opo desejada


e utilizar o retngulo que aparece abaixo da opo. Crie agora os
seguintes submenus:

Para Arquivo: &Sair


Para Cadastro: &Clientes, &Produtos e P&edidos
Para Ajuda: &Sobre o sistema...

Para criar sub-menus em sub-menus, selecione a opo que ser a


raiz e pressione CTRL + Seta Direita. Crie as opes Cadastro e
Listagem no cadastro de Clientes e no de Produtos. No cadastro de
Pedidos crie trs opoes: Cadastro, Impresso e Listagem. O menu
completo fica assim:
Arquivo Cadastros Ajuda
Sair Clientes Sobre o sistema...
Cadastro
Listagem
Produtos
Cadastro
Listagem
Pedidos
Cadastro
Impresso
Listagem

Apenas para deixar o cdigo fonte mais claro e legvel, poderamos


renomear estes itens para algo como mnuCadCli, mnuCadProd e
mnuCadPed. Estamos usando o prefixo mnu para indicar que um item
de menu. Para fixar melhor este hbito, renomeie tambm as opes
de Listagem.
Agora observe que ser necessrio programar para que os menus
criados executem os procedimentos que queremos.

Para isso criaremos o cdigo para cada opo do menu. Nesse


momento, vamos apenas codificar, no editor decdigo, a opo de
sada do sistema.

O editor de cdigo responsvel por receber todas as declaraes


criadas pelo Delphi e handlers (manipuladores de eventos) criados
pelo desenvolvedor. no ambiente Code Editor que implementamos o
algoritmo na linguagem ObjectPascal.

Com o editor de menus fechado, selecione a opo Arquivo/Sair no


prprio form da aplicao, com dois cliques. O editor de cdigo
ser ativado. Na rea onde o cursor aparece piscando escreva
Close;

O cdigo do programa ficar assim:


procedure TForm1.Sair1Click(Sender: TObject);
begin
Close;
end;

Este mtodo ser responsvel por fechar este Form, como estamos no
formulrio principal a aplicao toda ser fechada.

Agora clique no Form para selecion-lo e no Object Inspector


altere a propriedade Name do mesmo para FormPrincipal. Na
propriedade Caption digite Controle de Pedidos, sem as aspas.

Observe que ao trocar o Name do form o Delphi fez as modificaes


no cdigo fonte tambm.

procedure TFormPrincipal.Sair1Click(Sender: TObject);


begin
Close;
end;
Note tambm que o componente de menu que inclumos foi adicionado
definio da classe do Form, juntamente com os itens de menu que
inclumos atravs do Menu Editor. Isso pode ser visto no editor de cdigo
se voc for para o incio da unit. A nova definio ser semelhante ao
exemplo abaixo:

type
TFormPrincipal = class(TForm)
MainMenu1: TMainMenu;
Arquivo1: TMenuItem;
Cadastros1: TMenuItem;
Ajuda1: TMenuItem;
Sair1: TMenuItem;
Clientes1: TMenuItem;
Produtos1: TMenuItem;
Pedidos1: TMenuItem;
mnuCadCli: TMenuItem;
mnuListCli: TMenuItem;
mnuCadProd: TMenuItem;
mnuListProd: TMenuItem;
mnuCadPed: TMenuItem;
mnuListPed: TMenuItem;
procedure Sair1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormPrincipal: TFormPrincipal;

Salvando o Projeto
Salve o projeto na pasta que criamos (C:\Pedidos), como aprendemos
na nossa primeira aula.

Caso no se recorde, vamos fazer juntos para fixar:

Clique no boto Save All do SpeedBar.

Na caixa de dilogo Save Unit1 As no item Nome do arquivo digite


Principal.pas e verifique a pasta que est selecionada, se no for
a pasta Pedidos localize e selecione-a antes de clicar no boto
Salvar ou teclar Enter.

Na caixa de dilogo Save Project1 As no item Nome do arquivo


digite o nome que daremos ao projeto, Pedidos.dpr.

Definindo o tipo de aplicao

Se quisermos, por exemplo, que ele aparea maximizado, poderemos fazer


isso definindo a propriedade WindowState em nosso Form. Para isso, v at
o Object Inspector e defina a propriedade WindowState para wsMaximized
(No esquea de fechar a janela se o estiver executando).
Neste exerccio vamos utilizar um formulrio MDI para criar uma
interface prxima da qual a maior parte dos usurios do Windows j
esto acostumados ao utilizarem editores de texto como o Microsoft
Word que trabalham desta forma.

Para criarmos um Formulrio MDI devemos definir, no Object


Inspector, a propriedade FormStyle como sendo fsMDIForm.

Obs: S pode existir um formulrio com FormStyle definido com fsMDIForm


por projeto. Os formulrios filhos (Children Forms) devero ter seu
FormStyle definido como fsMDIChild. (No h limite para o nmero de
formulrios filhos).

Preparando o Acesso aos Dados

V at a guia BDE da paleta de componentes, selecione o componente


DataBase e adicione-o ao Form.

Defina no componente DataBase as seguintes propriedades:

Criando o Cadastro de Clientes

Para criarmos nosso cadastro de Clientes devemos incluir um novo


formulrio no projeto. Fazemos isso clicando no boto New Form do
SpeedBar ou ento no menu File | New | Form.

Defina, no Object Inspector, as propriedades deste Form como na tabela


abaixo:

Agora vamos comear a criar a interface. Na guia Stardard, selecione o


componente Panel e coloque-o no Form. Defina as propriedades assim:
Adicione um ScrollBox, que se encontra na guia Additional, tendo o
cuidado de coloc-lo na rea do Form que no contm o primeiro
Panel. Para este componente defina as propriedades:

Agora vamos inserir o componente que dar acesso a nossa tabela.


V at a guia BDE, selecione o componente Table e coloque-o no
Form.

Precisamos agora conectar nossa Table ao alias que desejamos


acessar ou ao componente Database que aponta para esse alias. Como
nosso componente Database est no nosso FormPrincipal, devemos
permitir que este Form possa visualizar o outro. Para isso v at
o menu File | Use Unit (ou pressione Alt+F11) e selecione a unit
que voc quer permitir visualizar dentro desta.

Selecione Principal (que a nica que temos alm da atual) e


clique em OK.

Agora configure o componente Table como segue:

Este componente ir acessar a tabela Clientes.db que pertence ao


Database DBPedidos, que por sua vez sabemos que aponta para o
alias Pedidos que criamos no incio.

OBS.: Verificar a funo do DataSource na hora da ligao.

D um clique duplo no componente Table de seu Form. Ser exibido o


Fields Editor. Pressione Ctrl+F e sero adicionadas definies de
campo para cada um dos campos da tabela. Voc tambm pode fazer
isso clicando com o boto da direita do mouse sobre o Fields
Editor e selecionando a opo Add all fields no menu de contexto
do mesmo.
Seu ambiente de trabalho deve estar apresentando algo assim:

Lista dos campos da Table Clientes.


No Object Inspector pode alterar a
propriedade de cada campo.

Para alterar as propriedades de cada campo, Clique no primeiro


campo da lista, selecionando-o. V ao Object Inspector e defina a
propriedade DisplayName para Cdigo (o DisplayName servir para
preencher a propriedade Caption dos respectivos Labels que sero
inseridos).

Faa o mesmo com os campos seguintes, alterando por exemplo:

RazaoSocial para Razo Social;


CNPJ_CPF para CNPJ/CPF;
Insc_RG para Insc.Estadual/RG e assim por diante.

Agora volte ao primeiro campo da lista, segure a tecla Shift e utilizando


a seta para baixo selecione at Fantasia. Agora arraste os campos
selecionados para o Form, na rea definida pelo ScrollDados.

Voc deve obter algo assim:


Observe que os campos selecionados ao serem arrastados inseriram
um Label com o Texto definido na propriedade DisplayLabel do mesmo
e um objeto DBEdit, responsvel por permitir a edio de dados, j
configurado para acessar este campo. Tambm foi inserido um
componente DataSource.

O componente DataSource responsvel por interligar os dados


acessados pelo componente Table com os componentes de exibio de
dados (da guia Data Controls).

Como o componente DataSource tambm invisvel mova-o para uma


rea livre, como ao lado do componente Table e altere sua
propriedade Name, no Object Inspector, para DataSourceClientes (ou
DSClientes se preferir um nome mais curto).

Para o campo Tipo, usaremos um outro tipo de controle, ento


iremos inseri-lo manualmente. V at a guia Data Controls,
selecione o componente DBRadioGroup e coloque-o no Form.

Componente DBRadioGroup

Defina as seguintes propriedades:

As propriedades Items e Values definem respectivamente os textos


que sero exibidos no objeto DBRadioGroup e quais os valores sero
gravados na tabela. Estas propriedades possuem um editor (boto
com reticncias), para defini-las clique no boto e informe os
textos um em cada linha, como no exemplo abaixo:
Clique em OK para voltar ao Object Inspector novamente. E defina a
propriedade Values da mesma forma.

Tambm seria prudente voc salvar seu Form a esta altura, para
evitar o risco de perder tudo o que j fez no caso de uma queda de
energia ou um esbarro no estabilizador (o que no muito
incomum). Salve esta Unit como Clientes.pas.

Abra o Fields Editor novamente, com um clique duplo no componente


Table.

Selecione agora os campos CGC_CPF e Insc_RG e arraste-os para o


Form. Faa o mesmo com os outros at checar ao campo Obs, pois
neste campo tambm utilizaremos outro componente.

Para redimensionar o Form, altere os valores nas propriedades


Height e Width do Form ou ento modific-lo com o mouse, como
faria com qualquer outra janela ou ainda utiliz-lo maximizado
caso prefira.

Agora, Insira um Label (guia Standard) e defina seu Caption como


Observao. Abaixo do Label insira um componente DBRichEdit (13
componente da guia Data Controls) definindo suas propriedades
para:
Volte ao Fields Editor e insira o campo Cadastro.

O ltimo campo, Ativo ns tambm definiremos manualmente, ser um


componente DBCheckBox (9 da guia Data Controls). Insira-o no Form
e defina suas propriedades para:

Agora volte aos componentes que foram inseridos automaticamente


(arrastados do Fields Editor para o Form) e defina as propriedades
Name dos mesmos para algo mais significativo. Sugerimos que
utilize DBEdit (nome da classe) como prefixo e adicione no lugar
dos nmeros o nome do campo, como fizemos abaixo:

Para redefinir a tabulao dos os componentes da aba DataControl


em seu Form clique com o boto da direita no ScrollDados em uma
rea vazia (sem DataControls) e selecione a opo Tab Order no
menu de contexto.

Ser exibida a caixa de dilogo Edit Tab Order, que lhe permitir
ordenar os objetos na sequncia correta.
Para podermos navegar e modificar os dados vamos inserir o
componente DBNavigator. Selecione-o na guia Data Controls (o 2 da
guia) e insira-o no PanelBotoes (que ns alinhamos na parte
inferior do formulrio) e defina suas propriedades como segue:

A propriedade Flat define que os botes tero aparncia plana,


assumindo a forma de boto apenas quando o mouse passa sobre eles.

A propriedade Hints define as dicas que sero exibidas para cada


um dos botes que fazem parte do DBNavigator. Para que estas dicas
seja exibidas voc deve definia, no Object Inspector, a
propriedade ShowHint no Form para True.

Insira um boto do tipo BitBtn, que se encontra na guia Additional


(1 da guia). Insira-o tambm no PanelBotoes, no canto Direito e
defina as propriedade assim:

Salve novamente seu Formulrio e vamos adicionar a codificao


mnima e coloc-lo para funcionar.

No Object Inspector selecione o Formulrio (FormClientes) utilize


o combo, no topo do mesmo, ou ento clique em um objeto qualquer
do Form e v teclando Esc continuamente, at que o Object
Inspector exiba no seu combo FormClientes: TFormClientes. (Essa
dica uma maneira rpida de acessar um objeto que est sobreposto
por outro, como o caso do Form).

V para a guia Events do Object Inspector e localize o evento OnCreate.


D um duplo clique na caixa em frente ao evento. Isso abrir o editor de
cdigo para voc.
Digite o seguinte:

TableClientes.Open; // abre a tabela de dados

O seu editor de cdigo deve estar assim:

Localize agora o evento OnDestroy, no Object Inspector, d um


duplo clique novamente para abrir o editor de cdigo e insira a
linha abaixo:

TableClientes.Close; // fecha a tabela de dados

No editor de cdigo dever estar assim:

Devemos agora fazer a ligao deste com o menu do FormPrincipal.

Volte ao FormPrincipal, isso pode ser feito clicando-se na guia


com o nome Principal no editor de cdigo ou ainda atravs do boto
View Forms do SpeedBar (neste caso voc deve selecionar
FormPrincipal na lista e clicar em OK).

Selecione no seu FormPrincipal o menu Cadastros | Clientes |


Cadastro. Isso abrir o editor de cdigo na opo de menu
selecionada.
Para chamarmos o FormClientes devemos digitar o seguinte cdigo:

FormClientes.Show; //exibe o formulrio

Tambm precisamos informar que vamos utilizar o FormClientes


dentro do FormPrincipal, para isso v ao menu File | Use Unit. E
selecione Clientes na lista de Units.

Salve o Projeto e execute-o, pressionando F9.

Voc deve notar que ao executar seu aplicativo, o formulrio do


Cadastro de Clientes j aparece aberto. Isso se deve ao fato de
que todo formulrio filho exibido no momento em que criado e o
Delphi, por padro, cria todos os formulrios no inicio (quando
executado). Assim se tivssemos 50 formulrios filhos todos eles
seriam exibidos ao mesmo tempo. Note tambm que se voc tentar
fechar o formulrio ele ser minimizado. Este tambm um
comportamento padro para formulrios filhos.

Para modific-los, encerre a execuo do programa e volte ao


Delphi. No menu do Delphi escolha, no menu do Delphi 7, a opo
Project | Options ou tecle Ctrl + Shift + F11.

Abrir a janela Project Options abaixo.

Mova o FormClientes da Lista de Auto-create forms para a lista de


Available forms, deixando-o como na figura anterior. Clique em OK
e o problema do Form aparecer sem clicar no menu estar terminado.
Devemos adicionar na opo de menu que chama o FormClientes mais
uma linha de cdigo, pois agora nossa a responsabilidade de
criar o formulrio.

O seu cdigo deve ficar assim:

procedure TformPrincipal.mnuCadCliClick(Sender: Tobject);


begin
Application.CreateForm(TFormClientes,FormClientes); // cria o form
FormClientes.Show; //exibe o formulrio
end;

No FormClientes, devemos codificar um novo evento para eliminar o


problema das janelas minimizarem quando tentamos fech-las.
Localize o evento OnClose (do FormClienes), abra sua codificao
como foi feito anteriormente e acrescente o seguinte cdigo:

procedure TformClientes.FormClose(Sender: Tobject);


begin
Action := caFree; // remove o form da memria
end;

Este comando far com que o formulrio seja removido da memria


quando o fecharmos, resolvendo assim o problema.

Se voc executar o aplicativo, ver que os problemas anteriores


no existem mais. No entanto, caso voc acione o menu para abrir o
Cadastro de Clientes mais de uma vez, sem fechar a janela na
primeira vez, ver que uma nova cpia da janela ser criada.

Isso permite que se possa estar cadastrando um Cliente e antes de


terminar, abri-se uma nova janela para consultar um outro. Pode
ser um recurso interessante, mas tambm pode ser confuso para
usurios menos experientes. Assim, iremos limitar nosso aplicativo
a executar apenas uma cpia da mesma janela de cada vez.

Para isso, vamos adicionar mais uma linha no cdigo da opo de


menu do FormPrincipal que chama o FormClientes.

No editor de cdigo do FormPrincipal, o cdigo dever ficar assim:

procedure TformPrincipal.mnuCadCliClick(Sender: Tobject);


begin
if FormClientes = NIL then //cria o form se ele no foi criado ainda
Application.CreateForm(TFormClientes,FormClientes);
FormClientes.Show; //exibe o formulrio
end;

Clique na aba Clientes.pas, do editor de cdigo e insira outra linha de


cdigo no evento OnClose do FormClientes:

Action := caFree; // remove o form da memria


FormClientes := NIL; // informa que foi destrudo (no criado)

Com isso, nosso aplicativo j funciona corretamente.


Entendendo como acessamos os dados no Delphi

Para acessar e manipular as tabelas de bancos de dados, devemos


utilizar os componentes de acesso a bancos de dados, que esto
armazenados nas guias da Paleta de Componentes, de acordo com o
tipo de engine utilizado: BDE, dbGO (guia ADO), IBX (guia
Interbase) ou dbExpress.

No nosso caso, utilizamos o BDE, mas estes conceitos so vlidos


tambm para as outras engines de acesso. Os componentes destas
guias so responsveis apenas pelo acesso (leitura/gravao e
movimentao).

Para que os mesmos possam ser modificados e visualizados pelo


usurio, devemos utilizar os componentes da guia Data Controls.

Nesta guia encontramos componentes semelhantes aos da guia


Standard, porm criados especificamente para dar acesso aos dados.

Voc pode estar se perguntando, qual seria a vantagem de se


dividir tanto os mtodos de acesso e manuteno e usar toda essa
quantidade de componentes? E a resposta simples, flexibilidade.

Cada uma das guias de acesso possui mais de um tipo de componente


para acesso a dados, alguns que exploram melhor a capacidade de
acesso a tabelas desktop (como o caso do componente Table do
BDE) e outros voltados especificamente para o acesso cliente-
servidor (como o componente Query da mesma guia).

Separando-se os controles de edio (Data Controls) dos


componentes de acesso a dados (BDE, dbGO, IBX ou dbExpress) temos
um meio mais fcil de substituir a metodologia de acesso sem
contudo afetar a interface visual j construda anteriormente.

Como os componentes de acesso so diferentes (embora possuam


propriedades e mtodos comuns) para que no fossem necessrios
Data Controls especficos para cada um, a Borland criou um outro
componente, que responsvel por fazer a ligao entre os
componentes de exibio e os componentes de acesso.

Estamos falando do componente DataSource, que se encontra na guia


Data Access.

Este componente se liga aos componentes de acesso a dados atravs


da propriedade DataSet. E os Data Controls se conectam a ele
atravs de uma propriedade tambm chamada DataSource.

Assim, se desejarmos trocar os componentes de acesso, simplesmente


os inserimos no Form (ou DataModule) e apontamos os DataSources
para os novos componentes de acesso, sem precisar modificar nada
nos Data Controls.

Você também pode gostar