Escolar Documentos
Profissional Documentos
Cultura Documentos
ao
om Delphi 7
Prof. Mar
elo C. Mussel
5 de agosto de 2012
Apostila Delphi 7
Sumrio
1 Introduo
2 Organizando a apli ao
3 Ban o de Dados
3.1
3.2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
DataModule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Conexo
om o SGBD . . . . . . . . . . . . . . . . . . . . . . . .
Criando a interfa
e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inserindo os
omponentes para edio dos dados . . . . . . . . . . . . . .
Codi
ando o boto Sair . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ajustando a ini
ializao da apli
ao . . . . . . . . . . . . . . . . . . .
Trabalhando
om ClientDataSet . . . . . . . . . . . . . . . . . . . . . . .
Controlando os botes . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tela Cadastro de CDs . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Trabalhando
om
ampos autoin
rement . . . . . . . . . . . . . . . . . .
Ajustando a ini
ilializao da apli
ao . . . . . . . . . . . . . . . . . . .
Clusula Try - Ex
ept - Finally . . . . . . . . . . . . . . . . . . . . . . .
4.11.1 Try - Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.11.2 Try - Ex
ept . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Codi
ando o Boto Novo para as abas Estilo, Artista e Msi
a . . . . .
4.12.1 Entendendo o
digo . . . . . . . . . . . . . . . . . . . . . . . . .
Codi
ando o Boto Salvar para as abas Estilo, Artista e Msi
a . . . .
4.13.1 Entendendo o
digo . . . . . . . . . . . . . . . . . . . . . . . . .
Ajustando o
omponente dbNavigator . . . . . . . . . . . . . . . . . . .
Implementando a funo de pesquisa tabela Musi
a . . . . . . . . . . .
4.15.1 Fun
o para formatao da exibio do
ampo
digo da msi
a
4.15.2 Realizando a
onsulta no BD . . . . . . . . . . . . . . . . . . . .
4.15.3 Evento On
li
k boto Pesquisa . . . . . . . . . . . . . . . . . . .
4.15.4 Entendendo o
digo . . . . . . . . . . . . . . . . . . . . . . . . .
Codi
ao do boto Novo CD . . . . . . . . . . . . . . . . . . . . . . .
4.16.1 Entendendo o
digo . . . . . . . . . . . . . . . . . . . . . . . . .
Boto Salvar CD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Prevenindo erros que podem o
orrer em tempo de exe
uo . . . . . . .
Implementando o boto editar . . . . . . . . . . . . . . . . . . . . . . . .
Implementando o boto ex
luir . . . . . . . . . . . . . . . . . . . . . . .
Implementando o boto
an
elar . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 A Apli
ao
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
5 Gerador de Relatrios
5.1
5.2
5.3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Fortes Report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Criando o Relatrio para a Tabela de Estilos . . . . . . . . . . . . . . . . . . . . . . .
Implementando o Boto Relatrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
4
5
6
7
10
10
10
13
16
19
19
19
20
21
23
23
23
24
24
25
25
25
26
28
28
28
29
31
31
31
32
33
33
34
36
38
39
39
40
41
Apostila Delphi 7
Introduo
Nos
aptulos a seguir,
riaremos uma apli
ao
om o objetivo de
atalogar Cds. Para desenvolver
nosso Sistema de Cadastro de Cds, utilizaremos o Delphi 7, SGBD Firebird e gerador de relatrios
Fortes Report.
Organizando a apli ao
Ban o de Dados
Apostila Delphi 7
Apostila Delphi 7
3.2.2
Criando as Tabelas
Para os
ampos
have primrias de
ada tabela, usaremos o re
urso auto-in
remento do SGBD.
Para isto sele
ione o
ampo AutoIn
na linha
orrespondente ao Cod_Estilo, e o IBExpert abrir
a tela para
riao do Generator e da trigger responsveis pelo in
remento automti
o de nossa
have primria. Figura: 5
Apostila Delphi 7
3.2.3
A utilizao das
haves estrangeiras, que nos permitem estabele
er o rela
ionamento entre as
tabelas do nosso BD.
O IBExpert fa
ilita nosso trabalho para a
riao destes rela
ionamentos. Para isto,
om a tabela
sele
ionada, a
essaremos a aba Constraints - Foreign Keys, Figura: 8
Apostila Delphi 7
3.2.4
S ript SQL
Caso prera exe
utar o s
ript, diretamente no Ibexpert, basta a
essar a opo Tools - S
ript Exe
utive e exe
ute o
digo abaixo.
/******************************************************************************/
/* Generated by IBExpert */
/******************************************************************************/
SET SQL DIALECT 3;
SET NAMES NONE;
SET CLIENTLIB 'C:\Program Files\Firebird\Firebird_2_1\bin\fb
lient.dll';
CREATE DATABASE 'C:\CadastroCDs\Ban
oDados\CadastroCDs.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET NONE;
/******************************************************************************/
/* Generators */
/******************************************************************************/
CREATE GENERATOR GEN_ARTISTA_ID;
SET GENERATOR GEN_ARTISTA_ID TO 0;
CREATE GENERATOR GEN_CD_ID;
SET GENERATOR GEN_CD_ID TO 0;
CREATE GENERATOR GEN_ESTILO_ID;
SET GENERATOR GEN_ESTILO_ID TO 0;
CREATE GENERATOR GEN_MUSICA_ID;
SET GENERATOR GEN_MUSICA_ID TO 0;
Apostila Delphi 7
/******************************************************************************/
/* Tables */
/******************************************************************************/
CREATE TABLE ARTISTA (
COD_ARTISTA INTEGER NOT NULL,
NOME_ARTISTA VARCHAR(100) NOT NULL
);
CREATE TABLE CD (
COD_CD INTEGER NOT NULL,
TITULO VARCHAR(100) NOT NULL,
COD_ESTILO INTEGER NOT NULL,
COD_ARTISTA INTEGER NOT NULL
);
CREATE TABLE CD_MUSICA (
COD_CD INTEGER NOT NULL,
COD_MUSICA INTEGER NOT NULL
);
CREATE TABLE ESTILO (
COD_ESTILO INTEGER NOT NULL,
DESC_ESTILO VARCHAR(50) NOT NULL
);
CREATE TABLE MUSICA (
COD_MUSICA INTEGER NOT NULL,
NOME_MUSICA VARCHAR(100) NOT NULL
);
/******************************************************************************/
/* Primary Keys */
/******************************************************************************/
ALTER TABLE ARTISTA ADD CONSTRAINT PK_ARTISTA PRIMARY KEY (COD_ARTISTA);
ALTER TABLE CD ADD CONSTRAINT PK_CD PRIMARY KEY (COD_CD);
ALTER TABLE ESTILO ADD CONSTRAINT PK_ESTILO PRIMARY KEY (COD_ESTILO);
ALTER TABLE MUSICA ADD CONSTRAINT PK_MUSICA PRIMARY KEY (COD_MUSICA);
/******************************************************************************/
/* Foreign Keys */
/******************************************************************************/
ALTER TABLE CD ADD CONSTRAINT FK_CD_1 FOREIGN KEY (COD_ESTILO) REFERENCES ESTILO (COD_ESTILO);
ALTER TABLE CD ADD CONSTRAINT FK_CD_2 FOREIGN KEY (COD_ARTISTA) REFERENCES ARTISTA (COD_ARTISTA);
ALTER TABLE CD_MUSICA ADD CONSTRAINT FK_CD_MUSICA_1 FOREIGN KEY (COD_CD)
Apostila Delphi 7
REFERENCES CD (COD_CD);
ALTER TABLE CD_MUSICA ADD CONSTRAINT FK_CD_MUSICA_2 FOREIGN KEY (COD_MUSICA)
REFERENCES MUSICA (COD_MUSICA);
/******************************************************************************/
/* Triggers */
/******************************************************************************/
SET TERM ;
/******************************************************************************/
/* Triggers for tables */
/******************************************************************************/
/* Trigger: ARTISTA_BI */
CREATE TRIGGER ARTISTA_BI FOR ARTISTA
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.
od_artista is null) then
new.
od_artista = gen_id(gen_artista_id,1);
end
/* Trigger: CD_BI */
CREATE TRIGGER CD_BI FOR CD
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.
od_
d is null) then
new.
od_
d = gen_id(gen_
d_id,1);
end
/* Trigger: ESTILO_BI */
CREATE TRIGGER ESTILO_BI FOR ESTILO
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.
od_estilo is null) then
new.
od_estilo = gen_id(gen_estilo_id,1);
end
/* Trigger: MUSICA_BI */
CREATE TRIGGER MUSICA_BI FOR MUSICA
ACTIVE BEFORE INSERT POSITION 0
as
begin
Apostila Delphi 7
10
A Apli
ao
Ini
ie o Delphi, e
om uma nova apli
ao em tela vamos salvar nosso projeto.
Salve o projeto e a primeira unit na pasta
riada:
:\CadastroCDS\Programa
om os nomes Uprin
ipal.pas e CadastroCds.dpr.
Para fazermos nossa apli
ao ter a
esso ban
o de dados, o Delphi possui um objeto
hamado
DataModule.
4.1 DataModule
O que um DataModule?
Os objetos do tipo DataModule servem
omo um repositrio para o armazenamento de
omponentes no-visuais de a
esso a ban
os de dados, permitindo que estes sejam a
essados pelos formulrios
da apli
ao,
entralizando o a
esso a dados.
7.
Para
riar um Data Module, vo
deve sele
ionar o item New/Data Module do menu File do Delphi
Altere a propriedade Name deste DataModule para dmPrin
ipal.
Sele
ione o item Save as, do menu File, e salve a unidade de
digo asso
iada a este DataModule
om o nome UdmPrin
ipal.pas.
4.1.1
Conexo om o SGBD
no
Na aba DBExpress insira um
omponente SQLConne
tion
DataModule. Altere sua propriedade name para Conexao.
D um duplo-
lique no
omponente, e na tela que se abrir ajuste as propriedades
onforme a gura:
9
Em Conne
tion Name sele
ione a opo IBConne
tion, em Database informe o
aminho
ompleto do
nosso BD CadastroCds.fdb. Clique OK para
onrmar.
Pre
isamos ajustar outras duas propriedades do nosso objeto SQLConne
tion:
Mude a propriedade LoginPrompt para false e VendorLib para fb
lient.dll.
Apostila Delphi 7
11
Apostila Delphi 7
12
Sua Funo prin
ipal de prover os dados ao ClientDataSet, (Componente que iremos utilizar em
seguida!!) e tambm apli
ar as atualizaes no servidor de ban
o de dados.
No modelo Cliente/Servidor, ele estar no mesmo lo
al (apli
ao) que o ClientDataSet, j no modelo
multi
amadas, poderia estar em outra apli
ao (juntamente
om seu DataSet), em um servidor ex
lusivo, no qual faramos o a
esso remotamente.
Vamos alterar sua propriedade name para prvMusi
a, e a propriedade DataSet para qryMusi
a.
Para podermos a
essar os
ampos da tabela Musi
a, iremos inserir um
omponente ClientDataSet,
tambm lo
alizado na aba DataA
ess.
Ajustaremos sua propriedade name para
dsMusi
a e a propriedade ProviderName para prvMusi
a.
D um duplo-
lique no
omponente ClientDataSet, e na janela que se abre,
lique
om o boto
direito do mouse e es
olha a opo ?add all elds?. Pronto, J temos a
onexo tabela Musi
a
preparada.
Siga os passos detalhados a
ima, e
ongure a
onexo s demais tabelas do nosso Cadastro de CDs.
Apostila Delphi 7
13
Apostila Delphi 7
14
nbFirst - True;
nbPrior - True;
nbNext - True;
nbLast - True;
nbInsert - False;
nbDelete - False;
nbEdit - False;
nbPost - False;
nbCan
el - False;
nbRefresh - False;
Height - 41
Width - 224
Left - 22
Top - 15
Ainda sobre o pnlBotoes , insira 07 (sete)
omponentes bitbtn (aba additional) e ajustes as propriedades:
BitBtn1:
Name - btnNovo
Caption - &Novo
Heigth - 41
Width - 75
Left - 246
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\FILENEW.bmp
BitBtn2:
Name - btnEditar
Caption - E&ditar
Heigth - 41
Width - 75
Left - 324
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\EDIT.bmp
BitBtn3:
Name - btnEx
luir
Caption - E&x
luir
Heigth - 41
Width - 75
Left - 402
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\TRASH.bmp
Apostila Delphi 7
15
BitBtn4:
Name - btnSalvar
Caption - &Salvar
Heigth - 41
Width - 75
Left - 479
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\FLOPPY.bmp
BitBtn5:
Name - btnCan
elar
Caption - Can
e&lar
Heigth - 41
Width - 75
Left - 556
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\RETRY.bmp
BitBtn6:
Name - btnRelatorio
Caption - Rela&torio
Heigth - 41
Width - 75
Left - 634
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\REPORT.bmp
BitBtn7:
Name - btnSair
Caption - Sai&r
Heigth - 41
Width - 75
Left - 711
Top - 15
Glyph - C:\Arquivos de programas\Arquivos
omuns\Borland Shared\Images\Buttons\DOOROPEN.bmp
Neste momento sua tela deve se pare
er
om a gura 12:
Apostila Delphi 7
16
Apostila Delphi 7
17
Com a TabSheet tsEstilo sele
ionada, insira dois
omponentes DBEdit (Aba: DataControls)
e dois Labels (Aba: Standart)
e ajuste as propriedades
omo segue:
label1:
Name: LBLCodigo
Caption: Cdigo:
label2:
Name: LBLDes
ri
ao
Caption: Des
rio:
DBEdit1:
Name: DbCodEstilo
DataSour
e: dsEstilo
DataField: COD_ESTILO
DBEdit2:
Name: DbDes
Estilo
DataSour
e: dsEstilo
DataField: DESC_ESTILO
Repita o pro
edimento para as TabSheets tsArtista e tsMusi
a, fazendo as ligaes
om seus respe
tivos DataSour
es.
Apostila Delphi 7
18
Apostila Delphi 7
19
Repare no lado esquerdo desta tela que o Delphi mostra uma
aixa intitulada Auto-Create Forms,
e provavelmente dever estar mostrando o frmPrin
ipal na primeira linha e o dmPrin
ipal na segunda.
Isto signi
a que o Formulrio ser
riado antes do Data Module, o que poder provo
ar um erro em
tempo de exe
uo.
Clique em dmPrin
ipal e arraste para
ima, deixando-o na primeira linha, e
lique OK.
Apostila Delphi 7
20
Feito isto, iremos de
larar as variveis para manipulao dos ClientDataSets, na seo Publi
:
Figura 17: Variveis TClientDataSet
Sele ione o Form - frmPrin ipal, no Obje t Inspe tor, na aba Events - D lique duplo em On-
Create .
Apostila Delphi 7
21
O que zemos neste tre
ho de
digo foi utilizar o operador ?not? - negao, que inverte o valor
da propriedade ou varivel o qual atribuido.
Desta forma poderemos utilizar este pro
edimento em todos os botes, pois ao ini
iar o sistema,
quando todos os botes estiverem habilitados, quando o usurio
li
ar nos botes Novo, Editar ou
Ex
luir, estaremos desabilitando os botes. Ao
li
ar sobre os botes Salvar ou Can
elar, faremos
novamente a
hamada a este pro
edimento, que far o pro
edimento inverso, habilitando os botes.
Apostila Delphi 7
22
Apostila Delphi 7
23
MultiSele
t = True
obje
t TBitBtn - Aba Additional
Name = btnConrma
Caption = 'Conrma'
Sua tela dever ter a seguinte aparn
ia:
Apostila Delphi 7
24
Ex
ept ou Finally. Try pode ser usado em inmeros tre
hos do
digo, podendo at ser aninhado.
A
lusula Ex
ept usada para ini
iar um blo
o
aso uma ex
eo o
orra em Try. Se o blo
o que
estiver em Ex
ept
onter a ex
eo o programa no ser terminado.
A
lusula Finally usada para ini
iar um blo
o havendo problemas ou no
om a
lusula Try.
4.11.1
Try - Finally
Nos tre
hos de
digo Try - Finally, a
lusula Finally garante que todo o
digo
ontido em Finally ser exe
utado independente ou no de problemas no
digo exe
utado dentro da
lusula Try.
Em Try - Finally, Finally geralmente usado para permitir limpeza de re
ursos alo
ados anteriormente.
4.11.2
Try - Ex ept
Nos tre
hos de
digo Try - Ex
ept, somente se a
lusula Try gerar uma ex
eo que a
lusula
Ex
ept ser exe
utada. Ex
ept usado para realizar ao alternativa quando algo inesperado o
orrer
em Try. A
lusula Ex
ept por si s, no pode determinar o tipo de erro en
ontrado.
Apostila Delphi 7
25
4.12 Codi
ando o Boto Novo para as abas Estilo, Artista e Msi
a
Com Duplo
lique no boto novo, faremos a seguinte implementao:
4.12.1
Entendendo o digo
4.13 Codi
ando o Boto Salvar para as abas Estilo, Artista e Msi
a
Com Duplo
lique no boto salvar, faremos a seguinte implementao:
Apostila Delphi 7
26
4.13.1
Entendendo o digo
Apostila Delphi 7
27
Apostila Delphi 7
28
4.15.1
Apostila Delphi 7
4.15.2
Realizando a onsulta no BD
Tquery:
Name: qryBus
aMusi
as
SQLConne
tion: Conexao
SQL: sele
t * from musi
a
TdataSetProvider:
Name: prvBus
aMusi
a
DataSet: qryBus
aMusi
as
T
lientDataSet:
29
Apostila Delphi 7
30
Complemente o evento OnCreate do nosso Form Prin ipal, fazendo s atribuies todos os DataSets Criados:
Apostila Delphi 7
4.15.3
31
4.15.4
Entendendo o digo
Apostila Delphi 7
32
4.16.1
Entendendo o digo
O lao for ir per
orrer o listBox (lstMusi
as), testando se a linha em questo est sele
ionada,
aso armativo, gravamos o
digo da Msi
a no array.
Musi
asSele
ionadas[Tamanho:=StrToInt(
opy(lstMusi
as.Items[i, 5, 1));
O array Musi
asSele
ionadas, na posio tamanho re
ebe as
in
o primeiras posies do
ontedo
do listBox.
Apostila Delphi 7
33
Apostila Delphi 7
34
Em nosso DataModule, sele ione o omponente prvMusi a e na events de lique duplo em OnGetTable Name:
Apostila Delphi 7
35
Apostila Delphi 7
36
Apostila Delphi 7
37
Apostila Delphi 7
38
Apostila Delphi 7
39
Gerador de Relatrios
Apostila Delphi 7
40
In
lua um
omponente TdataSour
e da aba DataA
ess. Ser o responsvel pela ligao
om os
ampos que desejarmos imprimir. Ajuste sua proriedade name para dsRelEstilo e a propriedade DataSour
e para dmPrin
ipal.
dsEstilo.
No Obje
t Inspe
tor sele
ione o
omponente RLReport e altere sua propriedade DataSet para dsEstilo.
Esse relatrio ser dividido nas seguintes bandas : Cabealho do Relatrio , Cabealho de Colunas do Detalhe e Detalhe.
Insira o
omponente RLBand ( o 2 na aba Fortes Report), e ajuste as seguintes propriedades:
name: bndCabe
alho
BandType: btHeader
Insira, dentro de bndCabe
alho, um
omponente RLLabel, e ajuste as seguintes propriedades:
Caption: Relatrio de Estilos
Font: Size: 16
Font: Style: fsBold: true
At o momento, nossa tela de
riao do relatrio deve se pare
er
om essa:
Apostila Delphi 7
Info: itFullDate
Insira outro
omponente RLBand e ajuste as seguintes propriedades:
name: bndCabe
alhoDetalhe
BandType: btColumnHeader
Nesta banda insira dois
omponentes RLLabel e ajuste as seguintes propriedades:
1) Caption: Cdigo Left: 10 Top: 10;
2) Caption: Des
rio Left: 114 Top: 10;
Insira outro
omponente RLBand e ajuste as seguintes propriedades:
name: bndDetalhe
BandType: btDetail
Nesta banda Detalhe, insira dois
omponentes RLDBText e ajuste as seguintes propriedades:
1) Name: dbCodigo Left: 10 Top: 10;
2) Name: dbDes
ri
ao Left: 114 Top: 10;
Sele
ione o Formulrio frmRelatorioEstilos - e d um duplo
lique no evento OnCreate:
Em nosso Formulrio prin
ipal, sele
ione o menu le - Use Unit, e
onrme a unit relEstilos.
Aps isso d duplo
lique no boto Relatrios e insira o tre
ho de
digo:
41