Vous êtes sur la page 1sur 94

Sumrio

DELPHI 4.0 - AVANADO________________________ 3


BANCO DE DADOS _____________________________ 4
COMPONENTES DE ACESSO A BANCO DE DADOS __________ 4
COMPONENTES DE VISUALIZAO DE DADOS _____________ 5
EXEMPLO: SISTEMA DE VENDA _______________________ 6
DBEdit - DBText ______________________________________11
BDGrid _____________________________________________ 13
DBNavigator _________________________________________ 13
Edio de Campos _____________________________________ 15
SQL (STRUCTURED QUERY LANGUAGE) ______ 21
Exemplo para Pesquisa ________________________________ 22
Sistema de Vendas com Pesquisa _________________________ 28
RELATRIOS ___________________________________ 37
Construo do Relatrio _______________________________ 39
Valores Calculados ____________________________________ 43
AMBIENTE CLIENTE / SERVIDOR _____________ 46
EXEMPLO _____________________________________ 50
Construindo o Banco de Dados __________________________ 52
Construindo o Aplicativo _______________________________ 59
CRIAO DE COMPONENTES ________________ 70
OBJETO TSOBREBTN ____________________________ 70
Construo do boto SobreBtn __________________________ 70
Teste do Boto SobreBtn _______________________________ 77
OBJETO TCALC ________________________________ 77
Construo do TCalc __________________________________ 77
Teste do TCalc ________________________________________ 81
COMPONENTES ACTIVEX __________________________ 82
Componente SobreBtnX________________________________ 82
FORMULRIO ACTIVEX ___________________________ 87
LISTA DE EXERCCIO_________________________ 92
Pgina: 3
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
DELPHI 4.0 - AVANADO
Neste curso iremos trabalhar com controles de banco de dados, linguagem SQL
(Structure Query Language), construo de objetos nativos, objetos ActiveX e
construo de pginas WEB. Indo um pouco mais a fundo na linguagem Delphi.
Os controles de manipulao de banco de dados incorporados ao Delphi, permi-
tem a construo de aplicativos que utilizam banco de dados, de uma maneira
bem rpida - quase sem o uso de linhas de cdigo. Alterando apenas algumas
propriedades destes controles, podemos construir aplicativos simples, como ve-
remos mais adiante.
A linguagem SQL foi desenvolvida para efetuarmos pesquisas em banco de da-
dos relacionais. uma linguagem de alto nvel onde, o que queremos extrair do
BD, informado ao gerenciador de banco de dados como se falssemos com um
chefe de arquivos.
O Delphi uma linguagem orientada a objetos, onde podemos criar nossos pr-
prios controles e objetos a partir de outros objetos preexistentes na biblioteca do
Delphi, ou criados anteriormente por ns mesmos. Criando controles personali-
zados, o programador otimiza a construo de aplicativos, economizando na cons-
truo de rotinas repetitivas.
A tecnologia ActiveX foi criada para permitir o uso de um componente criado em
uma determinada linguagem em qualquer outro ambiente de processamento com-
patvel com esta tecnologia. Permitindo o uso destes componentes na criao de
pginas da WEB ou em outros ambientes de desenvolvimento.
Pgina: 4
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
BANCO DE DADOS
COMPONENTES DE ACESSO A BANCO DE DADOS
Os componentes mais utilizados so o TDatabase, TTable, TQuery e TDataSource.
Todos eles permitem uma conexo do aplicativo com o BD, servindo de interface.
O TDatabase utilizado quando se utiliza um banco de dados remoto em um
servidor, e se quer ter uma conexo permanente entre o aplicativo e este servi-
dor. Em alguns momentos do aplicativo as tabelas so abertas ou fechadas, caso
o TDatabase no seja utilizado para manter constante a conexo com o servidor,
a abertura de tabelas pode consumir um certo tempo para realizar-se.
O TTable simboliza uma tabela no BD, proporcionando uma conexo entre o
formulrio e o BD. Atravs deste componente visualizamos os registros de uma
tabela utilizando um ndice, podendo ou no limitar os registros em subconjuntos.
O componente TQuery permite a utilizao da linguagem SQL para pesquisarmos
registros em uma ou vrias tabelas relacionadas, ele possui vrios mtodos e
propriedades semelhantes ao TTable.
O TDataSource faz a ligao entre os controles vistos anteriormente e os contro-
les de visualizao de dados do formulrio.
A figura abaixo mostra esquematicamente as ligaes entre o BD e os controles
no formulrio.
Pgina: 5
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
COMPONENTES DE VISUALIZAO DE DADOS
Estes componentes so semelhantes aos apresentados na paleta standard da
barra de ferramentas, e possuem propriedades que os ligam campos, tabelas ou
consultas em um banco de dados.
Os mais comuns so: DBGrid, DBText, DBEdit, DBMemo, DBLookupList,
DBLookupCombo e DBNavigator.
Os DBLookupList e DBLookupCombo, so quadros de lista onde os itens apre-
sentados na lista pertencem a um determinado campo de uma tabela, mas o item
selecionado neles ser atribudo a um campo de outra tabela.
O DBNavigator um conjunto de botes que permitem a navegao entre regis-
tros de uma tabela ou pesquisa.
Pgina: 6
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Com o controle DBNavigator podemos trabalhar em uma tabela sem a necessi-
dade de construo de nenhuma linha de cdigo, ou ento podemos oper-lo
atravs de botes colocados no formulrio chamando o mtodo BtnClick.
EXEMPLO: SISTEMA DE VENDA
Este exemplo utiliza as tabelas Customer.db, Orders.db, Items.db e Parts.db
fornecidas junto com o Delphi, que esto na pasta ...\Arquivos comuns\Borland
Shared\Data. Ns desenvolveremos um programa simples para a rotina de ven-
das, com pesquisas e relatrios.
Utilizaremos apenas alguns campos destas tabelas para o desenvolvimento deste
aplicativo. A figura a seguir mostra as tabelas e seus relacionamentos.
Pgina: 7
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Comece a construo do formulrio inserindo um PageControl e defina a pro-
priedade Align:=alClient. Depois clique com o boto direito do mouse e esco-
lha New Page para adicionar uma pgina.
Altere o Caption para Clientes, insira mais uma pgina para Vendas. Continue
a construo, at o formulrio se parecer com as figuras a seguir.
Pgina: 8
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Os controles de acesso ao BD podem ser colocados diretamente no formulrio
que os utiliza, mas quando queremos que outro formulrio acesse os mesmos
controles, o programa comea a complicar-se. Esta complicao minimizada
com a incluso no projeto de um formulrio do tipo Data Module. No menu
File|New, escolha um Data Module, este formulrio ir conter todos os contro-
les de banco de dados que podero se acessados por todas as outras Units do
projeto.
Pgina: 9
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
D a este formulrio o nome de FrmControles e coloque os controles para
acessar o BD, definindo os Names de acordo com a figura.
Pgina: 10
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Os componentes TTable ligam-se com o BD atravs das propriedades
DatabaseName e TableName. A propriedade DatabaseName define o caminho
do diretrio que contm os arquivos das tabelas ou um Alias do BD. Ns utiliza-
remos o Banco de dados DBDEMOS como valor da propriedade DatabaseName
de todos os TTable. Selecione, ao mesmo tempo, todos os componentes TTable
para alterar a propriedade DatabasName de uma s vez para todos.
Criamos um novo Alias, utilizando a opo Tools | Alias Manager do programa
Database Desktop que acompanha o Delphi4. A tabela a seguir mostra os valo-
res da propriedade TableName dos controles TTable.
Name TableName
TblClientes Customer.db
TblVendas Orders.db
TblItens Items.db
TblProdutos Parts.db
O controle DataSouce realiza uma ligao entre o TTable e os controles de exi-
bio, portanto, deveremos indicar na propriedade DataSet qual a tabela que
estar ligada ao DataSource. A tabela seguinte mostra a definio das proprie-
dades.
Pgina: 11
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Name DataSet
SrcClientes TblClientes
SrcVendas TblVendas
SrcItens TblItens
SrcProdutos TblProdutos
Salve o projeto como ProcVendas.dpr e as unidades como Venda.pas e
Controle.pas.
Volte ao formulrio principal, e no menu escolha File | Use Unit..., selecionando
ento a unidade Controle, para que o formulrio principal possa usar os controles
de acesso ao BD do Data Module. Este procedimento inclui o Data Module
Controles na seo uses da implementao da unidade Venda.
Agora que temos os controles de acesso a banco de dados configurados, podere-
mos alterar as propriedades dos controles de exibio.
DBEdit - DBText
O DBEdit um controle que exibe o valor de um campo do registro corrente de
uma tabela. As propriedades que realizam esta ligao so: DataSource e
DataField. DataSource informa qual TDataSource estar conectado ao DBEdit,
e DataField contm o nome do campo que ser exibido. A diferena entre o
DBEdit e DBText, que o DBText no permite alterao em seu contedo, ou
seja, um controle apenas de exibio. Altere as propriedades destes compo-
nentes de acordo com as tabelas Customer.db e Orders.db. Os Names so
mostrados nas figuras a seguir.
Pgina: 12
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Pgina: 13
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
BDGrid
Este controle exibe os registros de uma tabela ou consulta, permitindo a visualizao
de vrios campos ao mesmo tempo, em uma forma tabular. Ele ligado a uma
tabela atravs da propriedade DataSource, que dever conter o nome do com-
ponente TDataSource ligado tabela que desejamos visualizar. Defina a propri-
edade DataSource:=FrmControles.SrcItens, para o DBGrid da pgina Ven-
das.
Este DBGrid ir exibir os itens que compem a venda selecionada.
DBNavigator
Com o DBNavigator poderemos navegar entre os registros das tabelas de clien-
tes e vendas, alterando ou editando o contedo destas tabelas. Para conectar o
DBNavigator a uma tabela, utilize a propriedade DataSource ligando-o a um
TDataSource, em nosso projeto defina
DataSource:=FrmControles.SrcClientes e
DataSource:=FrmControles.SrcVendas para estes controles das pginas Cli-
entes e Vendas respectivamente.
A propriedade VisibleButtons do
DBNavigator permite a escolha de quais bo-
tes sero exibidos ao usurio. Na pgina
vendas, ser permitido ao usurio apenas
mover-se e adicionar um outro registro de
venda, para esconder os outros botes do
DBNavigator de vendas, d um duplo clique
na propriedade VisibleButtons e faa as
alteraes de acordo com a figura a seguir.
Pgina: 14
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Compile e execute o programa, observando que os DBEdit no possuem nenhu-
ma informao e os DBNavigator esto desabilitados. Isto ocorre porque os
componentes TTable esto desativados. Para ativ-los, pare a execuo do pro-
grama e defina a propriedade Active para True, ao fazer isto, o primeiro registro
de cada tabela ser mostrado nos controles de exibio sem no entanto estarem
disponveis para manipulao. Execute novamente o programa e teste as possi-
bilidades de edio e criao de registros.
Acabamos de construir um simples manipulador de BD sem nenhuma linha de
cdigo. Mas no muito operacional pois as tabelas ainda no esto relacionadas,
ou seja, quando selecionamos um cliente, gostaramos que somente as vendas
efetuadas para ele fossem exibidas na pgina vendas, e os itens exibidos perten-
cessem a esta venda em particular.
Para criar vnculos um-para-muitos, devemos alterar as propriedades
MasterSource e MasterFields da tabela de detalhes, vinculando os ndices de
duas tabelas - detalhe e master.
Selecione o componente TblVendas e defina MasterSource:=SrcClientes.
D um clique na reticncias da propriedade MasterFields exibindo a caixa de
dilogo Field Link Designer.
Pgina: 15
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Procure um ndice comum s duas tabelas, selecione os campos corresponden-
tes, adicione e confirme o relacionamento.
Faa o mesmo para a tabela Itens, definindo-a como detalhe de Vendas, esco-
lhendo o campo OrderNo como ligao.
Edio de Campos
Quando configuramos um objeto TTable, o Delphi incorpora todos os campos da
tabela a este objeto, mas nem sempre ns queremos exibir todos os campos.
Vemos que no Grid da pgina de Vendas a coluna OrderNo est sendo redundan-
te pois apresenta em todas as linhas o mesmo valor, portanto poderemos otimizar
a apresentao, no exibindo esta coluna. O Delphi possui um editor de campos
(fields editor) para as tabelas, para acess-lo d um clique com o boto direito na
tabela que se deseja editar.
Pgina: 16
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
No nosso exemplo, vamos editar a tabela Itens.
No Fields Editor, pressione o boto direito do mouse novamente, para adicionar
os campos OrderNo, ItemNo, PartNo e Qty, da tabela Items.db.
Pgina: 17
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Note que o campo OrderNo deve ser inserido, pois ele pertence vinculao
entre tabelas. Para ele no ser mostrado no Grid, deveremos alterar a proprieda-
de Visible:=False deste campo, selecione o campo OrderNo no Fields Edi-
tor, e na Object Inspector faa a alterao.
Pgina: 18
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para limitar e/ou auxiliar o que os usurios iro digitar no DBEdit relativo a um
campo de tabela, ns configuramos a propriedade EditMask deste campo. Esta
propriedade cria uma mscara de entrada de dados formatando os dados que
sero inseridos na tabela.
Adicione apenas os campos da tabela Vendas usados neste programa, como foi
feito anteriormente com a tabela Items, e selecione o campo SaleDate e no
Object Inspector, clique na propriedade EditMask abrindo a caixa de dilogo
Input Mask Editor.
Quando escolhemos um formato preexistente, o Delphi preenche automatica-
mente o quadro Input Mask, mas esta configurao pode ser alterada de vrias
formas. Consulte no Delphi Help o item TCustomMaskEdit,EditMask onde so
descritos os caracteres de controle para a mscara.
A tabela Customer.db possui dois ndices - ByCustNo e ByCompany, que ser-
vem como ordenadores de exibio dos registros, para alterarmos a ordem de
exibio, deveremos mudar a propriedade IndexName desta tabela, e isto pode
ser feito durante a execuo do programa.
Pgina: 19
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Adicione dois botes de comando pgina Clientes - Por Nomes e Por Cdi-
go, e digite as seguintes linhas para o evento OnClick destes botes:
procedure TForm1.BtnPorNomeClick(Sender: TObject);
begin
FrmControles.TblClientes.IndexName:=ByCompany;
end;
procedure TForm1.BtnPorCodigoClick(Sender: TObject);
begin
FrmControles.TblClientes.IndexName:=;
end;
Para pesquisar os clientes, iremos construir outro formulrio com um componen-
te DBLookupListbox e um Boto de comando para fech-lo.
O DBLookupListbox, funciona semelhante a um quadro de lista com a diferena
de poder acessar os dados de uma tabela e incorpor-los em outra para determi-
nado campo. Controlamos este componente atravs das seguintes propriedades:
Propriedade Descrio
DataSource DataSource de destino dos dados
DataField Campo de trabalho
ListSource DataSource da tabela de consulta
ListField Campo que ser exibido na lista
KeyField Campo chave de ligao entre as tabelas
Adicione ao projeto um novo formulrio, colocando um TButton e um
DBLookupListbox. Inserindo tambm um boto para abrir este novo formulrio
na pgina clientes. Faa que este formulrio tambm tenha acesso aos controles
do FrmControles.
Pgina: 20
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Como o DBLookupListbox ir trabalhar somente com a tabela clientes, devere-
mos alterar apenas as seguintes propriedades:
KeyField:= CustNo
ListField:= Company
ListSource:= ControlesFrm.ClientesSrc
Aps estas alteraes, o quadro de lista estar exibindo os nomes das companhi-
as (clientes) na ordem do ndice ativo - por nome ou por cdigo. Quando o
usurio selecionar um cliente, automaticamente sero exibidos os seus dados na
pgina clientes.
Insira mais um formulrio no projeto, semelhante ao Seleo de Clientes, para
pesquisar produtos a serem vendidos e incorporados tabela Items.db. E tam-
bm um boto no formulrio Vendas para abrir esta procura.
O DBLookupListbox deste formulrio ir trabalhar com duas tabelas, uma para a
seleo do campo e outra para receber o campo selecionado. Altere as seguin-
tes propriedades:
DataField:= PartNo
DataSource:= ControlesFrm.ItensSrc
KeyField:= PartNo
ListField:= Description
ListSource:= ControlesFrm.ProdutosSrc
A figura a seguir mostra o formulrio Seleo de Produtos pronto:
Pgina: 21
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
SQL (STRUCTURED QUERY LANGUAGE)
A SQL ou Linguagem Estruturada de Pesquisa, uma linguagem universal para
a manipulao de informaes em banco de dados.
Os mtodos de acesso aos registros utilizados pelo componente TTable so bons
para pesquisas simples em registros, no sendo to bons para pesquisas compli-
cadas de tomada de decises. Para usarmos informaes em banco de dados de
uma forma mais eficiente, deveremos chamar os dados de maneiras diferentes,
combinar dados de vrias tabelas, aplicando restries e resumir grandes volu-
mes de dados em poucos nmeros significativos. O modo mais fcil de fazer isto
utilizando a SQL.
A SQL uma linguagem no procedural, ou seja, no possui procedimentos ou
funes para realizar tarefas. Neste tipo de linguagem ns informamos o que
queremos, e no como faz-lo.
No Delphi utilizamos a SQL atravs do componente TQuery, nele h uma propri-
edade onde determinada a linha de instruo SQL desejada.
Pgina: 22
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Exemplo para Pesquisa
Para entendermos melhor o funcionamento do TQuery e da SQL, vamos cons-
truir um simples programa para teste e pesquisa utilizando instrues SQL.
Inicie um novo projeto, colocando no formulrio um DBGrid um TQuery e um
TDataSource.
Defina as seguintes propriedades do TQuery:
DatabaseName := DBDemos
SQL := SELECT * FROM Customer.db
Active := True
Altere as propriedades dos outros controles determinando as ligaes entre eles,
ficando o formulrio conforme a figura a seguir.
Pgina: 23
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
A instruo SQL que iremos utilizar das mais simples, ela solicitar todos os
registros e campos da tabela Customer.db. Esta consulta de seleo extrai o
contedo da tabela e coloca-o no DBGrid, sempre que queremos realizar uma
instruo de seleo, usamos o verbo SELECT seguido de uma lista de campos.
A palavra FROM especifica quais ou qual tabela estes campos pertencem.
Altere a propriedade SQL do Query1 para: SELECT Company,City FROM
Customer.db, observe que apenas os campos Company e City so exibidos do
BDGrid.
Pgina: 24
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Uma instruo SQL possui as seguintes palavras chaves:
Instrues Select, UpDate, Insert, Delete
Funes agregadas SUM, AVG, MIN, MAX, COUNT
Clusulas From, Where, Order By, Group By, Having
Operadores +, -, *, /, =, <, >, <> Is, Null, And, Or, Not
Podemos tambm alterar a propriedade SQL de um componente Tquery em
tempo de execuo, mudando a pesquisa enquanto o programa executado.
Inclua neste formulrio um boto para abrir uma caixa de dilogo, onde o usurio
escrever uma instruo SQL. E digite o seguinte cdigo para o evento OnClick
deste boto:
implementation
{$R *.DFM}
var
InstrucSQL: String;
procedure TForm1.BtnSQLClick(Sender: TObject);
var
Ok: Boolean;
begin
InstrucSQL:=;
Pgina: 25
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Ok:=InputQuery(SQL,Entre com uma instruo SQL,InstrucSQL);
if Ok then
begin
With Query do
begin
Close;
SQL.Clear;
SQL.Add(InstrucSQL);
Open;
end;
end;
end;
Nesta listagem, definimos a varivel InstrucSQL para conter o retorno da
InputQuery. Se o usurio pressionar o boto Ok, o que ele digitou estar nesta
varivel.
Para alterar a propriedade SQL de um Query, devemos primeiro fech-lo, limpar
a propriedade, e s ento atualizar a Instruo SQL.
Os operados SQL listados na tabela de palavras chaves, so usados para restrin-
gir as informaes exibidas no BDGrid. Por exemplo, se estivermos interessa-
dos apenas nos clientes que residam em determinado estado, utilizamos a seguin-
te instruo:
Pgina: 26
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Poderemos pesquisar tambm vendas abaixo de um determinado valor:
SQL:= SELECT OrderNo, CustoNo, ItemsTotal FROM Orders WHERE
ItemsTotal < 3000
Nesta instruo sero exibidos os campos OrderNo, CustoNo, ItemsTotal ape-
nas dos registros que possurem o valor do campo ItemsTotal menor que 3000.
Funes Agregadas
COUNT (nome do campo) Retorna o nmero de linhas nas quais o nome
de campo no nulo
MAX ( nome do campo) Retorna o valor do maior campo na tabela
Pgina: 27
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
MIN ( nome do campo) Retorna o valor do menor campo na tabela
SUM ( nome do campo) Retorna o valor total do campo na tabela
AVG ( nome do campo) Retorna a mdia aritmtica dos valores do
campo na tabela
Para retornar o nmero de pedidos por cliente use:
SQL:= SELECT CustNo, COUNT(OrderNo) as Vendas FROM Orders GROUP
BY CustNo
Nesta declarao, estamos incluindo o campo calculado Vendas. A legenda Ven-
das aparecer no DBGrid indicando o nmero de vendas para cada cliente da
tabela Orders.db. A clusula GROUP BY diz ao compilador SQL para agrupar
os resultados pelo nmero do cliente - CustNo.
Podemos tambm retornar apenas um registro, com os valores mdios das ven-
das:
SQL: SELECT AVG(ItemsTotal) as Mdia FROM Orders
Junes entre Tabelas
At agora vimos instrues SQL apenas para uma tabela, para realizar pesquisa
em vrias tabelas, utilizamos as junes. Para unirmos duas ou mais tabelas,
estas devem possuir dois campos de mesmo nome e que estejam relacionados.
Por exemplo, queremos verificar as vendas de cada cliente, exibindo o nome
deste cliente e no o seu cdigo.
SQL: SELECT C.Company, O.OrderNo FROM Customer C, Orders O WHERE
C.CustNo = O.CustNo ORDER BY C.Company
Esta instruo utiliza as Letra C e O como abreviao do nome das tabelas
Customer e Orders respectivamente. Note que devemos informar qual ser o
campo de relacionamento entre as tabelas - WHERE C.CustNo = O.CustNo.
Podemos atravs do SQL realizar pesquisas bastante complexas sem a necessi-
dade de linhas de cdigos enormes, usando uma linguagem bem parecida com a
nossa linguagem falada.
Pgina: 28
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Sistema de Vendas com Pesquisa
Abra novamente o projeto Processo de Vendas e inclua no formulrio principal
mais uma pgina com o ttulo Pesquisa, e trs botes de comando conforme a
figura a seguir, e tambm um Query e outro Data Source no formulrio
FrmControle que sero os responsveis pela pesquisa dos botes.
TQuery
Active True
DatabaseName DBDemos
Name QryPesquisa
TDataSource
DataSet QryPesquisa
Name SrcPesquisa
Pgina: 29
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Digite o cdigo a seguir para os trs botes:
procedure TForm1.BtnVendasClick(Sender: TObject);
begin
with FrmControles.QryPesquisa do
begin
Close;
SQL.Clear;
SQL.Add(SELECT C.Company, O.OrderNo, I.PartNo );
SQL.Add(FROM Customer C, Orders O, Items I );
SQL.Add(WHERE O.CustNo=C.CustNo AND O.OrderNo=I.OrderNo );
SQL.Add(ORDER BY C.Company);
Open;
end;
end;
procedure TForm1.BtnVendasMenoresClick(Sender: TObject);
var
Ok: boolean;
Valor: string;
begin
Ok:= InputQuery(SQL,Entre com a valor de partida,Valor);
if Ok then
with FrmControles.QryPesquisa do
begin
Close;
SQL.Clear;
SQL.Add(SELECT C.Company, O.OrderNo, I.PartNo );
SQL.Add(FROM Customer C, Orders O, Items I );
SQL.Add(WHERE O.CustNo=C.CustNo AND O.ItemsTotal <);
SQL.Add(Valor + ORDER BY C.Company);
Open;
end;
end;
procedure TForm1.BtnVendasPecasClick(Sender: TObject);
begin
with FrmControles.QryPesquisa do
begin
Close;
SQL.Clear;
SQL.Add(SELECT P.PartNo, I.Qty, C.Company, O.OrderNo );
Pgina: 30
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
SQL.Add(FROM Customer C,Orders O, Items I, Parts P );
SQL.Add(WHERE O.CustNo=C.CustNo AND O.OrderNo=I.OrderNo );
SQL.Add(AND I.PartNo=P.PartNo ORDER BY P.PartNo);
Open;
end;
end;
Todas as instrues SQL do exemplo acima foram vistas nos exemplos anterio-
res. Merece um destaque a declarao para o boto BtnPecas que associa as
quatro tabelas do banco de dados.
Para incrementar mais um pouco nosso projeto, vamos fazer com que o Grid da
pgina Vendas seja um pouco mais realista exibindo dados das tabelas Items e
Parts. Nesse Grid ser mostrado o resultado de uma pesquisa realizada em trs
tabelas - Items, Parts e Orders - associadas, apesar de exibir dados de apenas
duas - Items e Parts.
Inicie inserindo no DataModule um componente Query e outro DataSource, de-
finindo suas propriedades seguindo a tabela:
TQuery
DatabaseName DBDemos
DataSource SrcVendas
Name QryFatura
TdataSource
DataSet QryFatura
Name SrcFatura
A propriedade SQL do TQuery far a juno entre as tabelas Items e Parts,
selecionando os campos a serem exibidos no Grid, e ser:
SELECT I.ItemNo, I.PartNo, P.Description, I.Qty, P.ListPrice FROM Items
I, Parts P WHERE I.PartNo=P.PartNo AND OrderNo=:OrderNo
A juno com a terceira tabela - Orders - realizada atravs da propriedade
DataSource do TQuery. Esta propriedade indica o local de onde a instruo
SQL ir retirar o parmetro OrderNo - ... AND OrderNo=:OrderNo.
Pgina: 31
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
A instruo SQL parametrizada usada para que sejam exibidos somente os
itens pertencentes venda corrente, caso no utilize este parmetro, o compo-
nente Grid exibir todas as vendas juntamente com seus itens.
Agora altere a propriedade DataSource:=SrcFatura do Grid para ele exibir dados
do Query Fatura. Mesmo aps esta alterao, o Grid est mostrando os campos
anteriores esta mudana. Para alterar os campos mostrados por ele, d um
clique-direito em cima do DBGrid para abrir a Columns Editor.
Para adicionar um campo clique no boto indicado na figura anterior, selecionan-
do a coluna criada (0 - Tcolumn), e na Object Inspector defina o nome do
campo associado esta coluna.
Pgina: 32
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Faa o mesmo para as outras colunas, at Columns Editor se parecer com a
figura a seguir. Ou e voc preferir poder incluir todos de uma s vez clicando no
boto Add All Fields.
Para alterar o ttulo de cada coluno do Grid, altere a propriedade Caption da
propriedade Title de cada campo. A figura a seguir mostra a alterao para o
campo Description.
Para completar o Grid est faltando um campo com o total da linha. Como este
campo no est presente em nenhuma tabela deveremos criar um campo calcu-
lado. Um campo calculado criado dinamicamente enquanto o programa
executado.
Pgina: 33
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para inserirmos a coluna no Grid relativa a um campo calculado, deveremos
primeiro criar este campo no Query QryFatura.
Abra o Fields Editor para o Query QryFatura e inclua todos os campos dispo-
nveis para este objeto, e depois, escolha a opo New Field... do menu de
atalho.
Na caixa de dilogo New Field, copie as definies do novo campo de acordo
com figura a seguir. Ele dever ser do tipo Currency e Calculado.
Feche esta janela e inclua a nova coluna no DBGrid e altere as legendas das
colunas, para ficar semelhante figura abaixo:
Pgina: 34
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
O campo calculado tem seu valor definido a partir de linhas de cdigo associadas
ao evento OnCalcFields do objeto que ele pertence. Este evento ocorre toda
vez que os campos calculados precisam ser atualizados.
Selecione o Query QryFatura e no Oject Inpector, v para a pgina Events dando
um duplo clique no evento OnCalcFields. Digite o seguinte cdigo:
procedure TFrmControles.QryFaturaCalcFields(DataSet: TDataSet);
begin
QryFaturaTotalLinha.Value:=QryFaturaQty.Value *
QryFaturaListPrice.Value;
end;
Esta linha de cdigo atribui o resultado da multiplicao entre os valores dos
campos Qty e ListPrice, ao valor do campo TotalLinha.
Quando o programa for executado, o Grid ficar semelhante figura abaixo:
Pgina: 35
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Parmetros
Os parmetros so utilizados para determinar que filtro ser utilizado ou que
clculo fazer para a pesquisa. Estes parmetros podem ser configurados atravs
da propriedade Params do componente Query.
Um parmetro determinado, colocando antes dele o sinal de dois pontos dentro
da declarao SQL. O seu funcionamento semelhante ao utilizado na procedure
do boto Vendas menores, onde foi utilizada a varivel Vendas incorporando seu
valor na prpria declarao SQL.
Como exemplo, vamos inserir um boto que nos retornar dados sobre a vendas
de uma pea especfica.
Inicie adicionando um boto na pgina Pesquisa, com o nome de BtnPeca.
Insira no formulrio Controles mais um Query e um DataSource ligado a ele.
Ligue o Query ao banco de dados DBDEMOS e com as seguintes propriedades:
TQuery
DatabaseName DBDemos
Name QryPeca
TdataSource
DataSet QryPeca
Name SrcPeca
E propriedade SQL:
SELECT I.PartNo, I.OrderNo, C.Company, Qty, O.SaleDate
FROM Items I, Orders O, Customer C
WHERE I.OrderNo=O.OrderNo AND C.CustNo=O.CustNo AND
I.PartNo=:Peca
ORDER BY O.SaleDate
Observe que o parmetro desta pesquisa ser Peca.
D um duplo clique na propriedade Params para abrir o editor de parmetros.
Pgina: 36
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Selecione o parmetro 0-Peca e mude sua propriedade DataType:= ftInteger.
No cdigo do procedimento, existem duas opes de se referir ao parmetro,
utilizando o seu ndice ou seu nome:
QryPeca.Params[ndice] ou
QryPeca.ParamsByName (Nome)
Digite o seguinte procedimento para o boto BtnPeca:
procedure TForm1.BtnPecaClick(Sender: TObject);
var
Peca: String;
begin
Peca:= inputbox(Pea,Entre com o nmero da pea:,);
with FrmControles.QryPeca do
begin
Close;
Params[0].value:=StrToFloat(Peca);
//ou
// ParamByName(Peca).value:=StrToFloat(Peca);
Open;
end;
DbgPesquisa.DataSource:=FrmControles.SrcPeca;
//DbgPesquisa o grid da pgina Pesquisa
end;
Pgina: 37
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Aps atribuir um novo parmetro, podemos utilizar o mtodo Open ou ExecSQL
para executar a consulta.
Teste o novo comando usando os seguintes cdigos de peas: 12310, 5313 e
11564.
Repare que aps dar um clique no boto BtnPeca, o grid no mostrar mais as
pesquisas realizadas plos outros boto. Resolva isto alterando a propriedade
DataSource do Grid aps cada pesquisa.
RELATRIOS
Para a gerao de relatrios no Delphi usamos as ferramentas do QuickReport
presentes na paleta QReport da barra de ferramentas. Com estes controles
poderemos construir relatrios que sero compilados diretamente em nosso pro-
jeto sem a necessidade de carregar outras ferramentas de relatrio. Poderemos
tambm incluir cdigo a vrios eventos de relatrios proporcionando uma grande
flexibilidade em nossos projetos.
O Delphi nos proporciona alguns modelos de relatrios, e tambm um assistente
para a criao destes relatrios.
Selecione File >> New >> Form, observando que existem trs modelos de
relatrios:
Pgina: 38
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
QuickReport Labels - Utilizado na criao de etiquetas.
QuickReport List - Permite a criao de relatrios simples, a partir de da-
dos de uma tabela ou query.
QuickReport Master/Detail - um modelo de relatrio que obtm dados a
partir de duas tabelas.
Primeiro vamos criar um relatrio com as informaes sobre os clientes, retira-
das da tabela Customer.db.
Na caixa de dilogo New Items, escolha QuickReport List.
O Delphi nos apresenta um modelo de relatrio com alguns componentes j inse-
ridos. Um destes componentes so as faixas, elas nos do funcionalidade como
ttulos, cabealhos, rodaps, detalhes, e sub-detalhes para dados do relatrio -
elas representam o componente QRBand.
Outros componentes que iremos utilizar so o QRLabel e o QRDBTex. O pri-
meiro exibe informaes estticas no relatrio, enquanto que o segundo exibe
informaes dinmicas vindas do banco de dados, pois est ligado a um campo
de determinada tabela.
Pgina: 39
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Construo do Relatrio
Repare que o formulrio aberto pelo Delphi do tipo TQRListForm, ou seja,
um formulrio especfico para relatrios de lista. Selecione o relatrio (QuickRep1),
dando um clique na rea de cliente do formulrio, e mude as seguintes proprieda-
des:
Name:= RepClientes
ReportTitle:= Informaes de Clientes
Mude tambm o nome do formulrio para FrmRelatorioClientes.
O componente Table presente no relatrio, recebeu o nome de MasterTable e ele
ser nossa fonte de informaes para o relatrio. Altere suas propriedades:
DatabaseName:= DBDemos
TableName:= Customer.db
Na segunda faixa - ColumnHeader - coloque mais dois (j possui um) QRLabel
( ) alterando suas legendas para Nome, Endereo e Telefone, e arrastando-
os como qualquer outro objeto, ou definindo suas posies com as propriedade
Left e Top.
Na terceira faixa - Detail - delete o componente QRLabel existente e adicione
trs QRDBText ( ) em baixo das legendas da faixa anterior, definindo a pro-
priedade DataSet como MasterTable para as trs, e as propriedades DataField
como Company, Addr1 e Phone.
Posicione os controles de forma que seu formulrio de relatrio se parea com a
figura a seguir.
Pgina: 40
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Este formulrio possui um menu de atalho que nos d acesso a uma caixa de
dilogo onde poderemos alm de outras coisas, configurar a apresentao do
relatrio, e possui tambm a opo de visualizao antes dele estar vinculado ao
aplicativo. As opes so: Report Settings e Preview.
Ative a MasterTable, e faa uma visualizao do relatrio. Altere as fontes das
legendas de cada coluna e adicione um componente QRShape com a proprieda-
de Shape:= qrsHorLine. Tome cuidado na hora de inserir o QRShape, pois ele
dever pertencer faixa ColumnHeader e no ao formulrio.
Quando as alteraes no relatrio estiverem de acordo com seu gosto, digite o
cdigo a seguir para o boto da pgina Clientes que exibir o relatrio. No se
esquecendo de incluir o nome da unidade do relatrio na seo uses do formu-
lrio principal.
procedure TForm1.BtnRelatorioClientesClick(Sender: TObject);
begin
FrmRelatorioClientes.RepClientes.Preview;
//ou
// FrmRelatorioClientes.RepClientes.Print;
//para imprimir
end;
Abra um novo relatrio, mas desta vez como Master/Detail.
Pgina: 41
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Este novo formulrio possui duas tabelas, um DataSource e uma faixa de sub-
detalhes a mais, em comparao ao anterior. Ele um outro tipo de componente,
o TQRMDForm, sendo um formulrio especfico para a construo de relatri-
os Master/Detalhe.
Altere o nome do formulrio para FrmRelatorioVendas, e as seguintes proprieda-
des do relatrio (QuickRep):
Name:= RepVendas
ReportTitle:= Vendas
Os dois componentes TTable esto nomeadas como MasterTable e DetailTable,
e o DataSource como MasterDS. O DataSource est presente apenas para
criar uma vinculao entre as tabelas. Altere as propriedades destes componen-
tes associando-os s tabelas Customer.db (master) e Orders.db (detalhe), e tor-
nando-as ativas.
V at a DetailTable e selecione a proprie-
dade MasterFields para exibir a caixa de
dilogo Field Link Designer, vista anteri-
ormente no curso e utilizada para a vinculao
de tabelas. Vincule as duas tabelas pelo n-
dice CustNo.
Na faixa Column Header, coloque dois
componentes QRLabel com as legendas
Nome do Cliente e Cdigo.
Pgina: 42
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Na faixa Detail, insira dois QRDBText associados aos campos Company e CustNo
da MasterTable. Aumente a altura desta faixa, e inclua mais dois QRLabel com
as legendas Nmero do Pedido e Valor Pago.
Na quarta faixa - SubDetail - coloque dois QRDBText, para os detalhes das
compras, associados aos campos OrderNo e AmountPaid da tabela Orders.db
da DetailTable.
Verifique se a propriedade DataSet da faixa SubDetail est apontando para a
DetailTable, e se a mesma propriedade do relatrio RepVendas igual a
MasterTable, e altere a propriedade Text:=Pgina para o QRSysData2.
Ao final, o seu formulrio dever se parecer com o da figura a seguir:
Inclua mais um boto no formulrio principal para a exibio deste ltimo relat-
rio. E teste o seu programa.
Pgina: 43
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Os relatrios construdos anteriormente tambm poderiam ser construdos par-
tindo-se de um formulrio comum, desde que inclussemos o componente QuickRep
neste formulrio, dimensionando-o na rea de cliente de acordo com as necessi-
dades. E a partir da colocaramos os demais componentes existentes de modo
semelhante aos relatrios construdos como exerccio.
Valores Calculados
possvel colocarmos campos calculados no relatrio utilizando o componente
QRExpr que realiza diversos clculos. Entre eles temos: soma, mdia, mximo,
contagem.
No relatrio RelVendas, vamos inserir um campo calculado que mostre o total
vendido a cada cliente.
Como este campo calculado definido para cada cliente, devemos primeiro inserir
mais uma banda no relatrio, que estar ligada banda SubDetail. Est nova
banda ser do tipo GroupFooter, ou seja, ela ser um rodap de determinado
grupo de registros.
Clique no componente QRBand da barra de ferramentas QReport, e clique em
qualquer regio do relatrio.
Com esta nova banda selecionada, altere as seguintes propriedades:
BandType:=rbGroupFooter
HasChild:=True
A banda filha definida na propriedade HasChild, servir para inserir um espao
entre a lista de cada cliente.
Selecione a banda SubDetail, e altere a propriedade FooterBand:=QRBand1.
Insira um QRLabel com a legenda TOTAL e um QRExpr na banda GroupFooter.
Pgina: 44
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para definir que expresso o QRExpr far, d um duplo clique na propriedade
Expression para abrir o assistente de expresso. Este assistente ajuda o progra-
mador a definir a frmula da expresso desse componente.
Digite a seguinte expresso: SUM(AmountPaid), para somar os valores do campo
AmountPaid do relatrio e no da tabela. E altere a propriedade Master para
QRSubDetail1 ou outro nome que voc tenha dado para a banda SubDetail.
Pgina: 45
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Aps um preview, o seu relatrio dever estar da seguinte forma:
Para finalizar, falta formatar a apresentao do campo Total. Para isso, altere a
propriedade Mask do QRExpr para: R$0,0,0.00. Caso queira dar um aspecto
diferente para o formulrio possvel envolver as bandas com frames, utilizando
a propriedade Frame, deixando a ChildBanda sem nenhum frame.
Pgina: 46
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
AMBIENTE CLIENTE / SERVIDOR
Num ambiente Cliente/Servidor ns temos um banco de dados central sendo
acessado por vrias outros usurios - Clientes. Este banco de dados central deve
ser gerenciado por um programa especfico para isto.
O Delphi incorpora o gerenciador de banco de dados InterBase da Borland, ns
iremos trabalhar com este gerenciador, o que permite a criao e teste de
aplicativos sem estarem instalados no ambiente de produo. Quando o projeto
estiver terminado, basta instal-lo no computador servidor de arquivos para uso
imediato.
Iremos utilizar o banco de dados Interbase de amostra, Employee.GDB que
est no diretrio ...\Arquivos comuns\Borland Shared\Data do Delphi. Ele
possui o alias IBLOCAL.
Para observarmos de que elementos o IBLOCAL construdo, utilizamos o pro-
grama SQL Explorer presente no grupo do Delphi.
Pgina: 47
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Altere a propriedade SERVER NAME para que este alias aponte para o banco
de dados que iremos utilizar - Employee.gdb.
Aps a alterao na localizao do banco de dados, necessrio salvar esta
alterao para o alias IBLOCAL. D um clique-direito sobre o IBLOCAL e
clique na opo Save As do menu atalho, mantendo o mesmo nome do alias.
Aps salvar, d um clique no sinal + ao lado do IBLOCAL para abri-lo. O Delphi
apresentar uma caixa de dilogo para a identificao do usurio, digite a senha
masterkey, sem alterar o UserName. Esta senha e usurio foram criados
durante a criao do banco de dados.
Pgina: 48
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Estando o banco de dados aberto poderemos visualizar todos os componentes
com suas definies de tipos e classes.
Atravs do SQL Explorer tambm poderemos alterar nosso banco de dados e
suas tabelas. Bastando selecionar o item que deseja acrescentar, e no menu
Object clicar na opo New, definindo as propriedades que se deseja trabalhar
neste novo objeto. Criando as tabelas com suas colunas, definies, e demais
itens. Na figura a seguir, foi escolhida uma nova tabela, e uma nova coluna.
Pgina: 49
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Vamos criar um simples programa que acessa os dados da tabela Employee do
IBLOCAL. Ns iremos trabalhar com os campos First_Name, Phone_Ext e
Salary, mostrados em um DBGrid.
Existem poucas diferenas entre o acesso a um banco de dados simples e outro
banco de dados cliente/servidor.
Inicie um novo projeto colocando no formulrio os seguintes componentes: DBGrid,
DataBase, Table, DataSource e um DBNavigator.
Configure os componentes seguindo a tabela mostrada a seguir:
DataBase
AliasName IBLOCAL
DatabaseName IBLOCAL
Table
DatabaseName IBLOCAL
TableName Employee
DataSource
DataSet Table1
Grid
Columns 0 - First_Name 1 - Phone_Ext 2 - Salary
DataSource DataSource1
DBNavigator
DataSource DataSource1
O seu formulrio dever estar semelhante ao mostra na figura a seguir:
Pgina: 50
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para finalizar, inclua as linhas de cdigo para o evento OnCreate do formulrio,
para abrir e conectar o banco de dados.
procedure TForm1.FormCreate(Sender: TObject);
begin
DataBase1.Connected:=True {conecta o banco de dados}
Table1.Active:=True {abre a table Employee}
end;
Aps o incio da execuo, o programa solicitar a senha para a conexo com o
banco de dados.
EXEMPLO
Neste exemplo iremos construir um pequeno aplicativo para controle de livros
em uma biblioteca. Este aplicativo trabalhar com o Interbase Server que um
servidor de banco de dados nativo do Delphi.
Iremos utilizar o Interbase porque ele j vem includo com o Delphi, e aps fazer
a instalao do Delphi, podemos tambm instalar o servidor Interbase local com
a verso para um nico usurio. Esta verso permite que o programador teste o
seu aplicativo fora do ambiente de trabalho, como se estivesse realmente nele.
Para criarmos as tabelas no Interbase, utilizamos o InterBase Windows ISQL,
que uma ferramenta interativa do Interbase permitindo uma interao com o
servidor local ou remoto. Antes de utiliz-lo, o Interbase Server deve estar
sendo executado no seu computador.
Pgina: 51
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
O aplicativo que iremos construir constitudo por quatro tabelas: Aluno, Livro,
Emprestimo e Itens, com os seguintes campos:
Aluno Livro Emprestimo Itens
Aluno_Id Livro_Id Emprestimo_Id Itens_Id
Nome Titulo Aluno_Id Livro_Id
Endereo Assunto Data_Emprestimo Emprestimo_Id
Telefone Dat_Devolucao
Turma Devolvido
O ISQL composto por duas janelas, onde na primeira digitamos a instruo
SQL e na segunda obtemos o resultado desta instruo.
Pgina: 52
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Antes de fazer qualquer coisa com um banco de dados necessrio conectar-se
a ele atravs da opo Connect to Database do menu File. Informando se
de um servidor local ou remoto, o caminho do banco de dados e os dados para
login (user e senha).
Para criar um banco de dados basta escolher a opo Create Database do
menu File, introduzindo tambm o caminho completo, o usurio e a senha.
Construindo o Banco de Dados
Como no exemplo que iremos construir sero muitas instrues SQL para criar o
banco de dados e as tabelas, iremos utilizar a opo do ISQL de poder executar
um arquivo de Script com todas as linhas de comando j definidas. O Script
ISQL um arquivo de texto, com a extenso .sql, que contm as intruo SQL.
Digite as seguintes linhas de Script no Bloco de notas:
Pgina: 53
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
CREATE DATABASE c:\meus documentos\biblioteca.gdb
USER SYSDBA PASSWORD masterkey;
CONNECT c:\meus documentos\biblioteca.gdb
USER SYSDBA PASSWORD masterkey;
CREATE DOMAIN DALUNO_ID INTEGER NOT NULL;
CREATE DOMAIN DLIVRO_ID INTEGER NOT NULL;
CREATE DOMAIN DEMPRESTIMO_ID INTEGER NOT NULL;
CREATE DOMAIN DITENS_ID INTEGER;
CREATE TABLE ALUNO
(ALUNO_ID DALUNO_ID,
NOME VARCHAR(20) NOT NULL,
ENDERECO VARCHAR(30) NOT NULL,
TELEFONE VARCHAR(15),
TURMA CHAR(3),
CONSTRAINT ALUNO_CHAVE_PRIM PRIMARY KEY (ALUNO_ID));
CREATE TABLE LIVRO
(LIVRO_ID DLIVRO_ID,
TITULO VARCHAR(20) NOT NULL,
ASSUNTO VARCHAR(10),
CONSTRAINT LIVRO_CHAVE_PRIM PRIMARY KEY (LIVRO_ID));
CREATE TABLE EMPRESTIMO
(EMPRESTIMO_ID DEMPRESTIMO_ID,
ALUNO_ID DALUNO_ID,
DATA_EMPRESTIMO DATE DEFAULT NOW NOT NULL,
DATA_DEVOLUCAO DATE,
DEVOLVIDO CHAR(3) DEFAULT NAO,
CONSTRAINT EMPRESTIMO_CHAVE_PRIM PRIMARY KEY (EMPRESTIMO_ID),
CONSTRAINT EMPRESTIMO_CHAVE_EST FOREIGN KEY (ALUNO_ID)
REFERENCES ALUNO);
CREATE TABLE ITENS
(LIVRO_ID DLIVRO_ID,
EMPRESTIMO_ID DEMPRESTIMO_ID,
ITENS_ID DITENS_ID,
CONSTRAINT ITENS_CHAVE_PRIM PRIMARY KEY (LIVRO_ID,
EMPRESTIMO_ID));
EXIT;
Pgina: 54
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
No incio necessrio criar e conectar-se ao banco de dados - Biblioteca.gdb. O
login para o Interbase Local SYSDBA para o usurio, e masterkey como
senha deste usurio.
A seguir so criados os domnios, definindo os limites para os campos que sero
as chaves das tabelas:
CREATE DOMAIN DALUNO_ID INTEGER NOT NULL;
Na linha acima foi criado o domnio DALUNO_ID do tipo inteiro, e que no pode
ser de valor nulo.
Depois so criadas as tabelas com a definio de seus campos, junto com os
tipos e as definies das chaves primrias e estrangeiras.
ALUNO_ID DALUNO_ID,
DATA_EMPRESTIMO DATE DEFAULT NOW NOT NULL,
O campo Aluno_Id, possui os limites definidos pelo domnio DAluno_Id, enquan-
to que o campo Data_Emprestimo possui as limitaes do tipo Date com o valor
padro definido pela funo Now, no podendo ser nulo.
CONSTRAINT EMPRESTIMO_CHAVE_PRIM PRIMARY KEY
(EMPRESTIMO_ID),
CONSTRAINT EMPRESTIMO_CHAVE_EST FOREIGN KEY
(ALUNO_ID)
REFERENCES ALUNO);
Criamos chaves primrias e estrangeiras utilizando a clusula Constraint, indi-
cando o nome desta chave e a que campos ela faz referncia.
Concluda a digitao, salve o arquivo como Tabela.sql. E no ISQL, escolha a
opo Run an ISQL Script do menu File selecionando o arquivo Tabela.sql
para ser executado e tambm indicando um arquivo para ser gravado como ar-
quivo de sada.
Pgina: 55
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Este arquivo de sada importante pois os erros na execuo do Script sero
gravados nele, onde poderemos ver mais tarde as possveis correes.
Aps a execuo do Script, ser apresentada uma mensagem informando se a
execuo ocorreu com ou sem problemas.
Agora est faltando apenas alguns detalhes para finalizar o banco de dados. A
criao de mais um ndice na tabela Aluno e criar o seu Alias.
A tabela alunos precisa de mais um ndice para organizarmos os registros pelo
nome do aluno. Para criarmos o ndice NOMEX e o Alias, vamos utilizar o
SQL Explorer que est presente no mesmo grupo de programas do Delphi.
Pgina: 56
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para criar um novo Alias siga os seguintes passos:
1. Selecione o objeto Database do painel esquerdo.
2. Clique-direito, e no menu de contexto, escolha New.
3. Selecione um tipo de alias (INTRBASE) na caixa de dilogo New Database
Alias, e escolha OK.
4. Digite o nome de Biblioteca para o alias.
Pgina: 57
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
5. Entre com o caminho completo do alias na caixa de texto Server Name e o
nome do usurio na pgina Definition do painel direito.
6. Clique-direito no banco de dados Biblioteca e no menu de contexto, escolha a
opo Apply para atualizar o banco de dados.
Para abrir o banco de dados Biblioteca, clique no sinal + ao seu lado, sendo
exibida ento a caixa de dilogo para a entrada do login e efetivar a conexo.
Digite o nome do usurio e a senha masterkey.
Pgina: 58
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Aps abrir e conectar-se com o banco e dados, digite a linha de comando SQL na
pgina Enter SQL do painel direito, clicando no boto Execute Query, de acor-
do com a figura a seguir.
Aps a execuo da query, escolha a opo Refresh do menu de contexto do
banco da dados para atualiz-lo, adicionando o novo ndice.
Feche o banco de dados Biblioteca a partir do menu Object >> Close. Encer-
rando sua construo.
Pgina: 59
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Construindo o Aplicativo
O aplicativo que iremos construir composto por cinco formulrios, com as se-
guintes funes:
frmCadastroAlunos - responsvel pelo controle dos registros da tabela Aluno.
frmCadastroLivros - responsvel pelo controle dos registros da tabela Livro.
frmControle - contm todos os controles de acesso a dados.
frmEmprestimo - formulrio onde ser realizada a operao de emprstimo de
livros.
frmPrincipal - o formulrio inicial da aplicao, a partir do qual ser dado
acesso aos demais.
frmPrincipal
Comece com a construo do formulrio principal, inserindo nele os seguintes
botes e cdigo:
Pgina: 60
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
implementation
uses UntAluno, UntControle, UntEmprestimo, UntLivro, UnitSplash;
{$R *.DFM}
procedure TfrmPrincipal.btnSairClick(Sender: TObject);
begin
Close;
end;
procedure TfrmPrincipal.btnAlunosClick(Sender: TObject);
begin
frmControle.tblAluno.Open;
frmCadastroAlunos.Show;
end;
procedure TfrmPrincipal.btnLivrosClick(Sender: TObject);
begin
frmControle.tblLivro.Open;
frmCadastroLivros.Show;
end;
procedure TfrmPrincipal.btnEmprestimosClick(Sender: TObject);
begin
frmControle.tblEmprestimo.Open;
frmControle.tblItens.Open;
frmControle.tblAluno.Open;
frmEmprestimo.Show;
end;
frmControle
A seguir, construa a formulrio dos controles de dados:
Pgina: 61
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Faa as ligaes normais para as tabelas tblAluno, tblLivro e tblEmprestimo e
seus respectivos data sources.
Para a tabela tblItens, defina-a como detalhe da tabela Emprestimo:
Faa as ligaes do controle Database com o alias Biblioteca criado anterior-
mente.
Pgina: 62
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Adicione todos as campos das tabelas no Fields
Editor, criando o campo calculado Dias_Atraso
para a tabela tblEmprestimo.
O Query qryMaximo fornecer os valores de
identificao dos prximos registros para as ta-
belas Aluno, Livro e Emprestimo. Pois no se-
ro usados campos auto-incremento.
SQL = SELECT Max(Livro_Id) as MaxLivro, Max(Emprestimo_Id)
as MaxEmprestimo,Max(ALUNO_ID) as MaxiAluno FROM Livro,
Emprestimo, Aluno
Adicione tambm estes campos criados a partir de intruo SQL no Fields Editor
do Query.
Este formulrio conter somente o cdigo do campo calculado, para o clculo
dos dias em atraso utilizando a funo Date:
procedure TfrmControle.TblEmprestimoCalcFields(DataSet: TDataSet);
var
Atraso:Real;
begin
Atraso:= (Date) - tblEmprestimoDATA_DEVOLUCAO.AsFloat;
if Atraso>0 then
tblEmprestimoDIAS_ATRASO.Value:=Trunc(Atraso);
end;
Pgina: 63
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
frmCadastroLivros
O que vale ressaltar neste formulrio, a exibio dos Hints do DBNavigator
que devero ser passados para o portugus e permitida a sua exibio. Para isso,
altere suas propriedades ShowHint:=True e Hints de acordo com a figura:
Pgina: 64
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Altere tambm a propriedade VisibleButtons para exibir somente os botes
mostrados na figura do formulrio.
Insira tambm os valores para a lista do DBComboBox cbxAssunto, alterando
sua propriedade Itens:
Agora digite o seguinte cdigo para o formulrio frmLivro:
implementation
uses UntControle;
{$R *.DFM}
procedure TfrmCadastroLivros.btnSairClick(Sender: TObject);
begin
frmControle.tblLivro.Close;
Close;
end;
procedure TfrmCadastroLivros.btnProximoClick(Sender: TObject);
begin
frmControle.TblLivro.Next;
//o mtodo Next movimenta o ponteiro da tabela para o prximo //registro
end;
procedure TfrmCadastroLivros.btnPrimeiroClick(Sender: TObject);
begin
frmControle.TblLivro.First;
//o mtodo First movimenta o ponteiro da tabela para o primeiro //registro
end;
Pgina: 65
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
procedure TfrmCadastroLivros.btnNovoClick(Sender: TObject);
begin
with frmControle do
begin
tblLivro.insert;
qryMaximo.Close;
qryMaximo.Open;
tblLivroLivro_Id.Value:= qryMaximoMaxLivro.Value + 1;
//a linha de comando acima, pega o maior valor do campo
//Livro_Id, soma um e o atribui ao novo registro.
end;
end;
frmCadastroAlunos
Os destaques deste formulrio so a caixa de texto edtPesquisa e o RadioGroup
rdgOrdem. A primeira ser utilizada para fazer uma pesquisa utilizando o nome
do aluno, mostrando os registros de acordo com o que for sendo digitado nela,
desde que o ndice ativo seja o Nomex. E o grupo de opo comandar qual
ndice ser utilizado para organizar a tabela, se o ndice primrio ou o ndice
secundrio Nomex.
Pgina: 66
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Entre com o seguinte cdigo para o formulrio frmCadastroAlunos:
procedure TfrmCadastroAlunos.btnSairClick(Sender: TObject);
begin
frmControle.tblAluno.Close;
Close;
end;
procedure TfrmCadastroAlunos.edtPesquisaChange(Sender: TObject);
//Quadro de texto para pesquisa pelo indice
begin
with frmControle.tblAluno do
begin
SetKey; {coloca a Table em modo dsSetKey, para
poder utilizar os mtodos GoTo... e Find...}
frmControle.tblAluno[Nome]:=edtPesquisa.Text;
GotoNearest; {Vai para o registro mais prximo ao definido
pela chave}
end;
end;
procedure TfrmCadastroAlunos.rdgOrdemClick(Sender: TObject);
begin
if rdgOrdem.ItemIndex=0 then
frmControle.tblAluno.IndexName:=
//muda para o ndice primrio que no precisa ter seu nome
//informado
else
frmControle.tblAluno.IndexName:=NOMEX;
//muda o ndice ativo para o NOMEX
end;
procedure TfrmCadastroAlunos.btnNovoClick(Sender: TObject);
begin
with frmControle do
begin
tblALUNO.Insert;
qryMaximo.Close;
qryMaximo.Open;
tblAlunoALUNO_ID.Value:=qryMaximoMaxiAluno.Value + 1;
end;
end;
Pgina: 67
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
frmEmprestimo
Neste formulrio, os destaques so para a caixa de verificao (DBCheckBox)
Devolvido, para o grid que mostrar os itens (livros) do emprstimo, e o nmero
do aluno que ser escolhido atravs de um DBLookupComboBox com as seguin-
tes propriedades de ligao:
DataField Aluno_Id
DataSource frmControle.srcEmprestimo
KeyField Aluno_Id
ListField Nome
ListSouce frmControle.srcAluno
O DBCheckBox estar ligado ao campo Devolvido da tabela Emprstimo, tendo
as propriedades que atribuem o valor para o campo quando a caixa estiver sele-
cionada ou no, definidas em tempo de projeto, so elas:
Pgina: 68
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
ValueChecked - que contm o valor para quando a caixa de verifica-
o estiver selecionada.
ValueUnchecked - caso contrrio.
No DBGrid sero inseridos os dados sobre os livros a serem emprestados, sendo
exibido nele as colunas referentes ao nmero do item e ao ttulo do livro.
Encontramos aqui um problema, como exibir o ttulo do livro se a tabela Itens no
possui este campo. Resolvemos isto criando um Campo de procura para a
tabela Itens.
O Campo de procura um campo que exibe dados de uma tabela que no
fazem parte dela, ele s existe durante a execuo do programa, semelhente ao
campo calculado.
No Fields Editor da tabela Itens, adicone um novo campo (New field), seguindo a
figura motrada, para suas definies.
Pgina: 69
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Sendo;
Key Fields - qual o campo da tabela ser a chave de procura.
Dataset - qual ser a tabela relacionada com a procura.
Lookup Keys - determina a chave da tabela de procura que ser associada.
Result Field - determina qual o campo da tabela de procura ser exibido.
Ao utilizar o grid para inserir um novo livro, basta dar um duplo clique na coluna
Titulo do Livro para abrir uma lista com os livros pertencentes tabela, verifican-
do antes se a propriedade ButtonStyle igual a csAuto.
Digite agora o cdigo para o formulrio frmEmprestimo.
procedure TfrmEmprestimo.btnSairClick(Sender: TObject);
begin
frmControle.TblItens.Close;
frmControle.tblEmprestimo.Close;
frmControle.tblAluno.Close;
Close;
end;
procedure TfrmEmprestimo.btnNovoClick(Sender: TObject);
begin
with frmControle do
begin
tblEmprestimo.Insert;
qryMaximo.Close;
qryMaximo.Open;
tblEmprestimoEmprestimo_Id.Value:=
qryMaximoMaxEmprestimo.Value + 1;
tblEmprestimoDATA_EMPRESTIMO.Value:=Date;
end;
end;
Pgina: 70
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
CRIAO DE COMPONENTES
A programao orientada a objeto em que o Delphi se baseia, permite a criao
de componentes (objetos), podendo ser definidas as propriedades, mtodos e
eventos pertencentes a este objeto.
As propriedades so o conjunto de atributos deste objeto, elas podem afetar o
funcionamento do componente ou disparar uma ao. Os mtodos so funes
ou procedures escritas em cdigo e declaradas como pblicas. Os eventos so
respostas deste objeto alguma ao do usurio ou de outro objeto, eles so uma
propriedade especializada que indica qual procedimento executar para determi-
nada ao - evento.
OBJETO TSOBREBTN
Este boto apresentar uma janela com as informaes do programador, ele ser
baseado em um componente TButton herdando seus mtodos e propriedades.
Construo do boto SobreBtn
Inicie a criao deste boto, selecionando no menu File >> New, e na caixa de
dilogo New Item escolha Component.
Pgina: 71
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Na caixa de dilogo New Component, defina a classe ancestral do nosso boto,
e mude o seu nome de classe, conforme a figura a seguir:
Clique no boto OK e o Delphi ir abrir uma unidade de cdigo com o nome
SobreBtn.pas. Caso seja necessria a mudana de diretrio de trabalho desta
unidade, o quadro Unit file name poder ser alterado. Ou se preferir, a unidade
poder ser salva com outro nome utilizando-se a opo Save As... do menu File.
A seguir, temos a listagem inicial da Unit SobreBtn gerada pelo Delphi:
unit SobreBtn;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TSobreBtn = class(TButton)
private
{ Private declarations }
Pgina: 72
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(Samples, [TSobreBtn]);
end;
end.
O trecho entre a declarao type ... end; corresponde a seo de definio de
tipo do objeto.
O Delphi cria um novo tipo - TSobreBtn - baseado na classe Tbutton, contendo
apenas o procedimento que registra o novo componente na paleta Samples.
Na seo de definio de tipo, ns temos quatro parte que definem qual ser o
tipo de acesso para as variveis e procedimentos pertencentes ao objeto, so
elas: Private, Protected, Public e Published.
Private - Somente as rotinas definidas dentro da prpria unidade podem ter acesso.
Fora da unidade, qualquer identificador de componente ser desconhecido e ina-
cessvel.
Protected - Acesso permitido apenas aos procedimentos ou funes declaradas
na definio de tipo, ou por outros objetos descendentes.
Public - Todo a aplicativo tem acesso s variveis ou procedimento.
Published - Semelhante ao Public, mas com a exibio das propriedades ou
eventos criados, na Object Inspector.
Digite o seguinte cdigo:
Pgina: 73
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
unit SobreBtn;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TSobreBtn = class(TButton)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Click; override;
public
{ Public declarations }
constructor Create (AOwner: TComponent); override;
published
{ Published declarations }
end;
procedure Register;
implementation
constructor TSobreBtn.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
Caption:=&Sobre;
Cursor:=crHelp;
end;
procedure TSobreBtn.Click;
begin
inherited Click;
MessageDlg (Programa criado por ...,mtInformation,[mbOk],0);
end;
procedure Register;
begin
RegisterComponents(Samples, [TSobreBtn]);
end;
end.
Pgina: 74
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Na definio de tipo, o evento Click declarado como um procedimento prote-
gido. Os eventos so procedimentos especficos para determinadas aes. Na
implementao deste evento, devemos primeiro herdar - inherited - as caracte-
rsticas do evento Click do componente ancestral, e depois realizamos as mudan-
as desejadas. No nosso caso, exibir um quadro de dilogo.
O mtodo override, no substitui o evento Click herdado do TButton, ele apenas
estende ou refina este evento no novo componente. Usamos override para espe-
cificar que haver uma modificao no evento.
Na seo public, declaramos o mtodo constructor que controlar a constru-
o do componente. Usamos comumente Create como nome deste mtodo, e
Aowner como nome de parmetro, nada impedindo a utilizao de outros nomes.
Na implementao do constructor, semelhante ao Click, primeiro herdamos as
caractersticas do objeto base e depois alteramos as propriedades Caption e Cursor.
A propriedade Cursor, especifica qual ser o desenho que representar o mouse
quando este estiver em cima do controle, e pode ser:
Pgina: 75
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Aps a digitao do cdigo, salve o projeto e selecione Component >> Install
Component..., na barra de menu para instalar este componente dentro do paco-
te de componentes do usurio (Delphi Users Components) - dclusr40.dpk.
Um novo controle tambm pode ser instalado em um outro pacote da escolha do
programador.
Aps a escolha do arquivo de pacote, ser ento pedida uma confirmao para a
reconstruo do pacote de componentes.
Caso nenhum erro ocorra durante a compilao da unidade, o Delphi apresentar
a seguinte mensagem:
Pgina: 76
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Exibindo em seguida o Gerenciador de Pacotes - que possivelmente estar atrs
da janela de cdigo. Caso ocorra algum problema durante a compilao, retorne
unidade, corrija o defeito e, no Gerenciador de Pacotes, d um clique nos bo-
tes Compile e Install, para uma nova tentativa de instalao do componente.
O nosso novo boto SobreBtn ser ento instalado na paleta Samples da barra
de ferramentas. De onde poderemos incorpor-lo a um formulrio.
Um pacote um tipo de arquivo que contm os controles do Delphi, para vermos
quais pacotes esto disponveis no projeto selecione Project >> Options >>
Packages.
Pgina: 77
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Teste do Boto SobreBtn
Coloque o TSobreBtn em um formulrio vazio e execute o projeto. Ao se passar
o mouse sobre esse boto, o tipo de ponteiro ser mudado, e quando for dado um
clique nele, ser apresentada a caixa de mensagem descrita no cdigo.
No componente SobreBtn foram alteradas algumas propriedades herdadas do
componente TButton, e alterado o modo como ele trata o evento Click. No nosso
prximo componente, iremos criar novas propriedades, mtodos e um evento.
OBJETO TCALC
Este novo controle est baseado no tipo TComponent, ele realizar operaes
matemticas e ter um evento para guando o resultado destas operaes for
negativo.
O TCalc possui trs propriedades : Num1, Num2 e Res, dois mtodos : DoPot e
DoMult e o evento OnNegativo.
Construo do TCalc
O incio da construo semelhante ao TBtnSobre. Na janela New Component
escolha como tipo ancestral o TComponent, de acordo com a figura a seguir:
Pgina: 78
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Clique no boto OK, e o Delphi criar uma unidade com o nome de Calc.pas.
No cdigo mostrado a seguir, os mtodos so declarados como procedure e o
evento como property.
unit Calc;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TCalc = class(TComponent)
private
{ Private declarations }
FNum1:integer;
FNum2:integer;
FRes:integer;
FNeg:TNotifyEvent;
protected
{ Protected declarations }
public
Pgina: 79
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
{ Public declarations }
constructor Create (AOwner:TComponent); override;
property Res:integer read FRes;
procedure DoPot;
procedure DoMult;
published
{ Published declarations }
property Num1:integer read FNum1 write FNum1;
property Num2:integer read FNum2 write FNum2;
property OnNegativo:TNotifyEvent read FNeg write FNeg;
end;
procedure Register;
implementation
constructor TCal.Create (AOwner:TComponent);
begin
inherited Create (AOwner);
FNum1:=0;
FNum2:=0;
end;
procedure TCalc.DoMult;
begin
FRes:=FNum1 * FNum2;
if FRes < 0 then
if assigned (FNeg) then OnNegativo(Self);
end;
procedure TCalc.DoPot;
var
Temp:integer;
I:integer
begin
Temp:=FNum1;
FRes:=FNum1;
if FNum2=0 then
FRes:=1
else
for I:=1 to FNum2 - 1 do
FRes:=FNum1 * Temp;
end;
Pgina: 80
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
procedure Register;
begin
RegisterComponents(Samples, [TCalc]);
end;
end.
Na seo private declaramos as variveis que representam as propriedades den-
tro do cdigo do objeto, porque elas no so acessadas diretamente pelo usurio
do componente e sim atravs de chamadas especiais. Estas variveis possuem a
letra F (field) como inicial apenas como padro de programao. Declaramos
tambm uma varivel do tipo TNotifyEvent.
O tipo TNotifyEvent serve para notificar o componente que existe algum trata-
mento de evento para este componente. E quando o evento ocorre, o TNotifyEvent
envia um parmetro com o remetente do evento.
Na seo public declaramos o construtor, a propriedade Res - Resultado - como
somente de leitura, e os mtodos DoPot e DoMult.
As propriedades Num1 e Num2, e o evento OnNegativo, so declarados como
published, para que apaream na Object Inspector.
O mtodo DoMult executa a multiplicao entre FNum1 e FNum2, armazenando
o resultado em FRes. Se o valor da operao for negativo, e existir algum cdigo
de tratamento de evento (TNotifyEvent diferente de nulo), o evento OnNegativo
ocorre recebendo o parmetro Self enviado pelo TNotifyEvent.
Calculamos uma potncia entre Num1 e Num2 no mtodo DoPot, armazenando
o resultado em FRes.
Selecione Component >> Install Component... para compilar e instalar o
controle TCalc na barra de ferramentas e no pacote de componentes.
Pgina: 81
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Teste do TCalc
Inicie um novo projeto, colocando no formulrio um TEdit, dois TButton e o TCalc
que est na paleta Samples da barra de ferramentas.
Para utilizar este exemplo, o usurio digita um nmero no quadro de texto e d
um clique em um dos botes de acordo com a operao que deseja, sendo o
resultado exibido no mesmo quadro de texto, caso o resultado para Mult seja
negativo, ele ser mostrado na cor vermelha.
Entre com o cdigo a seguir:
procedure TForm1.PotBtnClick(Sender: TObject);
begin
Calc1.Num1 := StrToInt(Edit1.Text);
Calc1.Num2 := 2;
Pgina: 82
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Calc1.DoPot;
Edit1.Text:=IntToStr(Calc1.Res);
Edit1.SetFocus
end;
procedure TForm1.MultBtnClick(Sender: TObject);
begin
Calc1.Num1 := StrToInt(Edit1.Text);
Calc1.Num2 := 2;
Calc1.DoMult;
Edit1.Text:=IntToStr(Calc1.Res);
end;
procedure TForm1.Calc1Negativo(Sender: TObject);
{D um clique duplo no TCalc para editar este procedimento}
begin
Edit1.Font.Color:=clRed;
end;
end.
COMPONENTES ACTIVEX
O padro ActiveX desenvolvido pela Microsoft, permite a criao de componen-
tes que podem ser acessados e utilizados por qualquer ambiente que suporte esta
tecnologia. Interligando diversos ambientes de desenvolvimento, por exemplo:
um componente desenvolvido em Delphi pode ser utilizado pelo Visual Basic, e
vice-versa.
Com o ActiveX podemos construir pginas ativas na Web, fazendo com que o
usurio execute em micros remotos, programas residentes nos servidores da Web.
Componente SobreBtnX
Podemos criar um componente ActiveX a partir de um outro componente j
existente ou criado um componente por ns de acordo com as necessidades.
Como exemplo, vamos transformar o nosso boto TSobreBtn em um controle
ActiveX. Mas poderamos criar outro boto derivado do TButton com as mes-
mas caractersticas do TSobreBtn diretamente em ActiveX.
Pgina: 83
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Inicie a construo deste novo controle abrindo uma biblioteca ActiveX como
base do nosso projeto. Selecione File >> New >> ActiveX >> ActiveXLibrary:
E novamente File >> New >> ActiveX >> ActiveXControl, para criar a
unidade do nosso controle:
Pgina: 84
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Ser ento exibida a janela ActiveX Control Wizard, para serem definidas as
bases do novo controle: o nome deste controle e o nome do arquivo .pas que
conter a unidade. Siga a figura abaixo para as definies do SobreBtnX:
Feito isto, o Delphi j criou automaticamente todo o cdigo para a transformao
do TSobreBtn em um controle ActiveX. E criou tambm uma biblioteca de tipos
que define as interfaces e as propriedades do componente ActiveX.
Para abrir a biblioteca de tipos, selecione View >> Type Library, nela podemos
observar todos os componentes que integram o controle SobreBtnX.
Pgina: 85
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Na biblioteca de tipos podemos observar o cdigo GUID, que identificar o com-
ponente no Windows. Este identificador um valor binrio de 16 bits que identi-
fica unicamente uma interface entre todas as outras.
Para a construo de pginas HTML com Script, devemos usar o Tag OBJECT
com o cdigo GUID para a incorporao deste objeto na pgina.
Para podermos utilizar este controle, devemos antes registr-lo no Windows, clique
na opo Register ActiveX Server no menu Run. Quando o Delphi finalizar
a tarefa, ser mostrada a seguinte mensagem:
Pgina: 86
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Para testar este controle, vamos construir uma pgina simples em HTML que
contenha o boto SobreBtnX. Abra o Bloco de Notas do Windows e edite o
texto mostrado a seguir, observando que a linha classid=clsid: , dever
conter o mesmo cdigo GUID exibido, quando o controle SobreBtnX estiver
selecionado.
<HTML>
<H1> Teste de componente ActiveX</H1><p>
<HR><center><Table Border = 1>
<TR>D um clique no boto abaixo para saber mais
</TR>
<TR><TD ALIGN=CENTER>
<OBJECT
classid=clsid:D2044505-75B2-11D3-AB37-0000214D4F96"
width=280
height=50
align=center
hspace=5
vspace=5
>
</OBJECT>
</TD></TR>
</HTML>
Salve este arquivo com a extenso .htm . E abra-o no seu Browser que suporte
ActiveX.
Pgina: 87
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Quando o usurio posicionar o mouse em cima do boto Sobre, o tipo de cursor
ser mudado e, ao se dar um clique, ser mostrada a janela Sobre.
FORMULRIO ACTIVEX
No formulrio ActiveX que agora vamos construir, iremos exibir um arquivo .avi
em um controle TPanel e teremos tambm o boto SobreBtn para informar a
identificao do programador. Este formulrio tambm pode ser includo em
uma pgina HTML, mas desta vez iremos utilizar um construtor de pgina de
teste do Delphi.
Inicie um novo projeto selecionando File >> New >> ActiveX >>
ActiveXLibrary, para iniciar um projeto ActiveX, e depois inicie um novo for-
mulrio selecionando File >> New >> ActiveX >> ActiveForm.
No ActiveForm Wizard, defina os nomes do formulrio e do arquivo da unidade
deste formulrio.
Pgina: 88
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Crie o formulrio mostrado na figura a seguir:
Pgina: 89
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Digite o cdigo mostrado a seguir, para o boto Iniciar :
procedure TActiveFormX.IniciarBtnClick(Sender: TObject);
begin
Screen.Cursor:= crHourglass;
MediaPlayer.FileName:= C:\...\Demos\coolstuf\cool.avi;
MediaPlayer.Display:= Panel;
MediaPlayer.Open;
Screen.Cursor:= crDefault;
end;
No cdigo acima, o cursor do mouse ser mudado para a ampulheta enquanto o
arquivo .avi est sendo carregado no MediaPlayer. Definimos tambm que
este arquivo dever ser exibido no controle Panel - MediaPlayer.Display:=
Panel - e s ento o mouse voltar forma Default, liberando o uso do progra-
ma.
Aps isto, o formulrio j poder ser registrado no Windows, selecione Run >>
Register ActiveXServer. Se todo o cdigo estiver correto, ser exibido o
quadro mostrado a seguir.
E ento, poderemos abrir a Type Library e verificar o cdigo GUID do
ActiveFormX criado.
Para que o Delphi faa uma pgina de teste escolha Project >> Web
Deployment Options..., definindo as pastas de trabalho e tambm o endereo
URL do nosso formulrio.
Pgina: 90
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
Agora selecione Project >> Web Deploy para que o Delphi gere o arquivo
.htm de teste.
A listagem mostrada a seguir, mostra o arquivo .htm gerado pelo Delphi na pasta
que foi definida na caixa de dilogo Web Deployment Options.
<HTML>
<H1> Delphi 4 ActiveX Test Page </H1><p>
You should see your Delphi 4 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT
classid=clsid:D2044511-75B2-11D3-AB37-0000214D4F96"
codebase=C:/Meus Documentos/Web/Project2.ocx
#version=1,0,0,0
width=284
height=180
Pgina: 91
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
align=center
hspace=0
vspace=0
>
</OBJECT>
</HTML>
Abra o seu Browser chamando o arquivo .htm gerado. E para testar o formul-
rio, d um clique no boto Iniciar, e aps a carga do arquivo .avi, clique no boto
play ( ) do controle MediaPlayer, exibindo a animao. O boto SobreBtn
funcionar do mesmo modo que no formulrio comum, um formulrio ActiveX,
ou sozinho como componente de uma pgina HTML.
Pgina: 92
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
LISTA DE EXERCCIO
1. Quais as diferenas entre os componentes de acesso a banco de dados e os
de Visualizao de dados ?
2. Em que condies utilizamos o componente PageControl ?
3. O que SQL, e para que serve ?
4. Quais as diferenas entre um ambiente cliente/servidor e um banco de dados
local ?
5. Em uma linguagem orientada a objetos, o que so componentes ?
6. Quando criamos um novo objeto, ele deve ser descendente de outro? Porqu
?
7. Qual a utilidade dos componentes ActiveX ?
8. O banco de dados DBDEMOS possui uma tabela de nome Vendors, atravs
do programa Database Explorer, verifique os seus ndices e campos. Com
estes dados mo, construa mais uma pgina para exibir os dados de vende-
dores no sistema de vendas.
9. Inclua na pgina de Vendedores um boto de comando que chame um formu-
lrio de pesquisa exibindo os nomes por ordem alfabtica.
10. No programa para SQL, escreva uma instruo que informe a quantidade de
peas que cada vendedor vende.
11. Crie uma instruo SQL que informe as mdias de preos das peas - utilize
os campos Cost e ListPrice.
12. Escreva uma outra instruo SQL que exiba a quantidade total vendida de
cada pea com sua descrio e preo de venda - ListPrice.
13. Na pgina de Pesquisa do nosso programa Sistema de Vendas, inclua um
boto de pesquisa que informe as peas com a quantidade em estoque - OnHand
- abaixo de 25 unidades. Indicando o cdigo da pea, sua descrio, o nome
do vendedor(es) e seu telefone.
Pgina: 93
Delphi 4 - Avanado

Celta Informtica - F: (11) 4331-1586
14. Inclua no formulrio do Sistema de Vendas mais uma pgina para informar
dados sobre as peas, com um componente Grid exibindo o cdigo da pea,
sua descrio, preo de venda e de compra e a margem de lucro. Observe
que o campo margem de lucro dever ser um campo calculado.
15. Quando trabalhamos com o controle TQuery, notamos que existem poucas
diferenas entre ele e o controle TTable. Monte um relatrio baseado numa
instruo SQL que liste as peas com estoque baixo <25, utilizando um com-
ponente TQuery como ligao entre o banco de dados e este relatrio.
16. Monte um outro relatrio que emita um formulrio semelhante um pedido,
com as informaes do Cliente, nmero do pedido, descrio das peas e
quantidades.
17. O que so pacotes de componentes ?
18.
Crie um novo componente baseado no controle Image, que possua uma figura e,
ao passar o mouse sobre esta figura, aparecer o seu nome.
19. Monte um projeto que utilize o controle construdo anteriormente.
20. Projete um componente baseado no TComponent que possa realizar um teste
no dgito de verificao em um cdigo de identificao, semelhante ao CPF.
Quando a digitao for incorreta, o usurio ser informado e o contedo do
quadro de texto apagado.
21.Transforme o controle criado anteriormente, em um componente ActiveX e
inclua-o em uma pgina HTML.
22.Coloque este mesmo componente em um formulrio ActiveX, que contenha
um quadro de edio e outro para exibir o cdigo, se este for digitado correta-
mente. E que apresente um arquivo AVI na sua abertura, sem a visualizao
do componente MediaPlayer.
Celta Informtica
http://www.celtainformatica.com.br