Bíblia Delphi

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 182

Borland

Desvendando o Caminho das Pedras

Fernando Anselmo

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Dez 1995 - Mai 1997

Desvendando o Caminho das Pedras


Copyright

1995-97 Fernando Antonio F. Anselmo.

Todos os nomes dos produtos citados so marcas registradas da Borland International, Inc.
Outros produtos citados so marcas registradas no respectivo cabealho
As vrias Marcas Registradas que aparecem no decorrer deste livro. Mais do que simplesmente listar esses nomes e informar quem possui seus direitos de
explorao, ou ainda imprimir o logotipo das mesmas, o autor declara estar utilizando tais nomes apenas para fins editoriais, em benefcio exclusivo do dono da
marca registrada, sem inteno de infringir as regras de sua utilizao.

ii

SUMRIO
Desvendando o Caminho das Pedras

INTRODUO

Delphi, como Soluo para Desenvolvedores

CAPTULO I

Conceito de Programao Orientada a Objeto


Orientao a Objeto
Object Pascal
Smbolos Especiais
Palavras Reservadas
Nmeros
Constantes
Expresses
Identificadores
Declaraes
Blocos de Procedimentos ou Funes
Caractersticas de Objetos
Programando com objetos Delphi
Renomeando os objetos e os componentes

9
9
10
10
11
12
12
12
13
14
16
17
18
20

CAPTULO II

21

Conhecendo o Delphi
Elementos Visveis
Form
Code Editor
Component Palette
Object Inspector
SpeedBar
Elementos no Visveis
Project Manager
Menu Designer
Fields Editor
Repositrio de Objetos
Estrutura de Aplicaes com o Delphi 2.0
Implementao efetiva
Objetos Data Module
Dicionrio de Dados Escalvel
Herdando os Formulrios
Ferramentas Auxiliares de SQL
Monitor SQL
SQL Explorer
InterBase NT - Banco de Dados Relacional

21
21
22
23
23
24
24
24
25
25
26
27
28
29
29
30
31
32
32
33
34

CAPTULO III

35

Projeto Piloto

35
iii

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Criando o Modelo Relacional


Trabalhando com DataBase Engine Configuration
Criando o Alias
Trabalhando com DataBase DeskTop
Criando o Banco de Dados via Estrutura
Criando os Relacionamentos via Estrutura
Criando o Banco de Dados via SQL
Observaes da utilizao do SQL com o dBase

36
37
37
38
38
40
40
41

CAPTULO IV

43

Trabalhando com o Menu


Metendo a Mo na Massa
Criando a janela do menu
Inserindo os Cdigos Iniciais
Iniciando os comandos do Menu
Colocando os comandos para o Auxlio
Criando a janela Sobre o Sistema
Criando e alterando os objetos
Associando o form Sobre o Sistema ao menu
Criando a janela Splash
Criando o acesso a Base de Dados

43
43
43
46
47
48
50
50
51
52
54

CAPTULO V

57

Janela para as Tabelas


Reabrindo o seu Projeto
Alterando as Janelas Criadas
DataModules ?
Modificando as Tabelas e as Ligaes
Alterando os campos da tabela
Codificando o DataModule
Controlando a duplicao dos Campos-Chave
Finalizando o DataModule
Alterando o Formulrio
Modificando os Labels e Campos
Objeto DBNavigator
Modificando os Paineis
Modificando a Janela
Criando o terceiro Painel
Programando no formulrio
Preservando as reas de Memria
Criando Funes Globais
Alterando o Menu para receber o formulrio

57
57
58
58
58
59
60
61
62
63
64
65
65
66
66
68
68
71
74

CAPTULO VI

77

Trabalhando com janela Pai X Filha


Criando a janela automaticamente
Sobre os DataModules
Trabalhando com as Tabelas
Trabalhando com os Campos
Controlando o DataModule
Contadores
Validando os Campos
Alterando a Janela Criada

77
77
79
79
81
82
83
84
87
iv

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Organizando os Panels
Modificando os campos e Labels
Organizando os Panels
Modificando a Janela
Trabalhando com Grids
Finalmente, a programao
Consulta
Trabalhando com a rea de Transferncia
Utilizando o objeto OpenDialog
Criando o formulrio para o cadastro das msicas
Criando novos Procedimentos Globais
Alterando o Menu para receber o formulrio

87
88
88
89
91
93
94
96
96
97
100
102

CAPTULO VII

106

Trabalhando com consultas


Criando consultas para tabelas
Trabalhando com Grids
Programando no formulrio
Enviando e recebendo variveis
Alterando o formulrio fCateg
Alterando o formulrio fBasico
Criando consultas para o cadastro
Consultas SQL
Realizando Consultas com Filtros
Programando o formulrio
Criando o formulrio Gerente do Filtro
Programando o formulrio
Editando os registros

106
106
106
109
110
110
111
114
114
114
118
125
128
129

CAPTULO VIII

132

Relatrios
Trabalhando com o ReportSmith
Criando relatrio com o ReportSmith
Organizando os campos do relatrio
Associando o relatrio ao aplicativo
Programando o formulrio
Imprimindo atravs do Formulrio
Criando o Cdigo
Trabalhando com o QuickReport

132
132
133
135
135
137
138
140
141

CAPTULO IX

146

Multimdia
O que multimdia ?
Delphi and Multimedia
Objeto TMediaPlayer
Colocando as propriedade em modo Runtime
Pesquisando variveis em modo RunTime
Inserindo o multimdia para o Sistema
Desenvolvimento do CD Player

146
146
147
147
148
149
152
152

CAPTULO X

158
v

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Novos Componentes
Criando Componentes
A Classe TComponent
Um Componente Simples
Adicionando o Componente a Palheta
Criando Propriedades
Mtodos de Acesso
Criando novos tipos
Pensando em Objetos
Construindo um Objeto
Finalmente

158
158
159
159
160
161
161
162
163
163
167

APNDICE A

168

Documentao
Hardware/Software requeridos

168
168

APNDICE B

169

Converso de Campos
Tipos de Dados para o InterBase

169
170

APNDICE C

171

Aplicao rpida com o Objeto Query

171

APNDICE D

173

Imprimindo um Formulrio

173

APNDICE E

175

Trabalhando com Mscaras

175

APNDICE F

177

Trabalhando com Importao e Exportao

177

APNDICE G

180

Doze melhores dicas para o Delphi

180

vi

Introduo
Bem-vindo ao Delphi, o mais novo produto de alta performance da Borland. Delphi um
produto nico em sua categoria combinando cdigos totalmente compilveis, ferramentas visuais
e tecnologia para a composio de bases de dados escalveis, possui facilidades para um rpido

desenvolvimento em plataforma Windows e aplicaes Client/Server.


Este trabalho ser seu guia para uma rpida aprendizagem no desenvolvimento de
sistemas que gerencie bancos de dados. O Delphi encontrado em dois produtos:

Delphi Client/Server, de alta performance e facilidade para o desenvolvimento de


aplicaes e suporte a bancos de dados do tipo Cliente/Servidor.

Delphi Desktop, de alta performance e facilidade para o desenvolvimento de aplicaes e


suporte a bancos de dados locais, permitindo total portabilidade verso Client/Server.

Apresento-lhes a seguir algumas informaes detalhadas para um perfeito


desenvolvimento visual, sendo que ao final de cada captulo prtico exibido o cdigo fonte
completo seguido de um resumo dos principais comandos mostrados. Ao final deste estudo voc
encontrar apndices que lhe ajudaro a resolver pequenos problemas do dia-a-dia.

Delphi, como Soluo para Desenvolvedores


Muitas vezes nos perguntamos, e somos questionados, no porque de adotar o Delphi
como a linguagem para o desenvolvimento de sistemas ? Inicialmente, necessrio conhecer que
o Delphi oferece um rpido caminho para o desenvolvimento de aplicaes nos ambientes:

Windows , Windows 95 e Windows NT ;

Bancos de dados do tipo Cliente/Servidor: Oracle , Informix , InterBase, SyBase

Microsoft SQL Server ;

Alta performance, em sistemas crticos;

Base de Dados locais e aplicaes do tipo network;

Ambiente grfico, visual e multimdia.

Mas o que possvel fazer com ele ? possvel criar, dentre outros, os seguintes tipos de
aplicaes em Delphi :

Us-lo como a linguagem de desenvolvimento para bancos do tipo Cliente/Servidor;

Ambiente heterogneo para captura e envio de informaes em diversos tipos de arquivos


de dados;

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Um pacote corporativo de aplicaes inteligentes e interpretadores de dados.


Incorporando DLLs e EXEs externos;

Pacotes multimdia com desenho e animao;

Genricos utilitrios do Windows ;

Criao de bibliotecas (DLL) para leitura por outras aplicaes.

Mas porque arriscar em um ambiente novo quando existe no mercado linguagens mais
difundidas ? No mundo inteiro Delphi foi testado, e em 15 meses de vida produziu os seguintes
resultados:

Delphi est sendo utilizado no momento por mais de 1.500 lugares incluindo as maiores
corporaes, consultores e organizaes de treinamento;

Eleito pela Byte Magazines como Best of Comdex Award;

Vrios livros escritos;

Grupos de discusso e peridicos com dicas de desenvolvimento na WorldWibe


(Consulte s listas da InterNet atravs da palavra DELPHI);

Dezenas de bibliotecas e ferramentas para o suporte em Delphi;

Dezenas de artigos em publicaes do mundo inteiro, tais como PC Week, InfoWorld,


Computer Reseller News, PC Magazine, Windows Sources e muitas outras.

Por tudo aqui exposto fica claro que este no produto demonstra uma inovao para uma
criao em alta performance de aplicaes. Todos os recursos que voc precisar para o
desenvolvimento de seus produtos esto agora disponveis.
Feliz desenvolvimento.
Fernando Antonio F. Anselmo

Sempre que voc localizar este smbolo significa que existe uma nota que lhe ajudar
em caso de dvida.

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo I
Conceito de Programao Orientada a Objeto
Para compreendermos melhor a novo ambiente de desenvolvimento da Borland o Delphi
necessrio que voc, aprenda e, tenha em mente os conceitos de POO (Programao Orientada a
Objetos), no confunda os conceitos com POE (Programao Orientada a Eventos) muito

difundido com o Access 2.0 (um ambiente baseado em Objetos), mas ao longo deste captulo
voc vai notar as sensveis diferenas que existem entre esses dois conceitos.
A POO e a POE so facilmente confundidas, mas lembre-se a POO contm a POE mas a
POE no contm a POO, um objeto pode existir mesmo que no exista nenhum evento associado
a ele, mas um evento no pode existir se no houver um objeto a ele associado. Outra
caracterstica que pode causar confuso so ambientes Orientados a Objetos e ambientes
Baseados em Objetos. Em ambiente Orientado a Objetos consegue-se criar e manipular objetos
enquanto que o Baseado em Objetos no possivel a criao de objetos apenas a sua
manipulao.
A POO um conceito desenvolvido para facilitar o uso de cdigos de desenvolvimento
em interfaces grficas. Sendo a Borland, uma das primeiras a entrar neste novo conceito, possui
suas principais linguagens de programao (tais como Object Pascal e C++), totalmente voltadas
para este tipo de programao. A POO atraiu muitos adeptos principalmente pelo pouco uso de
cdigo que o projeto (diferente de sistema) carrega no programa fonte, ao contrrio das

linguagens mais antigas como o Clipper87 muito utilizado no final da dcada de 90 e incio da
dcada de 90. O resultado desta limpeza no cdigo resulta que a manuteno do projeto tornase muito mais simples.

Orientao a Objeto
Antes de comearmos a falar realmente de linguagem orientada a objetos e necessrio
que voc possua os conceitos bsicos da orientao a objetos, so eles:
Objeto - qualquer estrutura modular que faz parte de um produto.
Uma janela por exemplo, um objeto de uma casa, de um carro ou de
um software com interface grfica para o usurio.
Atributos - So as caractersticas do objeto, como cor e tamanho, a
janela, por exemplo, tem atributos como o modelo, tamanho, abertura
simples ou dupla, entre outros.
Encapsulao - um mecanismo interno do objeto escondido do
usurio. Uma pessoa pode abrir uma janela girando a tranca sem precisar saber o que h
dentro dela.

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Ao - a operao efetuada pelo objeto. Todas as janelas, por exemplo, controlam a


iluminao e temperatura ambiente, dependendo do seu design.
Herana - um objeto novo nem sempre criado do zero. Ele pode herdar atributos e aes
de outros j existentes. Um basculante herda atributos das janelas e das persianas.
Polimorfismo - a capacidade de objetos diferentes reagirem segundo a sua funo a uma
ordem padro. O comando abre, por exemplo, faz um objeto entrar em ao, seja ele
uma janela, uma porta ou uma tampa de garrafa.
Ligao - quando um objeto conecta a sua ao a outro. Um sensor de claridade, por
exemplo, ativa o acendimento automtico da iluminao de rua.
Embutimento - Permite a um objeto incorporar funes de outros, como um liqidificador
que mi carne com a mudana do tipo da lmina.

Object Pascal
Object Pascal uma linguagem Orientada a Objetos no pura mas hbrida por possuir
caractersticas de programao no s visual mas tambm escrita, para os programadores que j
conhecem tcnicas de estruturas de programao, com o C, Basic, Pascal ou xBASE entre outras
linguagens a Object Pascal providncia uma migrao de forma natural oferecendo um produto
de maior complexibilidade. Object Pascal fora a voc executar passos lgicos isto torna mais

fcil o desenvolvimento no ambiente Windows de aplicaes livres ou que utilizam banco de


dados do tipo Cliente/Servidor, trabalha com o uso de ponteiros para a alocao de memria e
todo o poder de um cdigo totalmente compilvel. Alm disso possibilita a criao e reutilizao
(vantagem de re-uso to sonhado com a Orientao a Objetos) de objetos e bibliotecas
dinmicas (Dynamic Link Libraries - DLL).
Object Pascal contm todo o conceito da orientao a objetos incluindo encapsulamento,
herana e polimorfismo. Algumas extenses foram includas para facilitar o uso tais como
conceitos de propriedades, particulares e pblicas, e tipos de informaes em modo run-time,
manuseamento de excees, e referncias de classes. O resultado de toda esta juno faz com que
Object Pascal consiga suportar as facilidades de um baixo nvel de programao, tais como:

Controle e acesso das subclasses do Windows (API);

Passar por cima das mensagens de loop do Windows ;

Mensagens semelhantes as do Windows ;

Cdigo puro da linguagem Assembler.

Como deu para perceber a base de toda a programao Delphi a linguagem Object
Pascal, ento neste captulo trataremos exclusivamente deste tipo de programao.

Smbolos Especiais
A Object Pascal aceita os seguintes caracteres ASCII:

10

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Letras - do Alfabeto Ingls: A at Z e a at z.

Especiais - Caracteres: + - * / = < > [ ] . , ( ) : ; ^ @ { } $ #

Dgitos - Decimal: 0 at 9 e HexaDecimal: 0 at 9 e A at F (ou a at f)


Brancos - Espao (ASCII 32) e todos os caracteres de controle ASCII (ASCII 0 at
ASCII 31), incluindo final de linha e Enter (ASCII 13).
Smbolos - Caracteres: <= >= := .. (* *) (. .) //

O colchetes esquerdo ( [ ) e equivalente ao (. e o colchetes direito ( ] ) e equivalente a


.). A chave esquerda ( { ) e equivalente ao (* e a chave direita ( } ) e equivalente a *).

Palavras Reservadas
A Object Pascal se utiliza das seguintes palavras reservadas, no podendo as mesmas
serem utilizadas ou redefinidas:
And

Exports

Library

Set

Array

File

Mod

Shl

As

Finnaly

Nil

Shr

Asm

For

Not

String

Begin

Function

Object

Then

Case

Goto

Of

To

Class

If

On

Try

Const

Implementation

Or

Type

Constructor

In

Packed

Unit

Destructor

Inherited

Procedure

Until

Div

Initialization

Program

Uses

Do

Inline

Property

Var

Downto

Interface

Raise

While

Else

Is

Record

With

End

Label

Repeat

Xor

Except

Uma outra lista a seguir, apresenta as diretivas que so utilizadas em contextos de


identificao de objetos:
Absolute

Export

Name

Published

Abstract

External

Near

Read

Assembler

Far

Nodefault

Resident

At

Forward

Override

Stored

Cdecl

Index

Private

Virtual

Default

Interrupt

Protected

Write

Dynamic

Message

Public

11

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Nmeros
possvel definir variveis e constantes de tipos de Inteiro ou Real atravs de qualquer
decimal ordinrio ( 0 a 9 ), mas a Object Pascal tambm aceita a notao Hexadecimal utilizados
com o prefixo dollar ( $ ) ou a notao cientfica ( E ).

Constantes
Uma constante um identificador com valor(es) fixo(s). Um bloco de declaraes
constante possui a seguinte expresso:
[Declarao Constante] [Identificador] (=) [constante] (;)
A lista abaixo apresenta um conjunto de funes que podem ser utilizadas para a
declarao das constantes:
Ab

Length

Ord

SizeOf

Chr

Lo

Pred

Succ

Hi

Low

Ptr

Swap

High

Odd

Round

Trunc

Alguns exemplos para a definio de Constantes:


const Min = 0;
Max = 100;
Centro = (Max - Min) div 2;
Beta = Chr(225);
NumLetras = Ord('Z') - Ord('A') + 1;
MensOla = 'Instruo invlida';
MensErro = ' Erro: ' + MensOla + '. ';
PosErr = 80 - Length(MensErro) div 2;
Ln10 = 2.302585092994045684;
Ln10R = 1 / Ln10;
DigNumericos = ['0'..'9'];
LetrasAlpha = ['A'..'Z', 'a'..'z'];
AlphaNum = LetrasAlpha + DigNumericos;

Expresses
As expresses em Object Pascal (como em qualquer linguagem) formada por
operadores e operandos; os operadores so divididos em quatro categorias bsicas:
nicos

@, Not

Multiplicativos

>, /, div, mod, and, shl, shr, as

Adicionais

+, -, or, xor

Relacionais

=, < >, <, >, < =, > =, in, is

As expresses obdecem as regras bsicas de lgica para a precedncia da execuo das


operaes.

12

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Identificadores
Identificadores podem ser constantes, tipos, variveis, procedures, funes, unidades,
programas e campos de registros.
No existe limite de caracteres para o nome de um identificador mas apenas os 63
primeiros caracteres so significantes (no podendo ser idntico ao nome das palavras
reservadas). O nome de um identificador deve ser iniciado por Letras ou o carcter underscore ( _
). O resto formado por Letras, Dgitos, carcter underscore (ASCII $5F). No permitido a
utilizao de espaos para a formao do nome.

Exemplo de identificadores vlidos: Form1, SysUtils.StrLen, Label1.Caption


with... do...;
Delimita um determinado bloco de declaraes para um identificador especfico evitando a declarao deste
identificador. A sintaxe do comando : WITH {nome do identificador} DO {comandos};. Ex:
begin
{ ... comandos iniciais ... }
with form1 do
begin
Caption := Teste;
BorderStyle := bsSizable;
end;
end;

Equivalente a Form1.Caption
Equivalente a Form1.BorderStyle

array [ ... ] of ...;


Define um conjunto de variveis ou constantes de um mesmo tipo. A sintaxe do comando : array
[{quantidade de ocorrencias}] of {Tipo};. Os arrays so controlados por trs funes:
Funo

Valor de Retorno

Low

Primeiro elemento

High

Aponta para o ltimo elemento

SizeOf

Tamanho do array

Ex:
const
t: array [1..50] of Char { Declara 50 elementos para o tipo Char }
var
s : array[1..100] of Real { Declara 100 elementos para o tipo real }
ind: Integer;
begin
for Ind := Low(s) to High(s) do s[Ind] := 0; { Zera os elementos do array S }
if SizeOf(t) = C then exit;
{ Se o ltimo elemento do array T for C sai do bloco }
{ ... outros comandos... }
end;

13

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Declaraes
Declaraes descrevem aes de um algortmo a serem executadas.

begin... end;
Prende um conjunto de declaraes em um bloco de comandos determinado. A sintaxe do comando :
BEGIN {comandos} END;. Ex:
begin
{ ... comandos iniciais ... }
begin
{ ... bloco 1 ... }
end;
begin
{ ... bloco 2 ... }
end;
{ ... comandos finais ... }
end;

if... then... else...;


Esta expresso escolhe entre o resultado de uma condio booleana o caminho verdadeiro (then) ou falso
(else). A sintaxe do comando : IF {condio} THEN {bloco de comandos} ELSE {bloco de
comandos};. Ex:
begin
{ ... comandos iniciais ... }
if x > 2 then
{ ... Bloco verdadeiro ... }
else
{ ... Bloco falso ... };
end;

goto... ;
Transfere a execuo de um programa para o ponto determinado pelo Label. A sintaxe do comando :
GOTO {Label};. Ex:
label
primeiro;
begin
{ ... comandos iniciais ... }
if x = 2 then
goto primeiro;
{ ... outros comandos ... }
Primeiro:
{ ... comandos do Primeiro ... }
end;

14

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

case... of... else... end;


Consiste de uma lista de declaraes que satizfaz a condio de um seletor de expresses, se nenhuma parte
da lista satisfizer ao seletor executa os comandos do sub-comando else. Para o seletor sero vlidos os
tipos definidos, tipo Inteiros ou LongInt. A sintaxe do comando : CASE {seletor} OF {Expresso 1}:
{comando da expresso 1}; {Expresso 2}: {comando da expresso 2}; {Expresso n}: {comando
da expresso n} ELSE {comando}; end;. Ex:
begin
{ ... comandos iniciais ... }
case x of
1: { ... Bloco para x = 1 ... }
2, 3: { ... Bloco para x = 2 ou X = 3... }
4..6: { ... Bloco para 4 <= x <= 6 ... }
else
{ ... Bloco para x < 1 ou x > 6 ... };
end;
end;

repeat... until;
Repete um determinado bloco de declaraes at a condio booleana do subcomando until ser satisfeita. A
sintaxe do comando : REPEAT {comandos}; until {condio};. Ex:
begin
{ ... comandos iniciais ... }
x := 0;
repeat
x := x + 1
until (x = 2);
end;

for... to (downto)... do...;


Incrementa em 1 uma determinada varivel inteira, repetindo um bloco de comandos, at que esta atinja o
valor final do intervalo, o subcomando downto realiza o incremento reverso. A sintaxe do comando :
FOR {variavel} := {valor inicial} to (downto) {valor final} do {bloco de comandos};. Ex:
begin
{ ... comandos iniciais ... }
for i := 1 to 10 do
{ ... Comandos A ... }
for s := 10 downto 1 do
{ ... Comandos B... }
end;

Executa o [comandos A] para i = 1,2,3,4,5,6,7,8,9 e 10


Executa o [comandos B] para i = 10,9,8,7,6,5,4,3,2 e 1

while... do...;
Repete um bloco de comandos enquanto que determinada condio booleana seja satisfeita. A sintaxe do
comando : WHILE {condio} DO {bloco de comandos};. Ex:
begin
{ ... comandos iniciais ... }
while i := 1 do

Repete o [Bloco de comandos] enquanto i = 1

15

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ ... Bloco de comandos ... }


end;

break; ou continue...;
O comando break interrompe um bloco de repetio for, while ou repeat saindo do bloco. A sintaxe do
comando : BREAK; enquanto que o comando continue retorna a primeira instruo do bloco de
repetio for, while ou repeat. A sintaxe do comando : CONTINUE;. Ex:
begin
{ ... comandos iniciais ... }
for i := 1 to 10 do
begin
if i = 8 then
break;
{... comandos A...}
if i = 5 then
continue;
{... comandos B ...}
end;
{... comandos C ...}
end;

Salta para os [comandos C]


Retorna para o comando for pulando os [comandos B]

Blocos de Procedimentos ou Funes


As procedures ou funes so declaradas na seo de tipos de declaraes (abaixo do
comando type) pertencendo ao objeto ou serem do tipo public (pblicas - executadas por outras
unidades) ou private (particulares - restritas a unidade local).

Procedure
procedure {cabealho}; var {declarao das variveis}; {bloco de comandos};

O cabealho da procedure composto pelo nome do procedimento e variveis que sero


recebidas (ou modificadas atravs da declarao var, ex: procedure teste(var x:string);).
procedure soma(a,b: integer);
var
c: integer;
begin
c := a + b;
end;

Incio enviando as variveis A e B do tipo inteiro.


Declarao de variveis locais.
Corpo do procedimento.

Function
function {cabealho} : {resultado}; var {declarao das variveis}; {bloco de comandos};

As funes se diferem dos procedimentos pela obrigatoriedade do retorno de um


resultado, podendo este resultado ser retornado pela declao: {nome da funo} := valor ou
result := valor.
function soma(a,b: integer) : integer;

Incio enviando as variveis A e B do tipo inteiro.

16

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Corpo do procedimento.
ou result := a + b;

begin
soma := a + b;
end;

Junto com o Delphi 2.0 vem o manual de Object Pascal em formato .HLP, caso a
linguagem seja novidade para voc aconselho que voc d uma boa olhada (o Delphi 1.0 traz o
mesmo manual, mas em formato .PDF), mas no se preocupe com o que foi explicado acima j
est mais do que suficiente para uma boa inicializao com o Delphi.
Tudo o que vimos a cima o que normalmente temos em outras linguagens comuns, mas
o caracteriza realmente a linguagem Orientada em Objetos o trabalho e a manipulao com os
mesmos.

Caractersticas de Objetos
Mas afinal de contas, o que um objeto ? Como foi dito anteriormente, um objeto
qualquer tipo de elemento, ou componente, que envolva dados e cdigo dentro de um nico
pacote.
Uma vantagem de programar na POO e quanto a Herana dos objetos, este mtodo faz
com que seja possvel um objeto Filho poder herdar todas as caractersticas e contedos de um
objeto Pai. Tirando um pouco do Pascal da geladeira (a partir do Pascal verso 7.0 a Borland
tornou possvel a utilizao simplificada de todo o conceito de POO) aqui vai um cdigo
completo de declarao de dois objetos, o primeiro chamado de TPai e o segundo de Tfilho:
TPai = object
Nome: PChar;
constructor Init (P: PChar);
destructor Done;
procedure MudaNome(P: PChar);
procedure ShowName;
end;
TFilho = object(TPai)
procedure MudaNome(P: PChar);
end;

O segundo objeto TFilho herda do objeto TPai o ponteiro varivel Nome, a constructor
Init, o destructor Done e a procedure ShowName, apenas a procedure MudaNome ter o
funcionamento como uma caracterstica nica para cada objeto. O Delphi possui inmeros pais
(classes de objetos) prontos para serem usados por voc, tais como:
TForm: Centro das aplicaes Delphi, utilizados na criao de janelas, caixas de dilogo entre outros.
TMenu: Responsvel pela concepo de menus e menu popup.
TButtonControl: Simplifica o refinamento do controle da janela serve de base para os componentes como: Botes,
Check Box e Radio Box.

17

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Programando com objetos Delphi


Quando iniciado o Delphi, criado automaticamente um novo projeto e um objeto
formulrio (derivado da classe TForm) para o suporte dos demais objetos. Explorando o Editor
de Cdigos (Code Editor) voc poder observar a declarao do novo objeto da classe TForm que
foi produzido automaticamente com a criao do novo formulrio. Examinando o contedo deste
cdigo criado para o objeto, teremos:
unit Unit1;

Abertura de uma nova unidade

interface

Parmetros do obejetos

uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

Uso de outras unidades

A declarao do objeto inicia aqui

Aqui o final da declarao

var
Form1: TForm1;

Atribui a varivel Form1 as caractersticas do objeto TForm1

implementation

Incio da parte a ser implementada

{$R *.DFM}

Diretiva de compilao que agrega o desenho da tela (em

end.

.DFM) com o mesmo nome da unidade


Final da parte implementada

Um novo tipo de objeto TForm1, declarado derivado da classe TForm, que tambm
um outro objeto. Relembre um objeto um tipo de elemento capaz de guardar dados e cdigo
dentro de um nico pacote. At agora, o tipo TForm1 no contm campos ou mtodos, isso
acontecer com a adio de alguns componentes neste objeto.
Observando o cdigo, notamos que existe uma varivel declarada com o nome Form1
para o novo tipo de objeto TForm1:
var
Form1: TForm1;

Form1 a chamada de instncia ao tipo TForm1. Esta varivel refere-se ao formulrio


em si, aonde ser adicionado componentes e desenhado a interface entre o computador e o
usurio que for operar o sistema. sempre notado declaraes de uma ou mais instncias
referidas ao tipo de objeto. Futuramente ser mostrado o poder deste tipo de declaraes quando
falarmos sobre janela MDI (Multiple Document Interface - Interface de documento mltiplos)
gerenciando vrias janelas filhas, no permitindo que estas janelas filhas saiam do espao
criado pela janela pai.

18

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Adicionando alguns componentes ao formulrio, veremos como o Delphi completar a


aplicao escrevendo automaticamente o cdigo, e permitindo que ao final tornar-se- possvel a

compilao (lembra-se do Clipper , com .EXE), execuo e distribuio da aplicao.


Em nosso formulrio, colocaremos um boto que, em tempo de execuo, ao ser dado um
clique com o mouse sobre este objeto, o formulrio mude sua cor. Aperte a tecla F12 para
retornar a viso do formulrio e na palheta de objetos (Componnent Pallete) clique no objeto
(button localizado na pgina Standard) e clique no formulrio. Na janela da Object
Inspector clique na pgina Events e clique duas vezes sobre a ao OnClick e insira o seguinte
cdigo:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Color := clGreen;
end;

Reparando no cdigo completo da aplicao, veremos:


unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Um novo dado foi aqui inserido


Declarado um novo mtodo

var
Form1: TForm1;
implementation
{$R *.DFM}

O cdigo do novo mtodo

procedure TForm1.Button1Click(Sender: TObject);


begin
Form1.Color := clGreen;
end;
end.

O novo objeto TForm1 agora apresenta um campo Button1 - o boto que voc adicionou
ao formulrio. TButton e o tipo do objeto, e Button1 o objeto boto propriamente dito. Com o
tempo voc colocar novos componentes ao formulrio.

19

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Rode o projeto, clicando no boto


(Run), d um clique no boto e veja o que
acontece. Pare a aplicao fechando a janela com Alt+F4.

S por curiosidade, salve este arquivo, feche-o e abra o arquivo UNIT1.DFM (com a
opo File | Open File...) notaremos que o Delphi criou um arquivo com todas as propriedades
dos objetos criados e que a declarao do objeto Form1 engloba todos os outros, noes de
Encapsulamento.

Renomeando os objetos e os componentes


Voc sempre deve utilizar a janela do Object Inspector para renomear os objetos criados.
Por exemplo, o nome padro do formulrio e Form1 mude a propriedade Name para fCores. O
Delphi se encarregar de mudar qualquer referncia que existia ao Form1. Ento o cdigo
apresentar a seguinte modificaes:
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TfCores = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Aqui foi modificado

var
fCores: TfCores;

Aqui foi modificado

implementation
{$R *.DFM}

Aqui foi modificado

procedure TfCores.Button1Click(Sender: TObject);


begin
Form1.Color := clGreen;
end;

Aqui no !!!

end.

O Delphi modificar apenas os cdigos gerados automaticamente pr ele. Os cdigos


para a ao OnClick foram gerados por voc e o Delphi no os modificar. Cabe a voc a
manuteno neste caso. Isto foi idealizado para preservar o contedo original do seu cdigo.

20

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

procedure TfCores.Button1Click(Sender: TObject);


begin
fCores.Color := clGreen;
end;

Captulo II
Conhecendo o Delphi
Se voc teve algumas dvidas no captulo anterior sobre a rea de trabalho do Delphi no
se preocupe, neste captulo voc poder san-las completamente, tambm ser mostrado o mtodo
de estrutura de aplicaes Client/Server.

Caso voc seja usurio do Delphi 1.0 na barra de menu selecione a opo Help e
Interactive Tutors, voc receber uma aula On-Line sobre a nova rea de trabalho.
Os elementos da interface Delphi foram divididos do seguinte modo:

Elementos Visveis
O ambiente de trabalho do Delphi formado por objetos que esto visveis to logo que o
aplicativo seja iniciado formando a rea de trabalho.

21

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Viso Geral dos objetos visveis do Ambiente Delphi

Form
Os formulrios (objeto Form) so os pontos centrais para o desenvolvimento Delphi.
Voc se utilizar deles para desenhar sua comunicao com o usurio, colocando e organizando
outros objetos. Estes objetos so arrastados da Component Palette, mostrada na janela localizada
acima.
Voc pode imaginar que o formulrio um objeto que contm outros objetos. Sua
aplicao ficar localizada em um formulrio principal e este interagir com outros formulrios
criados. possvel aumentar, mover ou ocupar completamente a tela do monitor, ou at mesmo
ultrapass-la. Um formulrio bsico inclui os seguintes componentes:

Controles de menu;
Botes de maximizao e minimizao;
Barra de ttulo; e
Bordas redimensionveis.

O cdigo gerado, na rea conhecida como Code Editor, fica exatamente atrs do objeto
formulrio, clique na barra de notas, em Unit1, se alguma coisa for desconhecida para voc, leia
maiores explicaes no Captulo I.

possvel enviar um formulrio para a impressora, para isto existem duas maneiras:
1. Tipo um PrintScreen de Tela, coloque o seguinte comando [Nome do
formulrio].Print; no evento onShow do formulrio; ou

22

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

2. Para imprimir um formulrio no tamanho de um papel A4, atravs do uso de


comandos da biblioteca Printer, veja o Apndice D para maiores detalhes.

Code Editor
O editor de cdigos providncia total acesso ao cdigo gerado pelo projeto, incluindo
alguns dos mais poderosos recursos para a edio. Pode ser selecionado tipos de cores para os
elementos do programa (como por exemplo comentrios, palavras reservadas, cdigos assembler,
...) para tanto a partir do menu principal entre em Tools | Options..., localize a pgina Colors.

Para

outras informaes adicionais sobre o modo de usar este editor, procure


referncias no Help OnLine no tpico Code Editor.
Ao ser aberto um novo projeto, o Delphi gera automaticamente na pgina do Code Editor
uma Unit com o arquivo cdigo (.PAS). Para ver o cdigo de uma Unit em particular,
simplesmente Click na tabulao de pgina. O Code Editor mostrar sempre o nome do arquivo
corrente ativo na tabulao de pgina.

possvel alternar entre o objeto Form e a Code Editor atravs do pressionamento


da tecla F12, do boto boto
(Toggle Form/Unit) da SpeedBar, ou ainda atravs das opes
do menu View | Toggle Form/Unit. (curiosidade: o acesso rpido atravs da tecla Alt + Letra
sublinhada para esta opo est marcado sobre a letra G)

Component Palette
Componentes (ou objetos) so os elementos que voc usar para trabalhar com a
aplicao. Foram includos objetos em vrias pginas, tais como caixas de dilogos e botes, a
palheta inclui tambm alguns espaos em branco para ser permitida a adio de novos objetos.
Alguns objetos no sero visveis enquanto a aplicao estiver executando, eles fazem parte do
servio da DDE (Dynamic Data Exchange).
Os objetos da palheta foram divididos em grupos de funcionalidade em diferentes

pginas. Por exemplo, os objetos que representam as janelas tradicionais do Windows (tais como
fontes, palheta de cores, ...) foram colocados na pgina Dialogs da palheta.
Voc poder criar seus prprios objetos como tambm instalar outros j prontos, para isso
foi colocado os espaos vazios. Por exemplo poder ser instalado novos controles e objetos do

Visual Basic 4.0 (Objetos OCX - ou para os portadores do Delphi 1.0 o do Visual Basic 3.0
os objetos VBX). Uma das principais vantagens da POO que muito em breve dever ser
colocado no mercado pacotes de objetos prontos para serem integrados aos sistemas o que
facilitar ainda mais o desenvolvimento e a manuteno dos mesmos.

23

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Object Inspector
Providncia a conexo entre a interface visual e o cdigo. Composto por duas pginas
Properties (propriedades) e Events (Eventos) que mostrar as propriedades e eventos do objeto
selecionado.
Disponibiliza um fcil caminho para a personalizao dos objetos. Voc usar a pgina
de Propriedades para personalizar os objetos colocados no formulrio (inclusive o prprio
formulrio), e a pgina de Eventos para gerenciar a navegao entre certas partes do cdigo do
programa.
O seletor de objetos (Object Selector - localizado em um objeto do tipo ComboBox no
topo do Object Inspector) mostra o nome e o tipo de todos os componentes do formulrio
corrente (inclusive o prprio). Voc pode usar o seletor de objetos para localizar facilmente
qualquer objeto no formulrio.

SpeedBar
Contm os botes mais freqentemente utilizados. Fornecendo deste modo um atalho de
navegao ao menu principal do Delphi.
possvel a personalizao da SpeedBar colocando nela os caminhos do menu principal
que voc mais utiliza, bastando para isso:
1. Redimensione a SpeedBar. Para tanto posicione o cursor do mouse sobre o ponto de
encontro da SpeedBar com a Component Palette conforme o desenho abaixo:

2. Quando o cursor do mouse mudar de formato, clique o boto esquerdo do mouse e arraste
abrindo a rea da SpeedBar.
3. Clique com o boto direito do mouse na rea aberta, aparea um menu PullDown
contendo entre outras opes a opo Properties, selecione-a.
4. As categorias e os comando so divididos de acordo com o menu, clique em cima dos
comandos disponveis e arraste-os para a rea aberta de acordo com a sua necessidade,
para retirar os botes da SpeedBar faa o processo inverso.

Elementos no Visveis
Alguns elementos no esto prontamente visveis quando o Delphi iniciado mas voc
poder ter acesso a eles bastando para isso selecionar a opo na barra de menu.

24

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Project Manager
O Gerenciador de Projetos contm uma lista de formulrios ou unidades utilizados pela
aplicao, e serve para controlar estes formulrios ou unidades, adicionando-os ou removendo-os
do projeto, organizando as opes do projeto, entre outros.

Voc tambm poder colocar um boto para iniciar o Gerenciador de Projetos atravs
da SpeedBar

Menu Designer
O Menu Designer permite a criao de menus para os seus formulrios. Voc pode criar
menus ou menus do tipo pulldown atravs dos objetos MainMenu ou PopupMenu (localizado na
pgina Standard na Component palette). A criao completa de Menus ser colocada de forma
mais abrangente no Captulo IV.

25

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Fields Editor
Para o Delphi possvel editar e modificar as propriedades de quaisquer campos dos
objetos de tabelas associadas ao banco de dados, a Fields Editor em conjunto com a Object
Inspector controlam o modo de mostrar determinados campos de arquivos, importante lembrar
que esta modificao no afetar os campos da tabela, apenas para o formulrio ativo em questo.
Sua utilizao efetiva ser mostrada a partir do Captulo V.
Add fields... responsvel pela adio de
definies de campos da tabela, possvel inserir
um ou mais campos, dependendo de sua
utilizao para o formulrio.
New field... permite a criao de um novo
campo, este pode ser a derivao de um ou mais
campos da tabela.
Cut envia para rea de transferncia e elimina
todas as definies do campo selecionado.
Copy copia para a rea de transferncia todas as
definies do campo selecionado.
Paste recebe da rea de transferncia todas as
definies do campo selecionado criando-o.
Delete exclui quaisquer definio para os
campos.
Select all seleciona todas as definies dos
campos.
Retrieve Attributes atualiza os atributos do
campo selecionado com os campos do dicionrio
de dados.
Save attributes salva os atributos do campo
selecionado para o dicionrio de dados.
Save attributes as... salva os atributos do campo selecionado para o dicionrio de dados permitindo a
renomeao do campo.
Associate attributes... faz a associao dos atributos do campo selecionado com determinado campo do
dicionrio de dados.
Unassociate attributes remove a associao dos atributos do campo selecionado com determinado campo
do dicionrio de dados.

26

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Repositrio de Objetos
O Repositrio de Objetos do Delphi 2.0 armazena e gerencia os objetos da aplicao:
Formulrios, Data Modules, geradores experts, e DLL (Dinamic Linked Library - Bibliotecas de
acesso dinmico). Na essncia, ele centraliza as localizaes dos objetos envolvidos agrupado-os.
A proliferao dos objetos no repositrio incrementa as seguintes vantagens:

Suporte a equipe de desenvolvimento para referncia aos objetos da rede.

Uma customizao de todo o desenvolvimento em grupos lgicos de objetos, facilitando


o re-uso dos mesmos.

O Delphi possui diversas caractersticas quanto a sua utilizao. Tem os Tutors e Experts
que so as ferramentas responsveis para guiar-nos atravs de tcnicas, tais como, manipulao
de componentes e criao de simples aplicaes. Alm disso o Delphi oferece uma coleo de
modelos para formulrios, janelas de dilogo e at mesmo aplicaes completas na ferramenta
New Items. A janela do New Items sempre chamada automaticamente quando a opo File |
New... do menu principal executada.

possvel para voc criar novas janelas, ou projetos, automticos no Delphi. Para a
nossa sorte a Borland no esconde o jogo e mostra como se cria uma template visite o diretrio
\BORLAND\DELPHI 2.0\OBJREPOS, o equivalente no Delphi 1.0 encontrado no diretrio
\DELPHI\GALLERY, todos os exemplos so auto-explicativos.

Para definir o projeto padro que o New Items executar no incio de cada projeto,
clique com o boto direito acima da janela e escolha a opo Properties aparecer as listas Pages
e Objects, defina quaisquer dos objetos como New Form ou Main Form.

Observe que a segunda folha da janela New Items (ter o nome do seu arquivo com a
extenso .DPR) o seu projeto corrente, ou seja, uma nova janela poder ser derivada, por
caracterstica de herana, de uma outra janela j existente.

27

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Estrutura de Aplicaes com o Delphi 2.0


Um dos objetivos de desenhar aplicaes do tipo Client / Server para o desenvolvimento
a reutilizao dos objetos, das regras de negcio e das telas do projeto. O Delphi Client / Server
Suite 2.0 o nico que implementa uma arquitetura incorporando a tecnologia RAD (Rapid
Application Development - Desenvolvimento Rpido de Aplicaes) com o desenvolvimento
totalmente OO (Object Orientation - Orientado a Objetos) para a reduo do tempo de
desenvolvimento e manutenes improvveis. Adicionando, uma arquitetura aonde possvel a
separao da GUI (Grafic Unit Interface - Unidade de Interface Grfica), das regras de negcio
lgicas e do desenho do banco de dados de acordo com o modelo representado abaixo:

Benefcios:
1. A separao do desenho da GUI (atravs dos objetos Forms) com a rea de ligao
lgica de dados (atravs dos objetos Data Modules) permite que se cause um menor
impacto sobre ambas as reas. As mudanas podem ser executadas nas telas de entrada ou
nas ligaes, independentemente, de acordo com os requerimentos do usurio.
2. A separao do desenho da GUI com a rea de ligao lgica de dados realizada com
uma certa habilidade aos eventos envolvidos, poder no necessariamente dever ser
controlada por um habilidoso DBA (Database Administrator - Administrador de Banco
de Dados), com suas fantsticas regras de negcio, podendo inclusive ser mantida por um
analista de informaes.

28

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

3. O desenho do banco de dados, a construo das metodologias de negcio e o desenho e a


criao das janelas de entrada so efetivados dentro da aplicao. O desenvolvimento,
ento paralelamente, resultar em uma maior rapidez.
4. Herdando as janelas de entrada, em nveis de utilizao, reduz-se drasticamente o
processo de codificao, e em conseqncia, o processo futuro de manuteno. As
mudanas lgicas das regras de negcio ou a incorporao de novos padres, so feitas
automaticamente para todos os objetos herdados.
5. O repositrio de objetos, os formulrios reusveis e a utilizao dos objetos Data
Modules, envolve em eliminao da duplicao de cdigos e de trabalhos com desenhos
de janelas, e em conseqncia na reduo da equipe de desenvolvimento.

Implementao efetiva
Objetos Data Module
A partir do Delphi 2.0 foi incorporado o uso de objetos conhecidos por Data Module,
que servem para que suas aplicaes providenciem um desenho centralizado da definio de
acesso aos dados e das regras de negcio. Os objetos Data Modules, tambm podem ser
separados por negcios lgicos (como exemplo por reas: compras, vendas, estoque, etc.)
formando caminhos de conexes simples.

Os objetos Data Modules podem ser aplicados a objetos tais como Tables, Stored
Procedures, ou Queries permitindo a centralizao dos eventos envolvidos em antes e

29

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

depois da gravao, excluso, insero ou edio dos dados. E at mesmo na colocao


de novos objetos de controle para maior facilidade.

As relaes de dados Master / Detail so definidas em menor quantidade. Possibilita


ento ao desenvolvedor criar aplicaes do tipo Client / Server de forma mais fcil,
rpida, e segura se utilizando das propriedades dos objetos Datasources ou utilizando o
Database Form Expert.

Os formulrios das aplicaes, podem ser ligados diretamente a um ou mais objetos Data
Module para a propagao das regras de negcio sem a necessidade de execuo de um
cdigo extra.

Os objetos Data Modules so classes de objetos que pertencem a interao dos dados do
database server. Isolando totalmente o acesso ao banco de dados com a aplicao Client,
simplificando deste modo toda a manuteno realizada.

O Acesso ao Delphi aos bancos de dados se processa da seguinte maneira:

Distribuio Lgica da Aplicao:


Os objetos Data Module foram desenvolvidos para criar uma centralizao lgica de
todas as regras de negcio, separando a rea de viso do usurio com a rea do desenho do Banco
de Dados. Este slido fundamento de suporte so distribudos em um n-nmero de aplicaes e
arquiteturas servidoras disponveis, tais como CICS da IBM, TopEnd da ATT, Tuxedo da
Novell, Object Broker da Digital, IONA da Orbix e muitas outras.

Dicionrio de Dados Escalvel


O dicionrio de dados utilizado para armazenar informaes sobre o uso dos dados
contidos nas suas tabelas. O dicionrio deve ser como uma rvore genealgica trabalhando como
um inspetor de modificaes que permitem um armazenamento facilitado. O dicionrio deve
conter informaes dos atributos dos campos tais como: valores mnimo, mximo e comuns
(valores default), mscaras utilizadas, etc. A utilizao do dicionrio de dados traz as seguintes
vantagens:

30

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1. Consistncia: Campos idnticos so armazenados centralmente no dicionrio isto reduz


o tempo de definio das duplicidades. Um desenvolvedor poder criar os campos
complementares com domnios e aplicaes apropriadas.
2. Reduo do Trfico da Rede: O Delphi permite que a validao dos dados seja feita nas
mquinas client ou no servidor. O Dicionrio de dados permite que a manuteno dos
atributos dos campos do lado client seja validado de forma eficiente reduzindo a
necessidade do trfego da rede.

Herdando os Formulrios
O desenvolvimento de aplicaes corporativas de uma forma padronizada um fato de
suma importncia para as empresas envolvidas. Mas conseguir e manter este padro uma tarefa
considerada praticamente impossvel, j que as aplicaes devem se modernizar na velocidade
que o mercado de informtica exige. Os formulrios herdados do Delphi so simples extenses da
programao orientada a objetos, conseguindo manter, de forma automtica, os padres e as
modificaes realizadas nos projetos. E em conjunto com o Repositrio de Objetos, padroniza,
organiza e centraliza os formulrios resultando em modificaes de curtssimo tempo.

31

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Ferramentas Auxiliares de SQL


Para o trabalho com bases de dados padro SQL (Structure Query Language Linguagem estruturada de Consultas), o Delphi conta com as seguintes ferramentas RAD que
auxiliam ao desenvolvimento.

Monitor SQL
Um monitor SQL um ferramenta para testes, depurao e execuo de consultas SQL
em aplicaes Client / Server. Isto resulta em um aumento da produtividade de desenvolvimento e
melhor performance da aplicao.
O monitor SQL, intercepta as chamadas entre as mquinas client e o servidor. Esta
informao auxilia ao desenvolvedor em problemas relacionados as declaraes SQL e otimiza
este tipo de transao. Uma srie de caminhos de interceptaes podem ser traados, dependendo
da necessidade do desenvolvedor, para que as informaes a serem colocadas em um relatrio online sejam as mais imprescindveis o possvel. possvel inclusive salvar e imprimir o relatrio
gerado para consultas ou testes posteriores.

32

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

SQL Explorer
A ferramenta SQL Explorer providencia uma informao centralizada do gerenciamento
das demandas da base de dados; tais como, suporte a modificao e criao de tabelas, sinnimos,
procedimentos de gravao, triggers (gatilhos disparados pelo banco) e execuo das regras de
negcio interativas do SQL. Uma ferramenta grfica que proporciona um esquema de integridade
da base da dados e contm as ferramentas essenciais para os administradores de bancos de dados.
O SQL Explorer, unicamente para o Delphi, administra de forma intuitiva e fcil o
banco de dados. A simplicidade de uso da interface grfica um perfeito caminho para
representar o complexo relacionamento que existe no banco de dados do servidor. Apresenta um
esquema para informaes em bancos como Oracle, Sybase, InterBase, Informix, DB2 e
outros. O desenvolvedor poder trilhar campos, tabelas e procedimentos do banco dentro da
construo da aplicao Delphi rapidamente, podendo ser direcionado para mltiplos servidores e
mltiplos bancos.

33

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O SQL Explorer, tambm administra o Dicionrio de Dados. Sua interface de uso


simplicado permite facilmente definir novos domnios para os atributos dos campos e associao
entre tabelas.

InterBase NT - Banco de Dados Relacional


O Delphi Client / Server Suite 2.0 inclui uma licena para dois usurios do uso do banco
de dados InterBase NT. Desenvolvedores podem criar em mquinas standalone aplicaes
usando este poderoso banco de dados (concorrente de bancos como Oracle, Sybase,
Informix, DB2 e outros). Com o crescimento do volume de dados e do tamanho da aplicao,
ambos, o InterBase e o Delphi conseguem interagir de forma harmoniosa.
O InterBase um banco de dados de alta performance produzido pela Borland, como
plataforma para SQL Server. Est disponvel em mais de 15 sistemas operacionais incluindo:
DOS e Windows 3.1, Windows 95, Windows NT, NetWare, SCO, Sun OS, Sun
Solaris, HP-UX, IBM AIX, SGI IRIX, etc.
O InterBase um banco a nvel ANSI SQL 92, suportando eventos programados e
excees ocorridas no modelo por acesso de mltiplos usurios. Oferece chaves de controle a
nvel de registros para arquiteturas Multi-Gerenciais causando um performance muito superior a
uma leitura das operaes de banco, em contrrio das leituras de blocagem de operaes escritas
realizadas por outros bancos.
A verso local do InterBase, disponvel apenas com a cpia Client / Server Suite 2.0,
providencia aos desenvolvedores um caminho rpido para o desenvolvimento de prottipos e de
sistemas com um banco de padro ANSI 92 SQL. Esta verso propicia as mesmas funcionalidades
da verso multi-usurio para NT e Unix, incluindo controles de transaes, procedimentos de
gravao (stored procedures), uso de triggers (gatilhos disparados do banco), ou eventos de

34

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

alerta. Imagine o desenvolvimento de um grande sistema sendo realizado em um Laptop dentro


de um trem, avio ou at mesmo na frente do cliente, apenas o acesso ao banco de dados final
que ser modificado.
Utilizando o Delphi Client/Server Suite 2.0, desenvolvedores podero conceber e
desenhar prottipos e testar a aplicao final em uma nica mquina. O InterBase oferece um
excepcional acesso a interface grfica do Windows, incluindo a configurao das propriedades,
um perfeito gerenciador de bancos nativo 32 bits, total interatividade com ferramentas SQL, e
uma completa documentao em formato de Help do Windows (arquivos .HLP).

Captulo III
Projeto Piloto
bvio que fica mais simples o aprendizado de uma nova ferramenta quando se faz
algum tipo de aplicativo, principalmente um que seja til, ento ao longo deste estudo, iremos
desenvolver um aplicativo destinado ao Cadastro de Compact Disc (CDs). Todas as pessoas hoje
em dia tem montes de CDs, virou uma espcie de febre, ento, porque no fazer um sistema para
cadastr-los e control-los, quanto tempo voc j perdeu pensando em qual deles est aquela
msica que voc quer ouvir? Ou uma capa que seu filho rasgou, que tal imprimi-la novamente? E
no captulo multimdia aprenderemos um mtodo para tocar o CD.
Para darmos partida ao nosso primeiro aplicativo (Projeto Piloto), definiremos
inicialmente as nossas necessidades:
1. Permitir o cadastro completo e a consulta aos CDs;
2. Ser possvel separar os CDs em categorias, facilitando deste modo a busca e o
armazenamento;
3. Quanto as msicas deve ser permitido o cadastro do autor e o tempo de durao;
4. Permitir a incluso da foto da capa do CD; e
5. Comportar relatrios de conferncia e reimpresso da capa.
O acesso Delphi a arquivos pode ser feito atravs de duas maneiras local ou remoto,
sendo a segunda apenas possvel pela cpia CLIENT-SERVER voltadas a bases de dados mais

complexas como ORACLE ou SYBASE , inicialmente, restringiremos o nosso estudo a base de


dados locais conseguida atravs da verso Desktop. Lembre-se que verso Desktop contm
acesso a criao e a definio de bases dBase e Paradox, alm de outras conseguidas atravs de
ODBC.
Com base no que foi sugerido acima, vamos definir as tabelas:
CATEGORIA
Objetivo: Dados das categorias do CD.
Campos: SIGLA DA CATEGORIA - Abreviao da descrio da categoria.
DESCRIO DA CATEGORIA - Descrio da Categoria.

35

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

BSICO
Objetivo: Dados iniciais do CD.
Campos: CDIGO DO DISCO - Cdigo do CD, encontrado na prpia capa.
NOME DO DISCO - Nome do CD.
TIPO DO DISCO - Tipo de Gravao do CD: AAA, AAD, ADD ou DDD.
FOTO DA CAPA - Armazenar a foto da capa do CD.
SIGLA DA CATEGORIA - Ligao para o cdigo da Categoria.
MSICAS
Objetivo: Dados das msicas do CD.
Campos:
CDIGO DO DISCO - Ligao com o CD.
NUMERO DA FAIXA - Nmero da faixa.
NOME DA MSICA - Ttulo da msica.
NOME DO AUTOR - Nome do autor da msica.
TEMPO DA MSICA - Tempo de durao da msica MMSS.

Criando o Modelo Relacional


Para criar um modelo relacional simples e trabalhar com bases locais voc pode optar por
dois modos do tipo dBase ou Paradox, particularmente eu prefiro trabalhar com Paradox, mas
voc rapidamente notar que tanto faz, trabalhe com aquela que voc se sinta mais a vontade.

Escolha a base de acordo com o porte do sistema: Para sistemas pequenos e simples e
com poucos dados use o dBase, para sistemas mdio, multi-usurio, com uma boa quantidade de
dados escolha a base Paradox e para sistemas complexos em vrias plataformas e acessos multiusurio opte por InterBase.
Vamos agora visualizar um modelo que demonstrar como as tabelas devero se
relacionar no sistema, este modelo tambm facilitar as relaes e a integrao dos formulrios do
sistema quando construiremos nossas consultas e relatrios.

No modelo de entidade e relacionamento acima l-se:

36

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1 registro da entidade Bsico se relaciona com 1 registro da entidade Categoria enquanto


que 1 registro da entidade Categoria se relaciona com n registros da entidade Bsico,

1 registro da entidade Msicas se relaciona com 1 registro da entidade Bsico enquanto


que 1 registro da entidade Bsico se relaciona com n registros da entidade Msica.

Com o MER nas mos j se tem a idia de como deve ficar as estruturas das tabelas,
ento, vamos queimar um pouco de neurnios.

Trabalhando com DataBase Engine Configuration


Criando o Alias
O ALIAS simplesmente um apelido (sinnimo) a ser dado para o banco de dados, este
apelido permitir que no lugar de falarmos para ao Delphi que a nossa base se encontra em
C:\SISTEMA\... ou D:\DESENV\SISTEMA\..., simplesmente digamos se encontra em AliasX ou
AliasY, isto facilitar o seu trabalho quando voc por exemplo quiser modificar o diretrio do
sistema, basta mudar o endereo do ALIAS e no sair modificando vrios formulrios.

Outra vantagem em se criar um Alias est na mudana da base, basta reapontarmos o


Alias para outra base que o sistema automaticamente ver estas novas informaes. Lembre-se
que para isto ser possvel necessrio que o nome das tabelas e dos campos sejam
necessariamente os mesmos, incluindo o tamanho e o tipo (no apndice B encontrado uma
tabela para a converso das diversas bases de dados).
Para trabalhar com ALIAS o caminho mais interessante e com o Database Engine

Configuration, no arquivo de programas do Delphi d um duplo clique sobre o cone


a configurao do banco de dados se divide em vrias pginas:

Drivers - Controla os arquivos de acesso locais e ODBC dos bancos de dados utilizados;
Aliases - Controle dos sinnimos dos sistemas;
System - Define os recursos do Windows que sero alocados pela aplicao;
Date - Especifica os fo rmatos utilizados para campos tipo data;
Time - Especifica os formatos utilizados para campos tipo hora; e
Number - Especifica os formatos utilizados para campos tipo numrico.

Se atualmente voc estiver utilizando a verso de desenvolvimento, os drivers que


aparecero sero: dBase, InterBase e Paradox, na verso Client/Server alm desses sero
colocados: Oracle, Informix, SyBase entre outros.
Mude para a pgina Aliases e click no boto New Alias, informe:
New alias name: AliasDisco
Alias type: STANDARD
Boto OK

37

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Path: C:\SISTEMA\CADDISCO
Default Driver: Paradox

Neste momento o seu ALIAS AliasDisco foi criado para a banco de dados Paradox, no
formato Padro localizado no diretrio C:\SISTEMA\CADDISCO, no menu principal escolha a
opo File e Save, o BDE salvou o seu arquivo de configurao chamado IDAPI.CFG.

Crie com o Gerenciador de Arquivos o diretrio C:\SISTEMA\CADDISCO, aonde


ser localizado o sistema.

Para a base dBase a nica diferena seria o comando Default Driver: DBASE.
Encerre o Database Engine Configuration.

Trabalhando com DataBase DeskTop

Criando o Banco de Dados via Estrutura


Para criar suas tabelas, dispe-se de duas maneiras: o modo declaraes em SQL ou pela
janela de estrutura, inicialmente, utilizaremos a janela de estrutura, pois alm de mais simples
mais prtico, a menos que voc trabalhe com bases de acesso remoto, evite o modo declaraes
em SQL para manusear a estrutura de tabelas, principalmente tabelas simples como o caso do
Paradox ou o dBase, apesar que existem muitos fanticos por CREATE TABLE, ALTER TABLE e
DROPs. Em seguida mostrarei como criar as mesmas tabelas utilizando o mtodo SQL.

Lembre-se de apagar as tabelas antes de cri-las novamente. Seno no ser possvel


executar uma nica declarao SQL.
Retorne ao Delphi, no menu principal escolha a opo TOOLS|DataBase DeskTop,
maximize a tela para permitir uma melhor visualizao.
Com o nosso sinnimo (ALIAS) criado iremos agora definir as nossas tabelas.
Inicialmente vamos definir como nossa rea de trabalho: No menu principal, opo File|Working
Directory..., na opo Aliases: selecione AliasDisco, note que a opo Working Directory ser
automaticamente modificada para :AliasDisco:, finalmente confirme clicando no boto OK. O
diretrio apontado pelo Alias, agora ser o default, ou seja, tudo o que fizermos ser apontado
para o diretrio.

38

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

No menu principal, opo File, opo New, e opo Table..., ser mostrada uma janela
com os tipos de possveis repositrios de tabelas no Table Type escolha a opo Paradox 7 e
clique no boto OK. Insira os seguintes campos:
Field Name

Type

Size

COD_DISCO

NOM_DISCO

60

TIP_DISCO

FOT_CAPA

SIG_CATEG

Key
*

Dos campos, o nico que merece uma explicao e FOT_CAPA ele foi escolhido neste
formato (Binary) pois guardar uma imagem BitMap (extenso .BMP) da Capa do CD, todos os
outros campos so caracteres alfanumricos, com a exceo do COD_DISCO que um campo
Numrico e chave.
Para esta tabela precisamos ainda criar um ndice secundrio, para tanto na opo Table
properties: chame a opo Secondary Indexes e clique no boto Define..., marque no campo
Nom_Disco (na lista Fields) e clique no boto
o campo passou para a lista Indexed Fields,
clique no boto OK e digite SI_NomDisco para o nome do indice e clique no boto OK.
Para salvar sua tabela clique no boto Save as... na opo Nome do Arquivo: insira o
nome da tabela - Basico.
Crie agora as seguintes tabelas:
1. Categor
Field Name

Type

Size

Key

SIG_CATEG

DES_CATEG

40

Field Name

Type

Size

COD_DISCO

NUM_FAIXA

NOM_MUSICA

2. Musica

39

60

Key

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

NOM_AUTOR

40

TMP_MUSICA

Criando os Relacionamentos via Estrutura


Os relacionamentos entre as tabelas poderia ter sido criado no momento da construo
das mesmas, mas acredito que deste modo seja mais simples, a partir do menu principal, opo
File, opo Open, e opo Table..., ser aberto uma janela com todas as tabelas, clique na tabela
BASICO e sua estrutura ser mostrada, clique no boto
Restructure, ou a partir do menu
principal, opo Table, opo Restructure..., na opo Table properties: alterne para a opo
Referential Integrity e clique no boto Define..., no lado esquerdo (Lista Fields) d um duplo
clique no campo SIG_CATEG e no lado direito (Lista Tables) d um duplo clique na tabela
CATEGOR.DB, clique no boto de OK para confirmar e ser solicitado o nome para o ndice.
Para o nome do ndice crie um padro de FK_ + {nome do campo} + {nome tabela pai},
uma padronizao dos nomes dos ndices facilita a procura futuramente, ento para o nosso ndice
crie FK_SigCateg_Basico.
Crie agora o outro relacionamento entre a tabela MUSICA e BASICO conforme a figura
abaixo:

Tambm possvel acessar o Database Desktop atravs do cone


grupo de trabalho DELPHI.

localizado no

Encerre o Database Desktop e retorne ao Delphi, ou apague as tabelas e...

Criando o Banco de Dados via SQL


Para os fanticos por declaraes SQL, vamos criar a mesma base de dados via SQL, se
voc ainda no o fez, observe no tpico anterior como colocar o ALIAS na rea de trabalho. Isto
ser de muita utilidade quando formos salvar o nosso trabalho.
No menu principal, opo File, opo New, e opo SQL File, ser mostrada uma janela
para ser digitada a declarao SQL, observe na barra de comandos o boto
Select Alias, ou a
partir do menu principal opo SQL/Select Alias..., apenas observe que a rea de trabalho Work
j est selecionada, clique em OK ou Cancel sem fazer nenhuma modificao, observe que o
ttulo da janela SQL Editor :WORK:<Untitled>.

40

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Digite o seguinte na janela:


Create Table Basico
(
COD_DISCO Numeric(4,0),
NOM_DISCO VarChar(60),
TIP_DISCO Char(3),
FOT_CAPA Blob(3,2),
SIG_CATEG Char(2),
Primary Key(COD_DISCO)
);

Clique no boto
Run SQL, ou no menu SQL/Run SQL, ou ainda pressione F8,
aps executado o comando a tabela ser criada. Salve o SQL com a opo File/Save (digite
BASICO .SQL)
Abra novas janelas e crie o resto das tabelas:
Create Index SI_NomDisco on Basico (NOM_DISCO);

Criando o indice secundrio da BASICO

Create Table CATEGOR


(
SIG_CATEG Char(2),
DES_CATEG VarChar(40),
Primary Key(SIG_CATEG)
);

Criando a Tabela CATEGOR

Create Table MUSICA


(
COD_DISCO Numeric(4,0),
NUM_FAIXA Numeric(2,0),
NOM_MUSICA VarChar(60),
NOM_AUTOR VarChar(40),
TMP_MUSICA Char(4),
Primary Key(COD_DISCO, NUM_FAIXA)
);

Criando a tabela MUSICA

O SQL para o Paradox no consegue executar a criao de indices referenciais (ou


Constraints) ento para criar este tipo de ndice crie-o atravs da janela de estrutura conforme
mostrado anteriormente.

Observaes da utilizao do SQL com o dBase


Infelizmente o dBase no suporta a clusula Primary Key que permite a criao dos
ndices muito menos a criao de chaves estrangeiras. Quanto as chaves estrangeiras no se
preocupe pois o Delphi consegue manipular relacionamentos entre as tabelas mesmo que elas no
estejem vinculadas.
Caso voc esteja utilizando este tipo de base os passos para as criaes das tabelas so os
mesmos mas corte as clusulas Primary Key necessrio criar os ndices separadamente. Abra
uma nova declarao SQL, idntica a anterior, e digite o seguinte na janela:
Create Index PK_Unica on Basico (COD_DISCO);

41

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O comando correto para este ndice deveria ser Create Unique Index PK_Unica on

Basico (COD_DISCO); mas isto provoca um erro colocando que no possvel esta
declarao, ento coloque a clusula UNIQUE atravs da janela de estrutura.

Se voc esqueceu de ativar o Select Alias coloque Create Index Cod_Disco on


Basico.dbf (COD_DISCO);
As outras declaraes so:
Create Index SI_NomDisco on Basico (NOM_DISCO);
Create Index FK_SigCateg_Basico on Basico (SIG_CATEG);
Create Index PK_Unica on Categor (SIG_CATEG);
Create Index FK_CodDisco_Musica on Musica (COD_DISCO);

Criando o indice secundrio


Criando a chave estrangeira
Criando a chave primria
Criando a chave estrangeira

O comando correto para a criao da chave dupla da tabela MUSICA seria Create
Index Chv_Unica on Musica (COD_DISCO, NUM_FAIXA); mas novamente provocado
um erro mostrando a impossibilidade de execuo do comando, ento crie este ndice atravs da
janela de estrutura.

facilmente percebido que o DataBase DeskTop at que tenta colocar todas as bases
de dados compatveis com a linguagem SQL, mas infelizmente ainda no foi nesta verso.

Para as tabelas do tipo ORACLE, INTERBASE, SYBASE e MS SQL Server a criao


das tabelas podem ser feitas tanto pelo modo de estrutura quanto pelas declaraes SQL mas
lembre-se que a alterao das mesmas s poder realizar-se atravs do modo de declaraes SQL.
Aqui vo alguns exemplos destas declaraes:
Create Table MUSICA
Criando a tabela MUSICA
(
COD_DISCO Numeric(4,0),
NUM_FAIXA Numeric(2,0),
NOM_MUSICA VarChar(60),
TMP_MUSICA Char(4),
Constraint PK_Unica Primary Key(COD_DISCO, NUM_FAIXA),
Constraint FK_CodDisco_Musica Foreign Key (Cod_Disco)
References USUARIO_AGENDA (Cod_ Disco)
);
ALTER TABLE MUSICA ADD NOM_AUTOR VarChar(40)

Adiciona o campo Nom_Autor

DROP TABLE MUSICA;

Elimina a tabela MUSICA

Encerre o Database Desktop e retorne ao Delphi.

42

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo IV
Trabalhando com o Menu
Qualquer projeto precisa de um menu, fica mais prtico para o nosso usurio navegar
dentro de um projeto quando este limitado por um menu principal, iniciaremos o nosso projeto
no Delphi com a criao do Menu Principal do Sistema.

Metendo a Mo na Massa
A partir deste ponto, nossa aula se transforma em receita de bolo, a nica coisa que voc
precisa fazer e seguir as orientaes passo a passo, no princpio pode parecer meio idiota, mas
afinal o computador uma mquina idiota. Bom, vamos ento metendo a mo na massa.

Ao iniciar o Delphi, foi criado automaticamente um novo projeto, vamos descart-lo e


iniciar um novo. Para tanto:
1. Lembre-se: no captulo anterior criamos o diretrio que abrigar o sistema a ser
desenvolvido - C:\SISTEMA\CADDISCO - aprendemos o que o Alias e
estruturamos as nossas tabelas, se algum destes conceitos ficaram dispersos eu lhe
aconselho que retorne ao captulo anterior
2. Crie um novo projeto digitando File e New Application. (Responda negativamente
quaisquer mensagem para gravar o projeto atual).

Criando a janela do menu


A janela do menu principal e bem simples, como voc j deve ter visto em vrios
aplicativos o menu o objeto que fica servindo de pano de fundo para toda a aplicao, todo o
trabalho e realizado com o auxlio de suas chamadas, em conjunto com o menu teremos trs
formulrios gerenciadores que daremos o nome de:

F_Menu - Menu principal propriamente dito;


F_Sobre - A janela Sobre o sistema...; e
F_Inicio - Janela Splash que iniciar o nosso aplicativo.

Vamos criar inicialmente o nosso menu principal:


1. Clique no boto
(Main Menu), localizado na Component Palette na pgina
Standard, e clique dentro do objeto Form1 (no se preocupe com a posio, pois este
objeto ficar invisvel quando o aplicativo for executado).

Foi criado neste momento o objeto MainMenu1 derivado da classe de objeto TMainMenu,
a partir deste objeto vamos criar nosso menu:

43

Delphi e Delphi Client/Server

Borland

Desvendando o Caminho das Pedras

2. D um duplo clique em cima do objeto, ou clique na propriedade Items da Object


Inspector aparecer o boto . Clique neste boto.

Observe a tela de propriedades do Object Inspector, neste momento vou me conter em


falar das mais significativas, mas futuramente retomaremos o assunto:
Caption - Define o nome do item de menu, quaisquer nomes so vlidos, incluindo
acentos, o caractere especial & deve ser colocado uma nica vez, ele causa o
sublinhado da letra, tornando-a uma letra (em conjunto com a tecla Alt) de acesso a
opo.
Enabled - Define se o item est disponvel ou no para o usurio.
Name - Nome interno do item (colocado automaticamente na escolha do Caption).
ShortCut - Combinao de teclas, para um rpido acesso ao item (alm da letra escolhida
com &).

Inserindo os itens iniciais:


1. Digite &Arquivo na propriedade Caption, em seguida pressione a tecla Enter.
2. Clique no novo espao aberto, criado lateralmente, e digite &Consulta na
propriedade Caption, em seguida pressione a tecla Enter.
3. Proceda da mesma forma criando as opes: &Relatrio e Au&xlio.
4. Clique na opo Arquivo, aparecer um espao vazio abaixo, clique neste espao e
digite &Tabela na propriedade Caption. Ao ser dado Enter o Delphi criar mais
um espao abaixo, digite &Cadastro na propriedade Caption.
5. Abaixo do Cadastro, digite - (sinal de menos) na propriedade Caption (o Delphi
criar uma barra de separao) e altere a propriedade Enabled para False.
6. No novo espao criado, aps a barra, digite &Sair na propriedade Caption e altere
a propriedade ShortCut para Ctrl+X.
7. Clique na opo Tabela, clique com o boto direito do mouse, aparecer um menu
pulldown, clique na opo Create Submenu.
8. Digite &Categoria na propriedade Caption.

Complete os prximos itens de modo que o menu fique:

Arquivo

Tabela

Categoria

Cadastro
Sair

Consulta

Relatrio

Auxlio

CDs

Geral

Sobre o sistema

Msica por CDs

Capa do CD

Contedo

Configura Impressora

Tpicos de Ajuda

Ctrl+X

Como usar a Ajuda

Saia da janela Menu Designer digitando Alt+F4, o menu j existe no objeto form1.

Altere as seguinte propriedades para o objeto form1:

Propriedade

Valor

Descrio

BorderStyle

Single

Estilo da borda da janela; modo simples.

Caption

Compact Disc Digital Audio

Label escrito na tarja superior da janela.

44

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Color

clMenu

Cor da janela, clMenu uma constante que guarda a cor


padro da janela definido pelo usurio no Windows.

Name

F_Menu

Nome do objeto interno.

WindowsState

wsMaximized

Modo de abertura da janela, modo Maximizado.

Salvando o formulrio e o projeto:


1. Salve o Formulrio nas opes de menu File e Save (ou pressione Ctrl+S), o Delphi
questionar o nome e o diretrio, o diretrio (conforme criado no captulo anterior)
o C:\SISTEMA\CADDISCO e para o nome digite fMenu (note que o nome externo
e o mesmo do nome interno diferenciado por _, isto facilitar a identificao do
formulrio e da sua unidade).
2. Salve o Projeto digitando File e Save Project, salve o projeto no diretrio
C:\SISTEMA\CADDISCO com o nome CDDA.

Criando no menu uma linha de status:


3. Clique no boto
(StatusBar) na pgina Win95 da Component Pallete e clique
em qualquer posio do objeto F_Menu.
4. Clique no objeto criado StatusBar1 em seguida clique na propriedade Panels, para
alterar esta propriedade clique no boto , aparecer a janela da Status Bar Panels
Editor, clique sobre o boto New e para a propriedade Text coloque Bem vindo ao
sistema... e clique no boto OK.

5. Altere tambm a propriedade Name do objeto para LinhaStatus

Caso voc esteje usando o Delphi 1.0 crie a barra de status do seguinte modo:
1. Clique no boto
(Panel) na Component Pallete na pgina Standard e clique em
qualquer posio do objeto F_Menu.
2. Clique no objeto criado StatusBar1 e altere as seguintes propriedades:
Propriedade

Valor

Descrio

Align

alBottom

Alinhamento dentro do form, todo no rodap

Alignment

taLeftJustify

Alinhamento da Caption, justificado esquerda

45

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

BevelInner

bvLowered

Borda 3D interna, tipo pressionado

BevelOuter

bvLowered

Borda 3D externa, tipo pressionado

BorderWidth

Tamanho da borda

Caption

Bem vindo ao sistema...

Label do objeto

Name

LinhaStatus

Nome do objeto

Font

MS Sans Serif, Estilo da


fonte: Normal, Tamanho: 8,
Cor: Azul Marinho

Tipo de letra a ser mostrada no objeto, para alterar esta

22

Altura do objeto

Height

propriedade clique no boto

Inserindo os Cdigos Iniciais


Vamos inserir o cdigo para o objeto LinhaStatus, este objeto receber os contedos da
propriedade hint dos diversos objetos, formando assim uma linha de ajuda on-line na parte
inferior do menu.

Clique no boto
Editor.

(Toggle Form/Unit) da SpeedBar, at voc alternar para o Code

Abaixo da declarao: Private insira os cdigos:


private
Procedures ou Funes Locais.
{ Private declarations }
procedure ShowHint (Sender: TObject);
public
{ Public declarations }
end;

Cabealho de uma procedure Local.


Procedures ou Funes Pblicas.
Final da seo de declarao.

Abaixo da diretiva de compilao: {$R *.DFM}


Diretiva de compilao associando o nome do
recurso externo ao mesmo nome do objeto Form.
procedure TF_Menu.ShowHint (Sender: TObject); Cabealho da Procedure associado ao nome do
{$R *.DFM}

begin
objeto principal (TF_Menu).
LinhaStatus.Panels.Items[0].Text := Application.hint;
Atribui o valor do hint da aplicaco ao
end;
Item criado do objeto LinhaStatus.

Clique no boto
(Toggle Form/Unit) da SpeedBar, at voc alternar para o Form
clique no objeto F_Menu e na pgina Events da Object Inspector, d um duplo clique no
evento OnCreate.
1. O Delphi criou a procedure FormCreate a ser iniciada quando o objeto F_Menu for
criado.
2. Digite o seguinte comando abaixo do comando begin:

procedure TF_Menu.FormCreate (Sender: TObject);


begin
Application.OnHint := ShowHint;
Atribui o valor da procedure ShowHint ao OnHint da
end;
aplicao.

46

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Clique no boto
(Toggle Form/Unit) da SpeedBar, at voc alternar para o Form
clique no objeto MainMenu1 e entre no Menu Designer, e para cada opo de Menu
altere as propriedades hint e name do seguinte modo:

Opo do Menu
Arquivo
Tabela
Categoria
Cadastro
Sair
Consulta
CDs
CDs por msica
Relatrio
Geral
Capa do CD
Configura Impressora
Auxlio
Sobre o sistema
Contedo
Tpicos de Ajuda
Como usar a Ajuda

Hint
Cadastro e sada do sistema.
Informaes bsicas do sistema.
Tipos de categoria para os CDs.
Incluso e manuteno dos CDs.
Sada do sistema e retorno ao Windows.
Verificao e pesquisa dos CDs cadastrados.
Localizao dos CDs atravs de um filtro estabelecido.
Localiza o CD atravs de um ttulo de uma msica.
Emisses em papel dos CDs cadastrados.
Impresso dos CDs por um intervalo de cdigo.
Impresso de capas para os CDs.
Verifica a impressora a qual ser destinado os relatrios.
Formas de ajuda direta ao sistema.
Ajuda direta com o responsvel pelo desenvolvimento.
Manual On-Line direto.
Exibe os tpicos de ajuda do Manual On-Line.
Mostra como utilizar o Auxlio On-Line.

Name
Arquivo1
Tabela1
ItemTabela1
Cadastro1
Sair1
Consulta1
ItemConsulta1
ItemConsulta2
Relatorio1
ItemRelatorio1
ItemRelatorio2
ConfImpressora1
Auxilio1
ItemAuxilio1
ItemAuxilio2
ItemAuxilio3
ItemAuxilio4

Saia do Menu Designer, salve o formulrio e o projeto.

Rode o projeto, clicando no boto


Run, ou ainda, digite F9.

Teste as opes do menu, veja na linha de Status os hints informados, saia com Alt+F4.

da SpeedBar, ou no menu principal a opo Run e

Caso voc esteje usando o Delphi 1.0 troque a procedure ShowHint para:
procedure TF_Menu.ShowHint (Sender: TObject);
begin
LinhaStatus.Caption := Application.hint;
Atribui o valor do hint da aplicaco a Propriedade
end;
Caption do objeto LinhaStatus.

Iniciando os comandos do Menu


Com o menu pronto, comearemos a codificar os comandos que disponibilizamos ao
nosso usurio:

Automatizando o Comando SAIR: No objeto F_Menu, clique na opo Arquivo e clique


na opo Sair. O Delphi criou o evento Click para o objeto Sair1.

Digite o seguinte comando abaixo do begin:

procedure TF_Menu.Sair1Click (Sender: TObject);


begin
Close;
proporciona o fechamento do formulrio ativo
end;

47

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Colocando os comandos para o Auxlio


O Delphi implementa o auxlio on-line de maneira prtica e eficiente, no ensinarei aqui
como construir um arquivo .HLP, existem diversos aplicativos que j o fazem automaticamente e
fica a seu critrio o modo de cri-lo, apenas mostrarei como implement-lo em seu projeto.

Clique na opo Project | Options... e na pgina Application localize o seu arquivo com
a opo Help file, aproveite tambm para nomear o projeto, com a opo Title e colocar
um cone para o projeto, opo Icon (clique no boto Load Icon...) e ao trmino clique
no boto OK.

Automatizando o Comando CONTEDO: No objeto F_Menu, clique na opo Auxlio e


clique na opo Contedo. Digite:

procedure TF_Menu. ItemAuxilio2Click(Sender: TObject);


begin
Application.HelpCommand(HELP_CONTENTS, 0);
Chama o arquivo de Ajuda
end;

Automatizando o Comando TPICOS DE AJUDA: No objeto F_Menu, clique na opo


Auxlio e clique na opo Tpicos de Ajuda. Digite:

procedure TF_Menu. ItemAuxilio3Click(Sender: TObject);


const
EmptyString: pChar = '';
Cria uma constante
begin
Application.HelpCommand(HELP_PARTIALKEY, LongInt(EmptyString)); Tpicos do Ajuda
end;

Automatizando o Comando COMO USAR A AJUDA: No objeto F_Menu, clique na


opo Auxlio e clique na opo Como usar a Ajuda. Digite:

procedure TF_Menu. ItemAuxilio4Click(Sender: TObject);


begin
Application.HelpCommand(HELP_HELPONHELP, 0);
Chama o auxlio do Windows
end;

Quando fecharmos a nossa aplicao e necessrio que tambm desativemos o auxlio, no


objeto F_Menu, clique na pgina de Events e clique no evento Destroy. Digite:

procedure TF_Menu.FormDestroy(Sender: TObject);


begin
Application.HelpCommand(HELP_QUIT, 0);

48

Desabilita o auxlio

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

end;

Saia do Menu Designer, salve o formulrio e o projeto.

Rode o projeto e teste as opes do menu, saia com Ctrl+X ou utilize o comando Sair.

Caso o F1 no ative o auxlio On-Line, provavelmente o seu menu est com a


propriedade FormStyle em modo fsMDIForm, coloque-a no modo fsNormal. Se mesmo assim
ainda no funcionou, mude a propriedade HelpContext do formulrio para 1.

As palavras-chaves para o comando HelpCommand so:


Comando

Dados

Ao

HELP_CONTEXT

Inteiro longo, contendo o nmero


do contexto.

Mostra o auxlio a partir de tpico selecionado


identificado a partir do nmero do contexto
definido pela seo [MAP] do arquivo .HPJ

HELP_CONTENTS

Ignorado. Normalmente passado 0.

Mostra o contedo do primeiro tpico definido


pela seo [MAP] do arquivo .HPJ

HELP_SETCONTENTS

Inteiro longo, contendo o nmero


do contexto que foi designado como
tpico de contedo.

Determina a chamada do tpico determinado


atravs do uso da tecla F1

HELP_CONTEXTPOPUP

Inteiro longo, contendo o nmero


do contexto.

Mostra uma janela Pop-Up com um tpico


particular indentificado pelo nmero do contexto
definido pela seo [MAP] do arquivo .HPJ

HELP_KEY

Ponteiro longo como uma string


contendo o tpico designado.

Mostra um tpico pesquisado em uma lista de


palavras chaves. Esta palavra chave deve ser
exatamente o texto procurado.

HELP_PARTIALKEY

Ponteiro longo como uma string


contendo o tpico designado.

Mostra um determinado tpico atravs de uma


lista de palavras chaves. Se a palavra chave no
for encontrada posiciona na palavra fontica
mais perto.

HELP_MULTIKEY

Ponteiro longo para uma estrutura


de TMULTIKEYHELP. Esta
estrutura especfica de caracteres e
palavras chaves.

Mostra o tpico indentificado pela palavra chave


ou uma chave da tabela alternada.

HELP_COMMAND

Ponteiro longo, contendo a macro


para a execuo

Executa um macro help.

HELP_SETWINPOS

Ponteiro longo para uma estrutura


de TMULTIKEYHELP. Esta
estrutura especfica contm o
tamanho e a posio da janela do
help primrio ou a janela secundria
para ser mostrado.

Mostra um help do windows com um mnimo de


memria, variando o tamanho e a posio de
acordo com o dado passado.

HELP_FORCEFILE

Ignorado. Normalmente passado 0.

Executa o WinHelp mostrando o arquivo de


auxlio corrijido.

HELP_HELPONHELP

Ignorado. Normalmente passado 0.

Mostra o auxlio de como usar o auxlio.

HELP_QUIT

Ignorado. Normalmente passado 0.

Solicita o fechamento do auxlio ativo.

49

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Criando a janela Sobre o Sistema

Em todo o sistema criado para o Windows includo uma janela Sobre o Sistema, por

uma boa razo! todos os outros sistemas para o Windows possuem uma, e quem vai querer
quebrar esta maravilhosa tradio e criar um sistema sem uma janela destas ?
Criar o primeiro formulrio com o Delphi no uma tarefa assim to difcil, mas para
perdemos o medo inicial vamos criar a AboutBox (ou CaixaSobre), observe:

Criando e alterando os objetos

Para criar o formulrio a partir do menu principal a opo File e New..., aparecer a
janela da New Items (mais informaes retorne ao Captulo II) e clique na pgina Forms
e no objeto entitulado About box.

Altere os seguintes objetos (localize-os atravs da Object Inspector):


AboutBox (classe TAboutBox):

Propriedade

Valor

Descrio

Caption

Sobre o sistema

Label escrito na tarja superior da janela

Name

F_Sobre

Nome interno do objeto

ProgramIcon (classe TImage):


Propriedade

Valor

Descrio

Picture

Escolha o BitMap de sua preferncia

Objeto imagem

ProductName (classe TLabel):


Propriedade

Valor

Descrio

Caption

CDDA

Label do objeto

Font

Ms Sans Serif, Negrito Itlico, 18,


Castanho

Tipo de letra a ser mostrada no objeto

Version (classe TLabel):


Propriedade

Valor

Descrio

Caption

Verso Beta Teste

Label do objeto

Font

Ms Sans Serif, Itlico, 8, Azul Marinho

Tipo de letra a ser mostrada no objeto

Copyright (classe TLabel):


Propriedade
Caption
Font

Valor
Copyright

Descrio

1995 - Nome da Empresa

Ms Sans Serif, Normal, 8, Azul marinho

Label do objeto
Tipo de letra a ser mostrada no objeto

Para conseguir um pressione ALT+184 e um pressione ALT+169.


Comments (classe TLabel):
Propriedade

Valor

Descrio

Caption

Compact Disc Digital Audio - Cadastro de CDs

Label do objeto

50

Borland

Delphi e Delphi Client/Server

Font

Desvendando o Caminho das Pedras

Ms Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Elimine o objeto OKButton (boto de OK), clique sobre ele e pressione Delete, clique no
objeto F_Sobre e click no objeto BitBtn
, encontrado na Component Palette na
pgina Additional, e click novamente no F_Sobre
Altere as seguintes propriedades:

Propriedade

Valor

Descrio

Kind

bkOK

Determina a classe a ser utilizada pelo boto, automaticamente


ser alterado as propriedades: Caption, Glyph e ModalResult

Hint

Retorna ao menu principal

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de uma caixa


de ajuda on-line

Name

ButOK

Nome do Objeto

Width

92

Largura do objeto

D uma organizada geral quanto a posio dos objetos para voc poder ter uma idia
compare o desenho do seu formulrio para ver se no ficou faltando nada:

Salve o formulrio nas opes de menu File e Save (ou pressione Ctrl+S), o Delphi
questionar o nome e o diretrio, o diretrio o C:\SISTEMA\CADDISCO e para o
nome digite fSobre (note que novamente o nome externo e o mesmo do nome interno
diferenciado por _).

Associando o form Sobre o Sistema ao menu


Vamos associar o form fSobre com o fMenu:

Automatizando o comando SOBRE O SISTEMA: No objeto F_Menu, clique na opo


Auxlio e na opo Sobre o Sistema. O Delphi criou o evento Click para o objeto item
do menu ItemAuxilio1.

Digite o seguinte comando abaixo do begin:

51

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);


begin
F_Sobre.ShowModal;
Abre o Objeto F_Sobre em modo Modal.
end;

Abaixo da diretiva de compilao: {$R *.DFM}

{$R *.DFM}
uses
fSobre;

Utiliza a Unidade fSobre e todos os objetos dependentes dela.

procedure TF_Menu.ShowHint (Sender: TObject);

Saia do Code Editor e salve o formulrio e o projeto.

Rode o projeto e teste o formulrio Sobre o Sistema, o modo Modal no permitir que
voc clique em nenhum outro lugar at a finalizao desta janela, volte para o menu com
o boto OK.

Note que no foi preciso colocar nenhum cdigo para que ao pressionar o boto OK o
formulrio fosse fechado, isto foi realizado graas a opo Kind, no Delphi voc encontrar
outros modelos de boto padro do tipo: Cancela, Sim, No entre outros.

Criando a janela Splash


A janela Splash tida como a mais importante da aplicao. Esta janela aparece uma
nica vez (no incio) durante a execuo do seu sistema informando ao usurio para ter pacincia
e aguardar tranqilamente enquanto o sistema carregado, os formulrios so criados, etc.
Existem vrios tipos de janela Splash. O tipo mais comum aquela que mostra o nome da
aplicao, o autor, a verso, direitos autorais (Copyright) e uma imagem ou cone que identifica a
aplicao. Atravs da caracterstica de herana dos objetos vamos obter facilmente esta janela:
1. No menu principal selecione a opo File e New..., clique na pgina CDDA e na
figura entitulada F_Sobre.

Neste momento voc obteve uma cpia da janela fSobre o problema que a janela
fSplash ter menos objetos que a janela fSobre, e por caracterstica de herana o filho sempre
deve superar os pais nunca ao contrrio, ento necessrio que invertamos as duas janelas.

Modificando o objeto F_Sobre


1. Modifique a propriedade Name do F_Sobre para F_Splash e a propriedade
BorderStyle para bsNone.
2. Clique sobre objeto butOK e digite Ctrl+X, acerte o tamanho da janela.

52

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

3. Salve o formulrio nas opes de menu File e Save As..., o Delphi questionar o
nome e o diretrio, o diretrio o C:\SISTEMA\CADDISCO e para o nome digite
fSplash.

Recriando o objeto F_Sobre


1. Clique no objeto F_Sobre1 e note que automaticamente ele adquiriu as modificaes
do objeto fSplash.
2. Aumente o tamanho da janela de modo a que caiba novamente o boto de OK e digite
CTRL+V, troque a propriedade Caption do ButOK para &OK.
3. Modifique a propriedade BorderStyle do form para bsDialog e a propriedade
Caption para Sobre o Sistema.
4. Salve o formulrio nas opes de menu File e Save (ou pressione CTRL+S), o
Delphi questionar o nome e o diretrio, o diretrio o C:\SISTEMA\CADDISCO
e para o nome digite fSobre (confirme a operao de sobescrita).

Organizando o objeto fSplash


1. A partir do menu principal clique em Project | Options..., clique na pgina Forms e
envie o objeto F_Splash (clicando sobre ele e clique no boto com o sinal de >) que
est na lista Auto-create forms para a lista Available forms (para no ocupar espao
em memria uma janela que s ser utilizada uma nica vez, criaremos esta janela via
comandos), clique sobre o boto OK.
2. No menu principal selecione a opo View e Project Source (estamos agora
acessando o programa principal que controla todas os outros formulrios ou units).
3. Aps o comando begin adicione as seguintes linhas:
F_Splash := TF_Splash.Create(Application);
F_Splash.Show;
F_Splash.Refresh;

Cria o form como parte da aplicao.


Chama o form de modo no modal.
Mostra o form e devolve o controle para a
aplicao.

4. Antes do comando Application.Run; adicione a linha:


F_Splash.Free;

Libera o form da aplicao.

Saia do Code Editor e salve o formulrio e o projeto.

Rode o projeto, qualquer problema compare com o cdigo abaixo:

program CDDA;
uses
Fmenu in 'FMENU.PAS' {F_Menu},
FSobre in 'FSOBRE.PAS' {F_Sobre};
{$R *.RES}
begin
F_Splash := TF_Splash.Create(Application);
F_Splash.Show;
F_Splash.Refresh;

53

Delphi e Delphi Client/Server

Borland

Desvendando o Caminho das Pedras

Application.Initialize;
Application.HelpFile := 'C:\Sistema\CadDisco\Guia.hlp';
Application.CreateForm(TF_Menu, F_Menu);
Application.CreateForm(TF_Sobre, F_Sobre);
F_Splash.Free;
Application.Run;
end.

Voc pode mover o comando SplashScreen.Free; para o evento OnShow do form


F_Menu. Isto far com que a janela Splash s desaparea quando o menu for ativado.

Infelizmente para os usurios do Delphi 1.0 esta caracterstica de herana no havia


sido implementada ento, faz-se necessrio a construo da tela fSplash atravs de uma cpia da
tela fSobre com a utilizao do comando Save As....

Criando o acesso a Base de Dados


bem verdade que o nosso sistema se encontra na base Paradox, mas como escrevi no
comeo do trabalho com o Delphi possvel modificar o repositrio de dados sem precisar alterar
uma s linha do sistema produzido.
No captulo a respeito das tabelas tambm vimos a impossibilidade de algumas aes
produzidas por clusulas SQL no serem bem vindas em base de dados no totalmente
compatveis com a estrutura do SQL, ento se faz necessrio identificar uma base padro de uma
base SQL.
No menu principal insira o objeto DataBase
pgina Data Access, e altere as seguintes propriedades:

, encontrado na Component Palette na

Propriedade

Valor

Descrio

AliasName

AliasDisco

Nome do Sinnimo

DataBaseName

BaseDisco

Nome do banco de dados

Name

DBDisco

Nome do objeto

Insira agora os cdigos que permitir a abertura e o fechamento da base de dados:

Clique no boto
(Toggle Form/Unit) da SpeedBar, at voc alternar para a Code
Editor e localize o procedimento FormCreate associado ao evento OnCreate:

procedure TF_Menu.FormCreate(Sender: TObject);


begin
Application.OnHint := ShowHint;
DBDisco.Connected := True;
Inicia o Banco de Dados
end;

A partir do prximo captulo entraremos realmente no que o Delphi capaz com tabelas,
mas antes, necessrio que os conceitos ensinados anteriormente estejam bem fixados, se alguma
coisa deu errada, releia o captulo, ou ento confira o cdigo do F_Menu:

54

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

unit fMenu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ComCtrls, DBTables, DB;
type
TF_Menu = class(TForm)
MainMenu1: TMainMenu;
Arquivo1: TMenuItem;
Consulta1: TMenuItem;
Relatorio1: TMenuItem;
Auxilio1: TMenuItem;
Tabela1: TMenuItem;
Cadastro1: TMenuItem;
N6: TMenuItem;
Sair1: TMenuItem;
ItemTabela1: TMenuItem;
ItemConsulta1: TMenuItem;
ItemConsulta2: TMenuItem;
ItemRelatorio1: TMenuItem;
ItemRelatorio2: TMenuItem;
N12: TMenuItem;
ConfImpressora1: TMenuItem;
ItemAuxilio2: TMenuItem;
ItemAuxilio3: TMenuItem;
ItemAuxilio4: TMenuItem;
N14: TMenuItem;
ItemAuxilio1: TMenuItem;
LinhaStatus: TStatusBar;
DBDisco: TDatabase;
procedure FormCreate(Sender: TObject);
procedure Sair1Click(Sender: TObject);
procedure ItemAuxilio2Click(Sender: TObject);
procedure ItemAuxilio3Click(Sender: TObject);
procedure ItemAuxilio4Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ItemAuxilio1Click(Sender: TObject);
private
procedure ShowHint (Sender: TObject);
public
{ Public declarations }
end;
var
F_Menu: TF_Menu;
implementation
{$R *.DFM}
uses
fSobre;
procedure TF_Menu.ShowHint (Sender: TObject);

55

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin
LinhaStatus.Panels.Items[0].Text := Application.hint;
end;
procedure TF_Menu.FormCreate(Sender: TObject);
begin
Application.OnHint := ShowHint;
DBDisco.Connected := True;
end;
procedure TF_Menu.Sair1Click(Sender: TObject);
begin
DBDisco.Connected := False;
Close;
end;
procedure TF_Menu.ItemAuxilio2Click(Sender: TObject);
begin
Application.HelpCommand(HELP_CONTENTS, 0);
end;
procedure TF_Menu.ItemAuxilio3Click(Sender: TObject);
const
EmptyString: pChar = '';
begin
Application.HelpCommand(HELP_PARTIALKEY, LongInt(EmptyString));
end;
procedure TF_Menu.ItemAuxilio4Click(Sender: TObject);
begin
Application.HelpCommand(HELP_HELPONHELP, 0);
end;
procedure TF_Menu.FormDestroy(Sender: TObject);
begin
Application.HelpCommand(HELP_QUIT, 0);
end;
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
F_Sobre.ShowModal;
end;
end.

Caso o seu sistema no seja migrado para nenhum banco de dados no padro SQL (do

tipo ORACLE , SYBASE ,...) no existe nenhuma necessidade em se utilizar o objeto


DataBase, mas a utilizao ou no do objeto no afeta o tempo de acesso ao sistema, ento
porque no prepar-lo para uma eventual mudana?

56

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo V
Janela para as Tabelas
Tabelas primrias de informao requerem entradas de dados simples, no nosso caso
temos a tabela de categoria, a criao de janelas para a sua manipulao de seus dados no um
bicho de sete cabeas como voc ver a seguir.

Reabrindo o seu Projeto

Se assim que voc finalizou o captulo anterior voc saiu do Delphi, precisa agora
reativar o projeto. Para tanto:
1. No menu principal clique em File e Open....
2. O sistema desenvolvido encontrado no diretrio C:\SISTEMA\CADDISCO, com
a extenso .DPR.

Neste momento voc est pronto para o trabalho, vamos criar a nossa janela:
3. Clique no menu principal a opo File e New..., em New Items, mude a pgina para
Forms e clique no objeto entitulado Database Form, agora siga as telas:

2.

1.

A tabela a ser usada para a janela.


Drive or Alias name: AliasDisco
Table Name: categor.db
Boto Next

O tipo a ser criada.


Form Options: Create a simple form
Uma janela simples
DataSet Options: Create a form using TTables objects
Usando o objeto tabela
Boto Next.

3.

4.
Campos a serem inseridos

Formao dos campos

57

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Boto >>
Boto Next

Vertical
Boto Next

5.

6.
Posio dos Labels
Left - A esquerda
Boto Next

Completo
Gera a tela como form principal - No
O Que gerar: Form e DataModule
Boto Finish

Alterando as Janelas Criadas


Se voc seguiu direito as orientaes anteriores, ento voc est com um belo princpio
de janela em suas mos. Digo um belo princpio porque voc h de concordar comigo que a
janela gerada no nenhum pouco amigvel para o nosso usurio, programando h um certo
tempo com o Delphi descobri um padro de janela que meus usurios gostaram, mas voc poder
futuramente tambm encontrar o seu prprio padro de janela, ento vamos a algumas alteraes:

Se voc est utilizando o Delphi 1.0, a nica diferena ser nos DataModules, no se
preocupe coloque todas as instrues em um nico formulrio.

DataModules ?
Uma das principais novidades que acompanham o Delphi 2.0 a possibilidade de criao
de DataModules, estas janelas especiais funcionam como uma espcie de repositrio de dados,
no so visualizveis em tempo de execuo. possvel colocar em um nico DataModule todo o
modelo relacional e todos os outros formulrios do sistema acessando-o.
Acesse inicialmente o objeto DataModule1 para as alteraes que se seguem.

Modificando as Tabelas e as Ligaes


Os objeto que contm as tabelas e as ligaes de tabela so objetos invisveis quando o
aplicativo est rodando portanto no se preocupe muito com a posio que ele ocupar.
Tabela no Delphi est contida no objeto
(Table), encontrado na Component Palette
na pgina Data Access, este objeto no a tabela em si, mas um ponteiro para a tabela, portanto

58

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

voc poder usar duplicaes da mesma tabela, sem que isso afete a integridade de seu banco de
dados.

Alterando as propriedades da Table:


1. Altere na propriedade DataBaseName, nome do banco de dados BaseDisco, caso
voc no encontre na lista o BaseDisco, abra o objeto F_Menu e tente novamente.
2. Verifique se a propriedade TableName est apontada para a tabela: CATEGOR.DB,
retire o .DB (visando a compatibilidade com outras bases)
3. Coloque a propriedade IndexFieldNames no nome do ndice primrio da tabela.
SIG_CATEG.
4. Altere a propriedade Name para TabCategor, ou seja, Tab + Nome da tabela externo
(sem a sua extenso), isto facilitar a identificao da Table e a qual DataSource que
ela pertence..
5. Outra propriedade interessante da Table Active, ela define se a tabela est ou no
ativada para o uso. Alteraremos esta propriedade via cdigo, portanto no se
preocupe muito com ela neste instante, o ideal e deix-la false, i. inativa.

As Ligaes da Tabela no Delphi realizada atravs do objeto


(DataSource),
encontrado na Component Palette na pgina Data Access, este objeto faz a ligao de sua tabela
externa com os campos do formulrio.

Alterando as propriedades do DataSource:


1. Note que a propriedade DataSet est com o nome alterado (TabCategor), est
propriedade define a table ou query (falemos nelas mais tarde) que ser ligada.
2. Altere a propriedade Name para DsCategor, ou seja, Ds + Nome da tabela externo
(sem a sua extenso), como dito antes, isto facilitar a identificao do DataSource e
a qual Table ele pertence.

Alterando os campos da tabela


Os campos da tabela devero ser alterados para conterem as crticas, lembre-se, os
campos presentes no DataModule so apenas uma mscara para os campos da tabela.

D um duplo clique sobre o TabCategor, ser aberta a janela do FieldsEditor.

Marque o campo SIG_CATEG e altere as seguintes propriedades:

Propriedade

Valor

Descrio

DisplayLabel

Sigla

Nome do campo a ser mostrado na tela

Required

True

Se o campo ou no requerido para insero de dados


na tabela

EditMask

>AA;0;_

Cria uma mscara de edio para o campo, para alterar


esta propriedade clique no boto

Outras propriedades importantes a serem levadas em considerao so:

Alignment: Alinhamento dentro do campo: Centralizado, esquerda ou direita;

59

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

DisplayWidth: Tamanho do campo disponvel para insero de dados;


FieldName: Nome do campo na tabela, externo;
Name: Nome do campo dentro do formulrio, interno;
ReadOnly: Se um campo s de leitura;
Size: Tamanho do campo na tabela; e
Visible: Campo ou no visvel.

Veja mais observaes sobre as mscaras no apndice E.

Marque o campo DES_CATEG e altere apenas a propriedade DisplayLabel para


Descrio.

Troque a propriedade Name do objeto DataModule1 para DM_Modelo.


Veja como ficou a viso final do objeto DM_Modelo, segue abaixo:

Codificando o DataModule
Voc j deve ter notado que para o Delphi a escrita de cdigos bastante reduzida e bem
dividida entre os eventos e com a criao dos DataModules o cdigo ainda fica mais reduzido,
diferentemente para os usurios de Delphi 1.0. Todas as crticas e controles para as tabelas ficaro
no DataModule enquanto que o formulrio se preocupar com o manuseamento dos campos.

Cdigo para efetivar as modificaes na tabela para as bases SQL, clique no boto
(Toggle Form/Unit) da SpeedBar, at ter a viso novamente para o DM_Modelo, d um
clique simples no objeto TabCategor (marcando-o) e na Object Inspector, na pgina
Events, d um duplo click sobre o evento AfterPost:

procedure TDM_Modelo.TabCategorAfterPost(DataSet: TDataSet);


begin
if F_Menu.DBDisco.IsSQLbased then
Se a base de dados padro SQL
begin
F_Menu.DBDisco.Commit;
Gravando as alteraes da tabela
F_Menu.DBDisco.StartTransaction;
Reinicia o modo de transaes
end;
end;

60

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O objeto que controla o banco de dados faz parte da Unit fMenu ento necessrio
fazer uso desta Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fMenu;

Para as bases de formato SQL existem trs declaraes bsicas:


1. StartTransaction - Inicia um bloco de controle para as declaraes;
2. Commit - Termina o bloco de controle gravando as alteraes feitas nas tabelas; e
3. RollBack - Termina o bloco de controle cancelando quaisquer modificaes feitas
nas tabelas.

Controlando a duplicao dos Campos-Chave

aconselhvel no permitir que o usurio duplique os cdigos de categoria, para tanto:


1. Crie um novo objeto Table com as mesmas propriedades do objeto TabCategor
(clique sobre o objeto e digite Ctrl+C e Ctrl+V, elimine as referncias aos eventos),
alterando a propriedade Name para TabCategorConf.
2. No objeto TabCategorSIG_CATEG, localize-o atravs da Object Inspector, d um
duplo click sobre o evento OnValidate

procedure TDM_Modelo.TabCategorSig_CategValidate(Sender: TField);


begin
if DSCategorState in [dsEdit, dsInsert] then
Verifica se o modo de insero ou edio de dados
if TabCategorConf.FindKey([TabCategorSIG_CATEG]) then Pesquisa o campo digit.na tab.criada
begin
F_Categ.EditSIG_CATEG.SetFocus; Altera a posio do cursor para o objeto EditSIG_CATEG
raise Exception.Create('Sigla da categoria duplicado'#10+
Caso j exista mostra
'Click no boto "Localiza" em caso de dvida');
mensagem de erro
end;
end;

Note que existe uma referncia para o objeto F_Categ (Ser o formulrio de Categoria)
precisamos ento fazer uso de sua Unit, para tanto coloque-a abaixo da diretiva de compilao:
{$R *.DFM}
uses
fMenu, { Menu Principal do Sistema }
fCateg; { Cadastro de Categorias }

A declarao #10, funciona como um Enter dentro da mensagem, isto far com que
esta mensagem tenha duas linhas.

O segundo objeto Table foi criado pois a primeira tabela estar em modo de edio ou
insero de registros e no poder ser desposicionada para a verificao, ento a verificao se o
registro existe ser feita neste segundo objeto.

61

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O comando raise impede que o registro duplicado seja adicionado na tabela, no modo
run-time este comando provocar um erro de classe exception que travar o projeto, no se
preocupe, digite F9 e prossiga com os testes, quando o projeto for compilado e rodado atravs do
.EXE o erro no travar o projeto mostrando somente a mensagem definida.

Um ltimo detalhe para o DataModule que temos que prever que a cada novo registro o
cursor deve se posicionar no primeiro campo do registro, para o incio da digitao:
1. Marque o objeto TabCategor, e d um duplo click sobre o evento OnNewRecord:

procedure TDM_Modelo.TabCategorNewRecord(DataSet: TDataSet);


begin
F_Categ.EditSig_Categ.SetFocus;
Altera a posio do cursor para o objeto EditSig_Categ
end;

Finalizando o DataModule
Salve o DataModule com o nome de DMModelo. Confira o cdigo completo para o
DataModule:
unit DMModelo;
interface
uses
SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;
type
TDM_Modelo = class(TDataModule)
TabCategorSig_Categ: TStringField;
TabCategorDes_Categ: TStringField;
DSCategor: TDataSource;
TabCategor: TTable;
TabCategorConf: TTable;
StringField1: TStringField;
StringField2: TStringField;
procedure TabCategorAfterPost(DataSet: TDataSet);
procedure TabCategorSig_CategValidate(Sender: TField);
procedure TabCategorNewRecord(DataSet: TDataSet);
private
{ private declarations }
public
{ public declarations }
end;
var
DM_Modelo: TDM_Modelo;
implementation
{$R *.DFM}
uses
fMenu, { Menu Principal do Sistema }
fCateg; { Cadastro de Categorias }

62

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

procedure TDM_Modelo.TabCategorAfterPost(DataSet: TDataSet);


begin
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
end;
procedure TDM_Modelo.TabCategorSig_CategValidate(Sender: TField);
begin
if DSCategor.State in [dsEdit, dsInsert] then
if TabCategorConf.FindKey([TabCategorSIG_CATEG]) then
begin
F_Categ.EditSIG_CATEG.SetFocus;
raise Exception.Create('Sigla da categoria duplicado'#10+
'Click no boto "Localiza" em caso de dvida');
end;
end;
procedure TDM_Modelo.TabCategorNewRecord(DataSet: TDataSet);
begin
F_Categ.EditSig_Categ.SetFocus;
end;
end.
Comandos e suas funes, por ordem de apario:
Uses - Faz o uso de determinada unidade de procedimentos e biblioteca de funes.
[DataSource].State - Define o estado em que se encontra determinado objeto DataSource.
[Objeto].SetFocus - Posiciona o cursor no objeto definido.
raise - Cria um erro de classe exception que no permitir que qualquer outra ao prossiga at a mesma ser resolvida.

Alterando o Formulrio
Com o DataModule concludo vamos atacar a janela que ser mostrada para o nosso
usurio, chame objeto Form2 (chame-o atravs da Project Manager - opo do menu View |
Project Manager).
Antes de fazermos quaisquer modificao vamos inicialmente alterar o nome da janela,
para tanto pressione a tecla F11 (aparecer a Object Inspector para o objeto Form2) altere a
propriedade Name para F_Categ.
Outra modificao importante e trocar a referncia do comando Uses abaixo da diretiva
de compilao que estava referenciado ao antigo nome do objeto DataModule (Unit1), troque-o
para:
{$R *.DFM}
uses

63

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

DMModelo; { Referencia ao DataModule }

Modificando os Labels e Campos


Os Labels, representados pelo objeto
(Label), encontrado na Component Palette na
pgina Standard, so as etiquetas de cada campo que aparece a esquerda dos campos.

Alterando as propriedades dos Labels:


1. Altere a propriedade Caption de SIG_CATEG e DES_CATEG para &Sigla: e
&Descrio:, respectivamente.
2. Modifique a propriedade Fonte de ambos para MS Sans Serif, Negrito, 8 e Castanho;
e a propriedade AutoSize para True.

Para selecionar simultaneamente vrios objetos, marque o primeiro objeto, segure a


tecla SHIFT e marque os demais.

Qualquer problema para dimensionar o tamanho de objetos use a tecla SHIFT + Setas.
Qualquer problema para acertar a posio de objetos use a tecla CTRL + Setas.

Uma propriedade interessante a FocusControl ela indicar um controle para a


posio do cursor. Ex.: Caso seja digitado ALT+S o cursor se posicionar no objeto
EditSig_Categ ou Caso seja digitado ALT+D o cursor se posicionar no objeto EditDes_Categ.
Os Campos de Edio, representados pelo objeto
(DBEdit), encontrado na
Component Palette na pgina Data Controls, so os que recebero o contedo dos campos da
tabela.

Alterando as propriedades do campo Cdigo:


1. Modifique a propriedade Fonte (de ambos os campos) para MS Sans Serif, Normal, 8
e azul marinho.
2. Verifique as propriedades DataSource e DataField, nome da ligao com DM_
Modelo.DSCategor e o nome do campo Sig_Categ, respectivamente.
3. A propriedade Name, nome do campo, montada com Edit + Nome externo do
campo. EditSig_Categ.

Alterando as propriedades do campo Descrio:


4. Verifique as propriedades DataSource e DataField, nome da ligao com
DM_Modelo.DSCategor e o nome do campo Des_Categ, respectivamente.
5. A propriedade Name, nome do campo, montada com Edit + Nome externo do
campo. EditDes_Categ.

64

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Objeto DBNavigator
O objeto para o controle da tabela, representada pelo objeto
(DBNavigator),
encontrado na Component Palette na pgina Data Controls, e apresentada pr uma barra de
funes que ligada ao DataSource controla a navegao dos campos, adio de novos registros,
edio e excluso de registros, o cancelamento ou a confirmao de uma modificao e a
atualizao do banco de dados (quando em rede):

Apresentada pelos botes: nbFirst (primeiro), nbPrior (anterior), nbNext (prximo),


nbLast (ltimo), ndInsert (inserir), ndDelete (excluir), nbEdit (editar), nbPost (confirmar),
nbCancel (cancelar) e nbRefresh (atualizar dados).

Alterando as propriedades da barra de navegao:


1. Confira a propriedade DataSource verificando para o nome da ligao com
DM_Modelo.DSCategor
2. A propriedade ConfirmDelete far com seja exibida uma mensagem, confirmando
ou no a excluso.
3. Altere a propriedade Hints, clicando em
modo:

, digite o nome de cada boto do seguinte

Primeiro
Anterior
Prximo
ltimo
Inserir
Excluir
Editar
Confirmar
Cancelar
Atualizar dados

4. Clique no boto OK e altere a propriedade ShowHint para true, isto far com que
embaixo de cada boto da barra, sobreposto pelo cursor, seja mostrado uma caixa
como uma tarja amarela com a contedo da propriedade Hint.
5. Voc poder definir quais botes devero aparecer na barra utilizando a propriedade
VisibleButtons, para tanto clique no sinal de + que aparece a esquerda da opo e
defina true ou false para os botes que sero ou no mostrados.

Modificando os Paineis
Existem dois objetos Panel criados automaticamente: o primeiro superior, abriga o objeto
DBNavigator, o segundo ocupando o restante da janela, abriga um objeto do tipo ScrollBox,
labels e campos.

Alterando as propriedades do primeiro painel:

65

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1. Altere a propriedade Alignment, alinhamento da propriedade Caption do painel,


para taLeftJustify.
2. Coloque na propriedade Caption o nome Categoria.
3. Modifique a propriedade Fonte para MS Sans Serif, Itlico, 14 e azul marinho.

Arrume a barra de navegao de modo que no cubra a descrio, se for o caso


aumente o tamanho da janela.

Alterando as propriedades do segundo painel:


1. Aumente ou diminua o tamanho da janela e note que este painel diminue e aumenta
com ela, isto se deve a propriedade Align estar no modo alClient, altere esta
propriedade (temporariamente) para alNone.

Para conseguir ver a tela de propriedades deste painel, clique em quaisquer das bordas,
pois sobre este painel existe um outro objeto denominado ScrollBox tambm no modo alClient.

Modificando a Janela
A janela est um pouco escondida atrs dos objetos painis criados, aps alterar a
propriedade Align do segundo painel, estique um pouco a janela para baixo e clique nela.

Alterando as propriedades da janela:


1. Retire as opes biMinimize e biMaximize da propriedade BorderIcons.
2. Altere na propriedade BorderStyle para bsSingle.
3. Mude a propriedade Caption para Tabela.
4. Se voc no o fez, mude a propriedade Name para F_Categ, ou seja F_ + Nome da
tabela externo (sem a sua extenso), isto facilitar a identificao entre o form e sua
unit.
5. Verifique a propriedade Position (posio da janela) ela deve estar com o valor
ScreenCenter (centralizado).
6. Salve o formulrio com o nome fCateg e salve o projeto.

Criando o terceiro Painel


Criaremos agora um terceiro painel para comportar alguns botes

Criando e alterando o painel:


1. Crie um objeto Panel, clique no objeto
(Panel), encontrado na Component
Palette na pgina Standard, e clique no objeto F_Categ, altere as seguintes
propriedades:
Propriedade

Valor

Descrio

66

Borland

Delphi e Delphi Client/Server

Align

alBottom

Caption

Desvendando o Caminho das Pedras

Alinhamento dentro do form, todo no rodap


Label do objeto

Height

41

Altura do objeto

Os botes que criaremos faro duas funes: 1.Sair da janela e 2.Localizao rpida de
um determinado registro.

Criando o primeiro boto:


1. Marque o objeto panel3 criado, click no objeto BitBtn
Component Palette na pgina Additional, e click no panel3.

, encontrado na

2. Altere as seguintes propriedades para o boto:


Propriedade

Valor

Descrio

Kind

bkClose

Determina a classe a ser utilizada pelo boto,


automaticamente ser alterado as propriedades:
Caption, Glyph e ModalResult

Caption

&Fechar

Label do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto, para alterar esta


propriedade clique no boto

Height

25

Altura

Hint

Retorna ao menu principal

Ajuda on-line para o objeto especfico

Left

312

Alinhamento a esquerda

Name

ButFechar

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Width

89

Tamanho do objeto

Criando o segundo boto:


1. Crie um segundo boto, alterando as seguintes propriedades:
Propriedade

Valor

Descrio

Caption

&Localizar

Label do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTTONS\ Imagem a ser mostrada no objeto


FIND.BMP

Height

25

Altura do objeto

Hint

Localiza determinado registro na tabela

Ajuda on-line para o objeto especfico

Left

24

Alinhamento a esquerda

Name

ButLocalizar

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma


de uma caixa de ajuda on-line

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Width

89

Tamanho do objeto

Alterando novamente as propriedades do segundo painel:


1. Recoloque a propriedade Align do objeto Panel2 para alClient e Salve o form e o
projeto.

67

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Seu trabalho final deve ter ficado deste modo:

Programando no formulrio
Agora vem a parte de cdigo. Ao final deste tpico voc observar que o trabalho maior
ficou pr conta de organizar e arrumar os objetos do que com o cdigo em si, i.e., orientao a
objetos.

Preservando as reas de Memria


Com o Delphi possvel trabalhar de duas maneiras, a primeira permitir que o Delphi
crie todos os objetos em memria aguardando simplesmente que estes sejam chamados, mas isto
implica que a mquina Client deva ter uma boa quantidade de memria para suportar os objetos
que sero ali colocados, a segunda maneira e criarmos estes objetos via cdigo permitindo que o
Delphi crie o mnimo possvel, o problema que isto implica e na demora quanto da chamada de
um formulrio, em mdia 50 segundos para ativar o formulrio1. prefervel trabalhar com o
segundo modo uma vez que para entrar em determinado formulrio o nosso usurio s o far uma
nica vez.
Inicialmente retiraremos da rea de criao automtica o formulrio de categoria e o
formulrio Sobre o sistema, para tanto, a partir do menu principal clique em Project | Options...,
clique na pgina Forms e envie no objetos F_Categ e F_Sobre (clique sobre o primeiro, segure a
tecla Shift e clique no segundo e no terceiro e em seguida clique no boto com o sinal de >) que
est na lista Auto-create forms para a lista Available forms, clique sobre o boto OK (processo
semelhante foi realizado para o formulrio F_Splash).

Este tempo com base em uma mquina 486 DX2 com 8 Mb de memria.

68

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Altere agora a instruo do formulrio F_Menu, evento OnClick para o objeto


ItemAuxilio1, para criarmos o objeto F_Sobre e aps a sua chamada destru-lo da rea
de memria:

procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);


begin
with TF_Sobre.Create(Self) do
Cria o formulrio em memria
begin
ShowModal;
Chama o formulrio atravs da rea aberta
Free;
Libera a rea aberta
end;
end;

Cdigo para ativar a Base de dados e as tabelas quando no DataModule, retorne ao


formulrio F_Categ:
1. Clique no boto
Editor.

(Toggle Form/Unit) da SpeedBar, at voc alternar para o Code

procedure FormCreate(Sender: TObject);


private
{ private declarations }
public
{ public declarations }
procedure inicio;
Criando a chamada para um procedimento pblico.
end;
var
F_Categ: TF_Categ;

69

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

implementation
{$R *.DFM}
uses
FMenu,
DMModelo;

{ Menu Principal do Sistema }


{ Referencia ao DataModule }

procedure TF_ Categ.Inicio;


begin
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
DM_Modelo.TabCategor.Open;
Screen.Cursor := crDefault;
ShowModal;
end;

Inicio do procedimento

Se a base de dados padro SQL


Inicia o modo de transaes
Ativa a Tabela
Faz o cursor ficar no formato de Seta
Mostra o formulrio F_Categ

A propriedade cursor no exemplo foi atribuda a unidade

Screen que atribui ao


sistema o modelo do cursor, mas possvel tambm atribuir um determinado cursor a um objeto
especfico, a propriedade pode ser alterada para os diversos tipos de cursores default do windows
com as figuras que se seguem:

No necessrio colocar o comando Close para o objeto butFechar pois a propriedade


Kind far isto automtico.

Cdigo para encerrar as tabelas do DataModule quando for dada sada no formulrio,
observe que o usurio no deve poder estar inserindo ou editando registros:
1. No objeto F_Categ, localize-o atravs da Object Inspector, d um duplo click sobre o
evento OnClose:

procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);


begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then Verifica se o estado do objeto
begin
DataSource Edio ou insero
MessageDlg('Cancele a edio (ou insero) da Categoria antes de fechar!', mostra mensagem
mtInformation, [mbOK], 0);
de informao
Action := caNone;
Cancela a sada da janela
Exit;
Sai da procedure
end;
Screen.Cursor := crHourGlass;
Faz o cursor virar uma ampulheta

70

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Fecha a tabela
Se a base de dados padro SQL
Encerra o modo de transaes gravando

TabCategor.Close;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
end;

as alteraes no banco de dados

A funo MessageDlg faz parte da Unit Dialogs ento necessrio fazer uso desta
Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
FMenu,
DMModelo,
Dialogs;

{ Menu Principal do Sistema }


{ Referencia ao DataModule }
{ Utilizado para o controle da funo MessageDlg }

Cdigo para localizar determinado registro, observe que se o usurio no deve estar
inserindo ou editando registros:
1. D um duplo Click sob o objeto ButLocalizar:

procedure TF_Categ.ButLocalizarClick(Sender: TObject);


var
Declarao de variveis
ObjPesquisa: String;
Cria a varivel ObjPesquisa do tipo String
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then
begin
MessageDlg('Cancele a edio (ou insero) da Categoria antes de localizar!',
mtInformation, [mbOK], 0);
Exit;
end;
ObjPesquisa := DM_Modelo.TabCategorSig_Categ.Value; Atribui a ObjPesquisa o valor do campo
de tabela Sig_Categ
if InputQuery('Entre com a sigla da categoria',
'Sigla',ObjPesquisa) then
Solicita a digitao do cdigo a ser procurado
if not DM_Modelo.TabCategor.FindKey([ObjPesquisa]) then Pesquisa o campo digitado na tabela
MessageDlg('Sigla da Categoria no encontrada.',
Caso no seja encontrado informa
mtInformation, [mbOK], 0);
end;

A funo InputQuery tambm faz parte da Unit Dialogs.


O mtodo FindKey faz parte do Objeto TTable.
Criando Funes Globais
Uma funo ou um procedimento global e uma srie de comandos comuns a um sistema
como um todo, em linguagem Pascal quase que proibido (no proibido pois a linguagem
permite) a utilizao de um mesmo conjunto de comandos repetidas vezes, note que para o nosso
formulrio temos os mesmos comandos em chamadas diferentes:
procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then
begin
MessageDlg('Cancele a edio (ou insero) da Categoria antes de fechar!',

71

Aqui
Aqui

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Aqui

mtInformation, [mbOK], 0);


Action := caNone;
Exit;
end;
...
end;
procedure TF_Categ.ButLocalizarClick(Sender: TObject);
var
ObjPesquisa: String;
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then
begin
MessageDlg('Cancele a edio (ou insero) da Categoria antes de localizar!',
mtInformation, [mbOK], 0);
Exit;
end;
...
end;

Aqui
Aqui
Aqui

Podemos ento retirar o trecho e criarmos uma funo isolada que criticar o estado da
edio devolvendo a mensagem, modificando o trecho diferente, ficando desta maneira (no
esquea de declarar a funo na rea PRIVATE):
private
function CriticaEdicao(AntesDe: String) : boolean;
public
procedure inicio;
end;

Cria a funo na rea particular

var
...
...
...
function TF_Categ.CriticaEdicao(AntesDe: String) : boolean;
Recebe o tipo da mensagem
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then
Verifica o estado
begin
MessageDlg('Cancele a edio (ou incluso) da categoria antes de ' +
AntesDe, mtError, [mbOK], 0);
Monta e envia a mensagem
Result := True;
Devolve que enviou a mens.
end
else
Result := False;
Devolve que no enviou a mens.
end;
procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if CriticaEdicao('fechar' ) then
Substitui pela chamada a funo
begin
Action := caNone;
Exit;
end;
...
end;
procedure TF_Categ.ButLocalizarClick(Sender: TObject);

72

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

var
ObjPesquisa: String;
begin
if CriticaEdicao('localizar' ) then
Exit;
...
end;

Substitui pela chamada a funo

Note que j ganhamos uma certa vantagem, ao invs de termos que alterar em dois
lugares diferentes s teremos que alterar em um nico lugar, mas ainda no est perfeito pois
devemos lembrar que um sistema normalmente no composto por apenas uma tabela, sem
contar a parte do cadastro, ento se seguirmos o mesmo padro de construo de formulrios para
outras tabelas continuaremos a repetir vrios comandos, ento vamos fazer que a nossa funo
sirva para a critica de edio de qualquer tabela, para isto precisamos enviar tambm o
DataSource que pesquisar o estado e uma outra varivel do tipo String para dizermos de qual
tabela estamos falando para cancelar a edio, v para o objeto F_Menu e crie a seguinte funo
(no esquea de declarar na rea PUBLIC):
private
procedure ShowHint (Sender: TObject);
public
function CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean;
end;

Aqui

var
...
...
{ Funo Critica Edio
Recebe: DSOrigem: DataSouce para investigar o estado
DoQue: Nome real da Tabela
AntesDe: Funo a executar do tipo Fechar, Localizar...
Devolve: True - Se o DataSource est em estado de edio ou insero
False - Se o DataSource est em estado de navegao }
function TF_Menu.CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean;
begin
if DSOrigem.State in [dsEdit, dsInsert] then
begin
MessageDlg('Cancele a edio (ou incluso) ' + DoQue + ' antes de ' +
AntesDe, mtError, [mbOK], 0);
Result := True;
end
else
Result := False;
end;

Altere agora o objeto F_Categ eliminando a funo CriticaEdicao e modificando as


chamadas:
private
{ comandos particulares }
public
procedure inicio;
end;

Elimine

var
F_Categ: TF_Categ;

73

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

...
...
Elimine as linhas da funo
...
...
procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'fechar' ) then Substitua aqui
begin
Action := caNone;
Exit;
end;
...
end;
procedure TF_Categ.ButLocalizarClick(Sender: TObject);
var
ObjPesquisa: String;
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', localizar' ) then
Exit;
...
end;

Substitua aqui

Alterando o Menu para receber o formulrio


Agora finalmente vamos rodar nosso projeto mas antes precisamos chamar o formulrio
atravs do menu principal para isto:
1. Abra o objeto F_Menu: no menu principal escolha View e Project Manager, marque o
objeto F_Menu e clique sobre o boto View form.
2. Clique em Arquivo, Tabela e Categoria, coloque o seguinte cdigo:
procedure TF_Menu.Categoria1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
Faz do cursor uma ampulheta
F_Categ := TF_Categ.Create(Application);
Cria o formulrio em memria
F_Categ.Inicio;
Chama o formulrio atravs da rea aberta
F_Categ.Free;
Libera a rea aberta
Screen.Cursor := crDefault;
Faz do cursor uma seta
end;

3. O objeto F_Categ faz parte da Unit fCateg ento necessrio fazer o uso desta Unit, para
tanto insira o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fSobre, { Janela do Sobre o Sistema }
fCateg; { Cadastro da Tabela de Categoria }

4. Saia do Code Editor e salve o formulrio e o projeto.


5. Rode o projeto e teste o formulrio de categoria, insira algumas categorias, tente provocar
o erro de duplicao, tente inserir um registro com o cdigo vazio e localizar um registro.

74

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

6. Se alguma coisa deu errada, releia o captulo, ou ento confira todo o cdigo:
unit fcateg;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, Mask, ExtCtrls, Buttons;
type
TF_Categ = class(TForm)
ScrollBox: TScrollBox;
Label1: TLabel;
EditSig_Categ: TDBEdit;
Label2: TLabel;
EditDes_Categ: TDBEdit;
DBNavigator: TDBNavigator;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
ButFechar: TBitBtn;
ButLocalizar: TBitBtn;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ButLocalizarClick(Sender: TObject);
private
{ private declarations }
public
procedure inicio;
end;
var
F_Categ: TF_Categ;
implementation
{$R *.DFM}
uses
fMenu,
DMModelo,
Dialogs;

{ Menu Principal do Sistema }


{ Referencia ao DataModule }
{ Utilizado para o controle da funo MessageDlg }

procedure TF_Categ.Inicio;
begin
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
DM_Modelo.TabCategor.Open;
Screen.Cursor := crDefault;
ShowModal;
end;
procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'Fechar' ) then
begin

75

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Action := caNone;
Exit;
end;
Screen.Cursor := crHourGlass;
DM_Modelo.TabCategor.Close;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
end;
procedure TF_Categ.ButLocalizarClick(Sender: TObject);
var
ObjPesquisa: String;
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'Localizar' ) then
Exit;
ObjPesquisa := DM_Modelo.TabCategorSig_Categ.Value;
if InputQuery('Entre com a Sigla da categoria','Sigla',ObjPesquisa) then
if not DM_Modelo.TabCategor.FindKey([ObjPesquisa]) then
MessageDlg('Sigla da Categoria no encontrada.',mtInformation,[mbOK],0);
end;
end.
Comandos e suas funes, por ordem de apario:
[Tabela].Open - Ativa um objeto Table equivalente a Active := True.
[Form].ShowModal - Ativa o objeto Form, no permitindo que nenhum outro objeto Form anterior seja ativado, at
que o mesmo seja desativado.
Exit - Sai da funo ou procedimento.
[Tabela].Close - Desativa um objeto Table equivalente a Active := False.
Var - Define uma cadeia de variveis locais.
InputQuery - Mostra uma caixa de dilogo para leitura e entrada de variveis do tipo String.
[Tabela].FindKey - Funo que realiza uma pesquisa indexada no objeto Table, atravs do ndice definido, retorna
True se encontrou ou False se fim de arquivo

76

Captulo VI
Trabalhando com janela Pai X Filha
Se voc at agora no sentiu dificuldade em criar e entender o trabalho com tabelas
livres, no sentir tambm dificuldade em criar o formulrio para receber este caso, ao contrrio,
aconselho que voc releia e refaa o captulo anterior.
Em nosso projeto, cada registro na tabela de msica s existir se houver um
correspondente na tabela bsico, ento a tabela bsico pai (mestre) da tabela msica que
sua filha (detalhe). Esta teoria acima explicada no conceito de modelo relacional de dados
(MER). O Delphi incorpora este modelo mesmo para banco de dados no-relacionais, caso
estivssemos utilizando o dBase em nosso projeto.

Criando a janela automaticamente

Se assim que voc finalizou o captulo anterior voc saiu do Delphi, reative o seu projeto.

Agora que voc est pronto para o trabalho, vamos criar a nossa janela:
1. Clique no menu principal a opo File e New..., em New Items, mude a pgina para
Forms e clique no objeto entitulado Database Form, parece cpia do captulo
anterior? cuidado leia as instrues abaixo:

2.

1.

A tabela mestre a ser usada para a janela.


Drive or Alias name: AliasDisco
Table Name: basico.dbf
Boto Next

O tipo a ser criada.


Form Options: Create a master/detail form
Uma janela mestre e detalhes
DataSet Options: Create a form using TTables
objects
Usando o objeto tabela
Boto Next.

77

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

3.

4.
Campos a serem inseridos
Boto >>
Boto Next

Formao dos campos


Vertical
Boto Next

5.

6.
Posio dos Labels
Left - A esquerda
Boto Next

A tabela detalhe a ser usada para a janela.


Drive or Alias name: AliasDisco
Table Name: musica.dbf
Boto Next

8.

7.

Formao dos campos


Grid
Boto Next

Campos a serem inseridos


Boto >>
Boto Next

9.

10.

78

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Montagem da chave de ligao


Available Indexes : Primary
Detail Fields : COD_DISCO
Master Fields : COD_DISCO
Boto Add
Joined Fields COD_DISCO -> COD_DISCO
Boto Next

Completo
Gera a tela como form principal - No
O Que gerar: Form e DataModule
Boto Finish

Sobre os DataModules
Como eu disse no captulo anterior possvel criar um nico DataModule abrangendo o
modelo relacional completo, basta para isto voc fazer o formulrio que est chamando o
DataModule controlar o comando Open e Close das tabelas. No farei desta maneira pois isto ao
mesmo tempo que simplificaria o meu trabalho dificultaria o seu entendimento, que o de uma
pessoa que estivesse aprendendo o Delphi neste momento, ento para este trabalho adotarei um
DataModule para cada cadastro.

Trabalhando com as Tabelas


Chame o objeto DataModule1 criado, a nossa primeira providncia ser a de alterar a
propriedade Name do objeto para DM_Basico, observe que foi criado dois objetos Table, o
primeiro est apontado para a tabela BASICO e o segundo para a tabela MUSICA, note que para
este segundo as propriedades MasterSource e MasterFields esto presas pelo primeiro objeto,
este o relacionamento entre ambas. Vamos antes criarmos alguns pequenos detalhes:

Crie trs objetos Table

, encontrado na Component Palette pgina Data Access, e um

objeto DataSource
, encontrado na Component Palette pgina Data Access, e altere
as seguintes propriedades:
Para o objeto Table1 (J existente):
Propriedade

Valor

Descrio

DatabaseName

BaseDisco (se este valor no estiver


disponvel chame o objeto F_Menu)

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

TableName

BASICO

Nome externo da tabela

Name

TabBasico

Nome do objeto

IndexFieldNames NOM_DISCO

Nome do campo indexado

Para o objeto DataSource1 (J existente):


Propriedade

Valor

Descrio

DataSet

TabBasico

Nome da tabela vinculada

Name

DSBasico

Nome do objeto

Para o objeto Table2 (J existente):


Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

79

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

TableName

MUSICA

Nome externo da tabela

Name

TabMusica

Nome do objeto

IndexFieldNames COD_DISCO

Nome do campo indexado

MasterSource

DSBasico

Nome do DataSource Mestre

MasterFields

COD_DISCO

Campo de ligao da tabela Mestre

Para o objeto DataSource2 (J existente):


Propriedade

Valor

Descrio

DataSet

TabMusica

Nome da tabela vinculada

Name

DSMusica

Nome do objeto

Para o objeto Table3 (Criado):


Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

TableName

BASICO

Nome externo da tabela

Name

TabBasicoConf

Nome do objeto

IndexFieldNames NOM_DISCO

Nome do campo indexado

ReadOnly

Somente para leitura

True

Para o objeto Table4 (Criado):


Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

TableName

CATEGOR

Nome externo da tabela

Name

TabCategor

Nome interno da tabela

IndexFieldNames SIG_CATEG

Nome do campo indexado

MasterSource

DSBasico

Nome do DataSource Mestre

MasterFields

SIG_CATEG

Campo de ligao da tabela Mestre

ReadOnly

True

Somente para leitura

Para o objeto DataSource3 (Criado):


Propriedade

Valor

Descrio

DataSet

TabCategor

Nome da tabela vinculada

Name

DSCategor

Nome do objeto

Para o objeto Table5 (Criado): Posicione-o ao lado do objeto DSCateg.


Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

TableName

CATEGOR

Nome externo da tabela

Name

TabCategorConf

Nome do objeto

IndexFieldNames SIG_CATEG

Nome do campo indexado

ReadOnly

Somente para leitura

True

Os objetos na hora da execuo do formulrio ficaro invisveis, mas bom coloc-los


em cantos estratgicos, isto evita a confuso.

80

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

A utilidade de cada objeto Table:

TabBasico - Tabela mestre principal.


TabBasicoConf - Tabela BASICO para realizar a validao do nome do CD.
TabMusica - Tabela utilizada para mostrar as msicas cadastradas de cada disco.
TabCategor - Tabela para mostrar a descrio da categoria.
TabCategorConf - Tabela para validao da sigla da categoria.

Crie o objeto Query


, encontrado na Component Palette pgina Data Access, que
servir para calcular o cdigo automtico, calculando sempre o cdigo de maior valor, e
altere as seguintes propriedades:

Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

Name

QryContador

Nome do Objeto

SQL

Select Max(COD_DISCO) from BASICO

Clusula SQL, selecione o maior valor do


campo COD_DISCO da tabela BASICO

O campo COD_DISCO criado, servir apenas como uma chave de ligao entre a
tabela Basico e Musica, ser uma chave interna do nosso sistema e sua alimentao se far atravs
deste objeto SQL criado pegando o maior valor e adicionando 1.

Trabalhando com os Campos


Precisamos inserir alguns campos, pois iremos precisar deles no trabalho com o cdigo e
para o objeto DBGrid1, utilize o Fields Editor para inserir os campos que faltam:
Para o objeto TabBasico:

COD_DISCO, Propriedade DisplayLabel: Cdigo;


NOM_DISCO, Propriedade DisplayLabel: Nome;
TIP_DISCO, Propriedade DisplayLabel: Tipo e EditMask: >AAA;0;_
FOT_CAPA, Propriedade DisplayLabel: Foto; e
SIG_CATEG, Propriedade DisplayLabel: Categoria e EditMask: >AA;0;_

Para o objeto TabMusica:

COD_DISCO, Propriedade Visible: False.


NUM_FAIXA, Propriedade DisplayLabel: Faixa e DisplayWidth: 2;
NOM_MUSICA, Propriedade DisplayLabel: Msica e DisplayWidth: 40; e
NOM_AUTOR, Propriedade DisplayLabel: Autor; e
TMP_MUSICA, Propriedade DisplayLabel: Tempo e EditMask: 00\:00;0;_

Para o objeto QryContador:

De um duplo clique sobre o objeto aparecer a janela Fields Editor, clique com o boto
direito e no menu que aparecer clique na opo Add Fields... e adicione o campo.

81

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Antes de iniciarmos a programao do DataModule compare como ficou o DataModule e


salve-o com o nome de DMBasico:

Controlando o DataModule
Agora falta o cdigo, note que a maior parte uma repetio daquilo que j vimos
anteriormente:

Ativando as tabelas ao ser chamado DataModule:


1. Clique no objeto DMBasico e na Object Inspector na pgina Events d um duplo
clique sobre o evento OnCreate e altere-o do seguinte modo:

procedure TDM_Basico.DM_BasicoCreate(Sender: TObject);


begin
if F_Menu.DBDisco.IsSQLbased then
Se a base de dados padro SQL
F_Menu.DBDisco.StartTransaction;
Inicia o modo de transaes
TabCategor.Open;
Ativa as tabelas
TabCategorConf.Open;
TabMusica.Open;
TabBasico.Open;
TabBasicoConf.Open;
end;

Cdigo para encerrar as transaes com a Base de Dados e fechar as tabelas quando for
encerrado o DataModule.
1. Digite F11 e localize o objeto DM_Categ, na Object Inspector, na pgina Events, d
um duplo click sobre o evento OnDestroy:

procedure TDM_Basico.DM_BasicoDestroy(Sender: TObject);


begin
TabBasico.Close;
Fecha as tabelas
TabBasicoConf.Close;
TabMusica.Close;
TabCategor.Close;
TabCategorConf.Close;
if F_Menu.DBDisco.IsSQLbased then
Se a base de dados padro SQL
F_Menu.DBDisco.Commit;
Encerra o modo de transaes gravando as
end;
alteraes no banco de dados

82

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Lembre-se da utilizao do objeto F_Menu, ento preciso declarar a unidade a qual


ele pertence com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fMenu; { Menu Principal }

Repare que no incio desta Unit tambm existe uma outra declarao Uses, aps a
sesso interface, ento por que no colocar todas essas declaraes em um lugar s? 1o) O Delphi
controlar (colocando ou removendo) as Units ali colocadas (dependendo dos objetos utilizados)
e 2o) Todos os comandos declarados antes da declarao implementation (com exceo de
eventos de criao do tipo onCreate), sero executados e objetos e units ficaro em memria
esperando serem chamados, ento impraticvel colocar units que s sero utilizadas em tempo
de execuo.

Contadores
O objeto query realiza consultas em modo SQL, no prximo captulo o utilizaremos para
criarmos nossas consultas mas, neste momento ele ser utilizado para verificar qual o maior valor
armazenado no campo cdigo.

A cada novo registro devemos criar tambm um novo COD_DISCO (lembra do objeto
QryContador). Alm disso, precisamos nos posicionar no primeiro campo do cadastro,
isto ser realizado em dois eventos distintos:
1. Marque o objeto TabBasico, e d um duplo clique sobre o evento onNewRecord:

procedure TF_Basico.TabBasicoNewRecord(DataSet: TDataset);


begin
F_Basico.EditNOM_DISCO.SetFocus;
Posiciona o cursor no objeto
end;

Observe que foi utilizado o objeto F_Basico, ento preciso declarar a unidade a qual
ele pertence com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fBasico; { Cadastro do Bsico }
fMenu; { Menu Principal }

2. Digite F11 e d um duplo clique sobre o evento BeforePost:


procedure TF_Basico.TabBasicoBeforePost(DataSet: TDataset);
begin
if DSBasico.State = dsInsert then
Verifica se uma incluso na base
begin
QryContador.Active := False;
Desativa a Query
QryContador.Active := True;
Ativa a Query
with QryContador.Fields[0] do
Observe os lembretes
if IsNull then
Se o valor do contador nulo
TabBasicoCOD_DISCO.Value := 1
Atribui 1 ao campo COD_DISCO
else
Seno
TabBasicoCOD_DISCO.Value := AsInteger + 1;
Atribui ao campo COD_DISCO a adio

83

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

end;
end;

de 1 ao valor do contador campo

O comando with utilizado como mtodo de taquigrafia, para no escrevermos vrias


vezes o mesmo nome de um determinado objeto.

Porque no colocarmos todo o cdigo no evento onNewRecord ? Por causa do


controle multi-usurio, imagine, um indivduo A inicia a incluso de um CD, e um indivduo B
tambm inicia outra incluso, como o cdigo do indivduo A ainda no foi gravado no banco, ser
dado o mesmo cdigo para o indivduo B, isto no acontecer se o cdigo for calculado
momentos antes de ser gravado o registro, com o caso do evento BeforePost.

Para confirmarmos as alteraes para a base SQL, pressione novamente a tecla F11 e na
pgina Events, d um duplo click sobre o evento AfterPost:

procedure TDM_Basico.TabBasicoAfterPost(DataSet: TDataSet);


begin
if F_Menu.DBDisco.IsSQLbased then
Se a base de dados padro SQL
begin
F_Menu.DBDisco.Commit;
Gravando as alteraes da tabela
F_Menu.DBDisco.StartTransaction;
Reinicia o modo de transaes
end;
end;

Validando os Campos
Para no acontecer um duplicao dos nomes dos CDs, utilizaremos para a crtica a
mesma idia do que aconteceu com o formulrio de Categoria:
1. Marque o objeto TabBasicoNOM_DISCO, e d um duplo clique sobre o evento
OnValidate:
procedure TDM_Basico.TabBasicoNom_DiscoValidate(Sender: TField);
begin
if DSBasico.State in [dsEdit, dsInsert] then
Se o modo de insero ou edio
if TabBasicoConf.FindKey([TabBasicoNOM_DISCO]) then
Pesquisa o campo digitado
begin
F_Basico.EditNOM_DISCO.SetFocus;
Altera a posio do cursor
raise Exception.Create('Nome do CD duplicado'#10+
Caso j exista mostra mensagem
'Click no boto "Localiza" em caso de dvida');
de erro e impede o cadastro
end;
end;

Para que o nosso usurio escolha somente as categorias existentes:


1. Marque o objeto TabBasicoSIG_CATEG, e d um duplo clique sobre o evento
OnValidate:

procedure TDM_Basico.TabBasicoSig_CategValidate(Sender: TField);


begin
if DSBasico.State in [dsEdit, dsInsert] then
if not (TabCategorConf.FindKey([TabBasicoSIG_CATEG])) then Observe o comando NOT
begin
F_Basico.EditSIG_CATEG.SetFocus;
raise Exception.Create('Sigla da categoria no existe'#10+

84

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

'Click no boto "Localiza Categoria" em caso de dvida');


end;
end;

Com o DataModule o nosso trabalho j est concludo, salve o objeto e confirme o


cdigo:
unit DMBasico;
interface
uses
SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;
type
TDM_Basico = class(TDataModule)
TabMusicaCod_Disco: TFloatField;
TabMusicaNum_Faixa: TFloatField;
TabMusicaNom_Musica: TStringField;
DSBasico: TDataSource;
TabBasico: TTable;
TabMusica: TTable;
DSMusica: TDataSource;
TabBasicoConf: TTable;
TabCategor: TTable;
TabCategorConf: TTable;
DSCategor: TDataSource;
TabBasicoCod_Disco: TFloatField;
TabBasicoNom_Disco: TStringField;
TabBasicoTip_Disco: TStringField;
TabBasicoFot_Capa: TBlobField;
TabBasicoSig_Categ: TStringField;
QryContador: TQuery;
QryContadorMAXOFCOD_DISCO: TFloatField;
procedure DM_BasicoCreate(Sender: TObject);
procedure DM_BasicoDestroy(Sender: TObject);
procedure TabBasicoNewRecord(DataSet: TDataSet);
procedure TabBasicoBeforePost(DataSet: TDataSet);
procedure TabBasicoAfterPost(DataSet: TDataSet);
procedure TabBasicoNom_DiscoValidate(Sender: TField);
procedure TabBasicoSig_CategValidate(Sender: TField);
private
{ private declarations }
public
{ public declarations }
end;
var
DM_Basico: TDM_Basico;
implementation
{$R *.DFM}
uses
fBasico, { Cadastro do Bsico }

85

Borland
fMenu;

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Menu Principal }

procedure TDM_Basico.DM_BasicoCreate(Sender: TObject);


begin
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
TabCategor.Open;
TabCategorConf.Open;
TabMusica.Open;
TabBasico.Open;
TabBasicoConf.Open;
end;
procedure TDM_Basico.DM_BasicoDestroy(Sender: TObject);
begin
TabBasico.Close;
TabBasicoConf.Close;
TabMusica.Close;
TabCategor.Close;
TabCategorConf.Close;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
end;
procedure TDM_Basico.TabBasicoNewRecord(DataSet: TDataSet);
begin
F_Basico.EditNOM_DISCO.SetFocus;
end;
procedure TDM_Basico.TabBasicoBeforePost(DataSet: TDataSet);
begin
if DSBasico.State = dsInsert then
begin
QryContador.Active := False;
QryContador.Active := True;
with QryContador.Fields[0] do
if IsNull then
TabBasicoCOD_DISCO.Value := 1
else
TabBasicoCOD_DISCO.Value := AsInteger + 1;
end;
end;
procedure TDM_Basico.TabBasicoAfterPost(DataSet: TDataSet);
begin
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
end;
procedure TDM_Basico.TabBasicoNom_DiscoValidate(Sender: TField);
begin
if DSBasico.State in [dsEdit, dsInsert] then
if TabBasicoConf.FindKey([TabBasicoNOM_DISCO]) then

86

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin
F_Basico.EditNOM_DISCO.SetFocus;
raise Exception.Create('Nome do CD duplicado'#10+
'Click no boto "Localiza" em caso de dvida');
end;
end;
procedure TDM_Basico.TabBasicoSig_CategValidate(Sender: TField);
begin
if DSBasico.State in [dsEdit, dsInsert] then
if not (TabCategorConf.FindKey([TabBasicoSIG_CATEG])) then
begin
F_Basico.EditSIG_CATEG.SetFocus;
raise Exception.Create('Sigla da categoria no existe'#10+
'Click no boto "Localiza Categoria" em caso de dvida');
end;
end;
end.

Alterando a Janela Criada


Vamos novamente alterar a janela criada, como j foi dito, vou usar um padro de janela
que achei como ideal, mas voc poder, futuramente, tambm encontrar o seu prprio padro,
ento vamos as alteraes, antes, lembre-se, preciso entender e compreender totalmente o
captulo anterior e o DataModule criado deve ter passado pela verificao sem erros, para
verificar um objeto a partir do menu principal escolha as opes Project | Syntax Check.
Deve ocorrer um erro na clusula Uses informando que a unidade fBasico no existe nem
o objeto F_Basico no foi encontrado, ento antes de qualquer passo chame o objeto Form2 e
altere a propriedade Name para F_Basico e salve o formulrio com o nome de fBasico, pode
novamente verificar a unidade DMBasico que desta vez no haver problemas.

Aproveite o objeto F_Basico para alterar a clusula uses logo abaixo da diretiva de
compilao para:
{$R *.DFM}
uses
DMBasico; { Referncia ao DataModule }

Organizando os Panels
Vamos passar para as alteraes com objeto F_Basico. Os objetos da janela se encontram
distribudos em trs objetos Panel, o primeiro (Panel1) guarda o objeto DBNavigator, o segundo
(Panel2) guarda os labels e os campos do arquivo BASICO e o terceiro (Panel3) guarda o objeto
DBGrid1 que controlar o arquivo MUSICA.

Altere a propriedade Align do objeto Panel3, para alNone.

Aumente a janela do modo que todos os campos do objeto mestre apaream.


87

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Coloque os objetos label4 e ImageFOT_CAPA a direita dos outros campos.

Depois de tudo arrumado altere a propriedade AutoScroll no objeto ScrollBox para


True depois para False, isto far com que a barra de rolagem vertical desaparea.
Crie um quarto objeto Panel
para colocar os botes, conforme as instrues do
captulo anterior, para facilitar o trabalho chame o objeto F_Categ, atravs do Project Manaager,
clique sobre o objeto Panel3 e pressione Ctrl+C chame novamente o objeto Form2 e pressione
Ctrl+V, crie um terceiro boto e altere as seguintes propriedades:
Propriedade

Valor

Descrio

Caption

&Msicas

Label do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTTON
S\CDDRIVE.BMP

Imagem a ser mostrada no objeto

Height

25

Altura do objeto

Hint

Cadastro e manuteno das msicas

Ajuda on-line para o objeto especfico

Name

ButMusica

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a


forma de uma caixa de ajuda on-line

Width

89

Tamanho do objeto

Reorganize os trs botes no objeto Panel4

Modificando os campos e Labels

Exclua o label (objeto Label1) e o campo (objeto EditCOD_DISCO) que faz referncia ao
COD_DISCO.

Modifique a fonte dos campos e labels conforme descrito no captulo anterior.

Altere as propriedades Caption dos Labels para: &Nome:, &Tipo:, Cate&goria:


e &Capa: respectivamente

Altere a propriedade AutoSize dos Labels para True

Modifique a propriedade Stretch do objeto ImageFOT_CAPA para true, isto far com
que a imagem da capa fique sempre de acordo com o tamanho do objeto.

Organizando os Panels
Vamos organizar cada objeto Panel por partes:
Objeto Panel1

Modifique o objeto DBNavigator conforme descrito no captulo anterior.

88

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Para a propriedade Hints, escreva novamente o auxlio para cada boto ou, chame o
formulrio F_Categ e copie as descries da propriedade Hints com Ctrl+C e chame
novamente o objeto DBNavigator e digite Ctrl+V dentro da propriedade.

Modifique tambm o objeto Panel1 conforme descrito no captulo anterior e altere a


propriedade Caption para CDs.
Objeto Panel2

Altere as propriedades Height e Width para 216 do objeto ImageFOT_CAPA.

Crie um novo objeto Label e altere as seguintes propriedades:

Propriedade

Valor

Descrio

Caption

&Msicas:

Label do objeto

Font

MS Sans Serif, Negrito, 8, Castanho

Tipo de letra a ser mostrada no objeto

FocusControl

DBGrid1

Controle do foco

Aumente o objeto Panel2 de forma a caber os outros objetos, organize os objetos da


seguinte forma: Nome, Tipo, Categoria e Msicas, ao lado coloque a foto. Deixe o espao
de um campo entre Categoria e Msicas.

Remova o objeto EditTIP_DISCO e em seu lugar crie o objeto DBComboBox


,
encontrado na Component Palette pgina Data Controls, e altere as seguintes
propriedades:

Propriedade

Valor

Descrio

DataSource

DM_Basico.DSBasico

DataSource vinculado

DataField

TIP_DISCO

Campo de tabela

Font

MS Sans Serif, Normal, 8, Azul Marinho

Tipo de letra a ser mostrada no objeto

Hint

Selecione o tipo

Ajuda on-line para o objeto especfico

Items

AAA; AAD; ADD; e DDD

Itens que aparecero como opes do COMBO


BOX, coloque um em cada linha.

Name

ComboTIP_DISCO

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a


forma de uma caixa de ajuda on-line

No objeto Label3 recoloque a propriedade FocusControl apontando para o objeto


ComboTIP_DISCO.
Objeto Panel3

Marque o objeto DBGrid1 e altere as propriedades Align para alNone e BorderStyle para
bsSingle, pressione Ctrl+X marque o objeto ScrollBox e pressione Ctrl+V, acerte o
objeto de forma que este caiba abaixo do objeto Label1 (Msicas:).

Elimine o objeto Panel3, clique sobre ele e pressione Del.

Modificando a Janela

Altere as propriedades BorderIcons, BorderStyle e Position conforme descrito no


captulo anterior.

89

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Mude a propriedade Caption para Cadastro.

Altere a propriedade Align do objeto Panel2 para alClient e acerte as posies no


formulrio.

Salve o formulrio e salve o projeto.

No espao deixado entre os labels de Categoria e Msica, crie o objeto DBText


,
encontrado na Component Palette pgina Data Controls, que servir para mostrar o nome
da categoria selecionada, altere as seguintes propriedades:

Propriedade

Valor

Descrio

DataSource

DM_Basico.DSCategor

DataSource vinculado

DataField

DES_CATEG

Campo de tabela

Font

MS Sans Serif, Normal, 8, Castanho

Tipo de letra a ser mostrada no objeto

Crie agora trs objetos SpeedButton


Additional:

, encontrado na Component Palette pgina

Para o objeto SpeedButton1: Posicione-o ao abaixo do label Capa.


Propriedade

Valor

Descrio

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\ANIMATN.BMP

Height

25

Altura do objeto

Hint

Cpia imagem da rea de


tranferncia

Ajuda on-line para o objeto especfico

Name

ButPaste

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Width

25

Tamanho do objeto

Para o objeto SpeedButton2: Posicione-o ao abaixo do objeto EditCOD_CATEG


Propriedade

Valor

Descrio

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\LANTERNA.BMP (veja
dica)

Height

25

Altura do objeto

Hint

Pesquisa determinada categoria

Ajuda on-line para o objeto especfico

Name

ButLocCateg

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Width

25

Tamanho do objeto

Para o objeto SpeedButton3: Posicione-o ao lado do objeto ButLocCateg


Propriedade

Valor

Descrio

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\CRDFILE2.BMP

Height

25

Altura do objeto

Hint

Insere registro na tabela de

Ajuda on-line para o objeto especfico

90

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

categoria
Name

ButInsCateg

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Width

25

Tamanho do objeto

A funo de cada boto est explicada na propriedade hint, para os objetos


ButLocCateg e ButInsCateg iremos nos aproveitar dos formulrios j construdos anteriormente.

Provavelmente voc no ir encontrar o arquivo LANTERNA.BMP solicitado para o


segundo boto, teremos de cri-lo:
1. Salve o formulrio e feche o projeto, localize (no diretrio demos do Delphi) e abra o
projeto [DiretrioDelphi]\DEMOS\DB\MASTAPP\MASTAPP.DPR
2. Atravs do Project Manager abra o formulrio SearchDlg.
3. Localize o objeto SearchButton e clique

na propriedade Glyph.

4. Escolha o boto Save... e salve-o no diretrio


([DiretrioDelphi]\IMAGES\BUTTONS\ e LANTERNA.BMP).

nome

proposto

5. Retorne ao nosso projeto descartando quaisquer aviso para salvar o MASTAPP.DPR.

Trabalhando com Grids


Falemos agora de um objeto especial o Grid, especial por ser um dos objetos de todo o
conjunto do Delphi o mais prtico e fcil de usar, quem no se lembra no velho Clipper da funo
dbEdit( ), quem no utilizou seus recursos para mostrar registros ou realizar consultas com filtros
especiais. O objeto Grid o neto deste objeto com alguns recursos mais simplificados, no total
so trs os objetos Grids:
1. StringGrid
- Componente da unidade Grid sendo utilizado para, de forma
simplificada, associar Strings a uma grade contendo linhas e colunas, encontrado
na Component Palette pgina Additional.
2. DrawGrid
- Componente da unidade Grid que permite mostrar uma
estrutura de dados existentes no formato de linhas e colunas, encontrado na
Component Palette pgina Additional.
3. DBGrid
- Componente da unidade DBGrids que mostrar dados de um
DataSet para um componente no formato de linhas e colunas, encontrado na
Component Palette pgina Data Controls.
Por enquanto vou me deter a falar do objeto DBGrid, mais tarde voltaremos a falar dos
outros, este objeto DBGrid vinculado, ao DataSource, apresenta as seguintes propriedades (mais
importantes, algumas ainda no mencionadas):

DataSource: Nome do objeto DataSource vinculado;


Font: Tipo da letra a ser mostrada no contedo do objeto;

91

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Options: srie de opes de controle (se a opo True for selecionada):


dgEditing: permite a edio e adio dos dados;
dgAlwaysShowEditor: O grid entra automaticamente em modo de edio, no
havendo a necessidade de pressionar Enter ou F2 (depende que a propriedade
dgEditing = True);
dgTitles: Viabiliza o uso do ttulo de cada campo;
dgIndicator: Habilita o ponteiro de indicao da coluna;
dgColumnResize: A coluna pode ser redimensionada;
dgColLines: Habilita a separao das colunas;
dgRowLines: Habilita a separao das linhas;
dgTabs: Use o pressionamento das teclas Tab e Shif+Tab para se mover dentro das
colunas;
dgRowSelect: Seleciona, com uma tarja azul, todas as colunas de uma linha;
dgAlwawsShowSelection: As clulas do grid so mostradas constantemente
selecionadas, mesmo que este no detenha o foco.
dgConfirmDelete: Use as teclas Ctrl+Del, para excluir dados;
dgCancelOnExit: Se qualquer incluso estiver pendente e for dado sada no grid sem
a validao dos dados, a incluso cancelada. Previne a incluso de registros
invlidos ou em branco.

TitleFont: Tipo da letra a ser mostrada nos ttulos do objeto.

Os campos no objeto DBGrid so adicionados e controlados atravs do FieldsEditor


O nosso objeto grid mostrar apenas as msicas de cada CD, para tanto altere as
seguintes propriedades:
Propriedade

Valor

Descrio

Font

MS Sans Serif, Negrito, 8, Castanho

Tipo de letra a ser mostrada no objeto

Hint

Msicas deste CD

Ajuda on-line para o objeto especfico

Options

[dgTitles, dgIndicator, dgColLines,


dgRowLines, dgRowSelect,
dgAlwaysShowSelection]

Opes de controle

ShowHint

True

Mostrar o contedo da propriedade hint sob a


forma de uma caixa de ajuda on-line

No lhe aconselho usar este objeto para realizar alteraes em bases de dados (apesar
de isto ser possvel) mais prtico utilizar uma janela separada para realizar este trabalho, as
idias ficaro mais bem ordenadas, se cada formulrio controlar uma nica entrada em tabela de
cada vez.

Se voc est meio perdido com isto tudo, no se desespere, simplesmente compare os
formulrios para ver se no falta nada:

92

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Finalmente, a programao
Agora falta apenas o cdigo, pelo tamanho do formulrio e pelo nmero de controles j
d para pensarmos que precisamos programar linhas e linhas de cdigo, engano ! o maior trabalho
j foi feito, observe:

Criando o DataModule ao ser chamado formulrio:


1. Clique no boto
Editor.

public
procedure inicio;
end;

(Toggle Form/Unit) da SpeedBar, at voc alternar para o Code

Criando a chamada para um procedimento pblico.

var
F_Basico: TF_Basico;
implementation
{$R *.DFM}
procedure TF_Basico.Inicio;
begin
DM_Basico := TDM_Basico.Create(Application);
Screen.Cursor := crDefault;
ShowModal;
end;

Crie o incio do procedimento


Cria o DataModule
Faz o cursor ficar no formato de Seta
Mostra o formulrio F_Basico

Cdigo para eliminar o DataModule, basicamente o mesmo trabalho realizado com o


objeto F_Basico:

93

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1. No objeto F_Basico, d um duplo click sobre o evento OnClose:


procedure TF_Basico.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Fechar') then Lembra da Funo
begin
Action := caNone;
Cancela a sada da janela
Exit;
Sai da procedure
end;
Screen.Cursor := crHourGlass;
Faz o cursor virar uma ampulheta
DM_Basico.Free;
Elimina o DataModule
end;

Lembre-se que a funo CriticaEdicao faz parte da Unit fMenu, ento preciso
declarar esta unidade com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
DMBasico, { Referncia ao DataModule }
fMenu;
{ Menu Principal do Sistema }

Colocado para o uso da Funo CriticaEdicao

Repare que no incio desta Unit existe uma declarao Uses, aps o comando
interface. Ento por que no colocar todas essas declaraes em um lugar s? 1.O Delphi
controlar (colocando ou removendo) estas Units ali colocadas (dependendo dos objetos
utilizados) e 2.Todos os comandos declarados antes da declarao implementation (com exceo
de eventos de criao. Ex.: onCreate), sero executados e objetos e units ficaro em memria
esperando serem chamados, ento impraticvel colocar units que s sero utilizadas em tempo
de execuo.

Consulta

Cdigo para pesquisar os registros das tabelas, basicamente utilizaremos o mesmo


trabalho realizado com o objeto F_Categ:
1. D um duplo click sob o objeto ButLocalizar:

procedure TF_Basico.ButLocalizarClick(Sender: TObject);


var
ObjPesquisa: String;
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Localizar') then
Exit;

Lembra da Funo

ObjPesquisa := TabBasicoNOM_DISCO.Value;
if InputQuery('Pesquisa','Entre com o nome do CD (ou parte).', ObjPesquisa) then
TabBasico.FindNearest([ObjPesquisa]);
end;

Lembre-se que a funo InputQuery faz parte da Unit Dialogs, ento preciso
declarar esta unidade com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}

94

Borland

Delphi e Delphi Client/Server

uses
DMBasico, { Referncia ao DataModule }
fMenu,
{ Menu Principal do Sistema }
Dialogs;
{ Gerente de Mensagens }

Desvendando o Caminho das Pedras

Colocado para o uso da Funo InputQuery

Desta vez foi utilizado o comando FindNearest, este comando consulta por parte
inicial do cdigo encontrado um cdigo igual ou maior que o pesquisado, no preciso ao usurio
lembrar o nome completo como no comando FindKey. Ateno: o comando FindNearest no
retornar uma varivel boolean (True ou False como resultado da pesquisa) ento no se faz a
necessidade de crticas sobre o mesmo. Salvo exceo se o campo for tipo numrico ou tipo data
ento utilize este comando em conjunto com o comando Try. Veja no prximo captulo como.

O cdigo para o boto que localizar um registro na tabela de categoria ser tratado no
prximo captulo.

Para inserir novos registros na tabela de categoria utilizaremos o formulrio construdo


anteriormente, a nica diferena que desta vez devemos estar em modo de edio:
1. D um duplo click sobre o objeto ButInsCateg:

procedure TF_Basico.ButInsCategClick(Sender: TObject);


begin
if not (DSBasico.State in [dsEdit, dsInsert]) then
Se no estiver em estado de ediao ou
begin
incluso
MessageDlg('Voc no est no modo de edio!',
Envia mensagem de erro
mtInformation, [mbOK], 0);
exit;
end
Screen.Cursor := crHourGlass;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
with TF_Categ.Create(Self) do
begin
Inicio;
Free;
end;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;

Faz o cursor virar uma ampulheta


Gravamos as alteraes no banco de dados
Cria o formulrio na rea de memria
Chama o formulrio
Elimina o formulrio da memria
Se a base de dados padro SQL
Inicia o modo de transaes
Faz o cursor ficar no formato de Seta

No esquea de declarar a Unit deste formulrio:


{$R *.DFM}
uses
DMBasico, { Referncia ao DataModule }
fMenu,
{ Menu Principal do Sistema }
Dialogs,
{ Gerente de Mensagens }
fCateg;
{ Cadastro de Categorias }

95

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Trabalhando com a rea de Transferncia


Na maioria dos aplicativos para Windows comun encontrarmos os comandos Recortar,
Copiar e Colar, o famoso Cut/Copy/Paste, isto realizado utilizando a rea de transferncia do
Windows:
So trs os comandos que fazem o trabalho na rea de transferncia:

Objeto.CutToClipboard, envia o contedo do objeto para rea de transferncia; e


Objeto.CopyToClipboard, faz uma cpia do contedo do objeto na rea de transferncia.
Objeto.PasteFromClipboard, traz para o contedo do objeto da rea de transferncia;

Prximo passo, o cdigo para o boto que permitir trazer uma imagem armazenada na
rea de transferncia do Windows (Salva com o utilitrio PaintBrush, por exemplo) para
o campo da Foto:
1. D um duplo click sobre o objeto ButPaste:

procedure TF_Basico.ButPasteClick(Sender: TObject);


begin
ImageFOT_CAPA.PasteFromClipboard;
end;

Utilizando o objeto OpenDialog


Um aluno uma vez me sugeriu uma outra maneira de colocar a figura, ao invs de se
utilizar da rea de transferncia, poderamos chamar o arquivo (.BMP) diretamente, isto
realizado com o uso de um objeto OpenDialog
, encontrado na Component Palette pgina
Dialog, coloque-o no formulrio e altere as seguintes propriedades:
Propriedade

Valor

Descrio

Filter

Arquivos bitmap|*.BMP

Seleciona os tipos de arquivo que sero abertos

Name

AbreBmp

Nome do Objeto

Prximo passo, o cdigo para o boto que permitir trazer uma imagem em arquivo .BMP
para o campo da Foto:
1. D um duplo click sobre o objeto ButPaste:

procedure TF_Basico.ButPasteClick(Sender: TObject);


begin
If AbreBmp.Execute then
Verifica se foi clicado em OK
ImageFot_Amostra.Picture.LoadFromFile( AbreBmp.FileName ); Carrega o arquivo
end;

Escolha a maneira que mais lhe agrada.


Outro objeto interessante o objeto SaveDialog, veja outras utilizaes sobre eles no
apndice F

96

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Criando o formulrio para o cadastro das msicas


Construiremos o formulrio para cadastrar as msicas, crie o formulrio com base no
formulrio criado para a tabela de categoria e faa as seguintes alteraes:

Altere a propriedade name do formulrio para F_MUSICA.


Chame o DataModule DMBasico e crie mais um objeto TTable, para fazermos as crticas
das msicas duplicadas e altere as seguintes propriedades:

Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Banco de Dados ou a localizao do


diretrio das tabelas

TableName

MUSICA

Nome externo da tabela

Name

TabMusicaConf

Nome do objeto

IndexFieldNames Cod_Disco;Num_Faixa

Nome do campo indexado

ReadOnly

Somente leitura

True

No esquea de alterar o programa do DataModule para abrir e fechar a nova tabela e


coloque a crtica para a tabela de msica, evento OnValidate do objeto TabMusicaNum_Faixa:
procedure TDM_Basico.TabMusicaNum_FaixaValidate(Sender: TField);
begin
if DSMusica.State in [dsEdit, dsInsert] then
begin
TabMusicaConf.EditKey;
TabMusicaConf.FieldByName('COD_DISCO').AsFloat := TabMusicaCod_Disco.Value;
TabMusicaConf.FieldByName('NUM_FAIXA').AsFloat := TabMusicaNum_Faixa.Value;
if TabMusicaConf.GotoKey then
begin
F_Musica.EditNum_Faixa.SetFocus;
raise Exception.Create('Faixa do CD duplicada');
end;
end;
end;

Repare no uso do comando GotoKey ao invs do comando FindKey, ele foi utilizado
por se tratar de uma chave composta.

Coloque tambm a crtica para a tabela de msica, evento OnNewRecord do objeto


TabMusica:
procedure TDM_Basico.TabMusicaNewRecord(DataSet: TDataSet);
begin
F_Musica.EditNUM_FAIXA.SetFocus;
end;

Uma ltima crtica ser para confirmarmos as alteraes para a base SQL, pressione
novamente a tecla F11 e na pgina Events, d um duplo click sobre o evento AfterPost:
procedure TDM_Basico.TabMusicaAfterPost(DataSet: TDataSet);
begin
if F_Menu.DBDisco.IsSQLbased then
Se a base de dados padro SQL
begin

97

Borland

Delphi e Delphi Client/Server

F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
end;
Deixe apenas o boto Fechar;

Desvendando o Caminho das Pedras

Gravando as alteraes da tabela


Reinicia o modo de transaes

Remova o Label e o DBEdit do campo COD_DISCO; e


Mude a propriedade do BorderStyle para bsDialog.

Observe e compare com o desenho do formulrio abaixo:

Altere inicialmente, a clusula uses para o DMBasico, em seguida a propriedade de todos


os campos e do DBNavigator para DM_Basico.DSMusica.

A programao do formulrio basicamente a mesma para as tabelas, ento ao invs de


perder tempo e espao falando tudo de novo, observe o cdigo completo e note que a
nica mudana est em prevenir para que o formulrio no seja fechado em tempo de
edio ou insero e com o estado do cursor:

unit fMusica;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, Buttons, Mask, ExtCtrls;
type
TF_Musica = class(TForm)
ScrollBox: TScrollBox;
Label2: TLabel;
EditNum_Faixa: TDBEdit;
Label3: TLabel;
EditNom_Musica: TDBEdit;
Label4: TLabel;
EditNom_Autor: TDBEdit;
Label5: TLabel;
EditTmp_Musica: TDBEdit;
DBNavigator: TDBNavigator;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;

98

Delphi e Delphi Client/Server

Borland

Desvendando o Caminho das Pedras

ButFechar: TBitBtn;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ private declarations }
public
{ public declarations }
end;
var
F_Musica: TF_Musica;
implementation
{$R *.DFM}
uses
DMBasico;

{ Referncia ao DataModule }

procedure TF_Musica.FormShow(Sender: TObject);


begin
Screen.Cursor := crDefault;
end;

Evento OnShow do objeto F_Musica

procedure TF_Musica.FormClose(Sender: TObject; var Action: TCloseAction);


begin
Evento OnClose do objeto F_Musica
if F_Menu.CriticaEdicao(DM_Basico.DSMusica, 'Msica', 'fechar' ) then
begin
Action := caNone;
exit;
end;
Screen.Cursor := crHourGlass;
end;
end.

No preciso se preocupar com a gravao para o campo COD_DISCO, isto ser feito
automaticamente pelo Delphi, mantendo a integridade referencial.

Salve o formulrio com o nome fMusica.

Vamos agora alterar o boto do formulrio principal, objeto butMusica, que ser usado
para chamar este segundo.
procedure TF_Basico.ButMusicaClick(Sender: TObject);
begin
if DM_Basico.DSBasico.State in [dsEdit, dsInsert] then
begin
MessageDlg('Salve a edio do CD antes de Editar as msicas!',mtInformation, [mbOk], 0);
Exit;
end;
Screen.Cursor := crHourGlass;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
with TF_Musica.Create(Self) do
Criamos o formulrio em memria
begin

99

Borland

Delphi e Delphi Client/Server

ShowModal
Free;
end;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;

Desvendando o Caminho das Pedras

Chamaremos aqui o novo formulrio


Eliminamos o Formulrio

No esquea de adicionar a propriedade uses


{$R *.DFM}
uses
DMBasico,
fMenu,
Dialogs,
fCateg,
fMusica;

{ Referncia ao DataModule }
{ Menu Principal do Sistema }
{ Gerente de Mensagens }
{ Cadastro de Categorias }
{ Cadastro de Msicas }

No esquea tambm de retirar os objetos F_Musica e F_Basico da criao


automtica, opo do menu principal clique em Options | Project..., qualquer dvida consulte o
captulo anterior.

Criando novos Procedimentos Globais


Vamos criar mais alguns procedimentos globais, para a nosso primeiro procedimento
note as chamadas aos formulrios externos F_Categ e F_Musica:
Screen.Cursor := crHourGlass;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
...
...
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
Screen.Cursor := crDefault;

Os comandos listados se repetem tanto para o procedimento ButInsCategClick e para o


procedimento ButMusicaClick, chame o formulrio F_Menu e crie o seguinte procedimento:
public
procedure Prepara(Tipo: boolean);
Aqui
function CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean;
end;
var
...
...
procedure TF_Menu.Prepara(Tipo: boolean);
begin
if tipo then
Se o valor da varivel tipo recebida for verdadeiro
begin
Screen.Cursor := crHourGlass;
Faz a primeira parte
if DBDisco.IsSQLbased then
DBDisco.Commit;

100

Borland

Delphi e Delphi Client/Server

end
else
begin
if DBDisco.IsSQLbased then
DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
end;

Desvendando o Caminho das Pedras

Seno
Faz a segunda parte

Modifique agora ambos os procedimentos do objeto F_Basico:


procedure TF_Basico.ButInsCategClick(Sender: TObject);
begin
...
...
F_Menu.Prepara(True);
Aqui
with TF_Categ.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
Aqui
end;
procedure TF_Basico.ButMusicaClick(Sender: TObject);
begin
...
...
F_Menu.Prepara(True);
Aqui
with TF_Musica.Create(Self) do
begin
Inicio;
Free;
end;
TabMusica.Refresh;
F_Menu.Prepara(False);
Aqui
end;

Um segundo procedimento global pode ser criado verificando os eventos AfterPost dos
DataModules Dm_Categ e DM_Basico (este segundo em dois lugares); observamos o mesmo
procedimento:
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;

Criamos ento o seguinte procedimento no formulrio F_Menu:


public
procedure GravaBanco
Aqui
procedure Prepara(Tipo: boolean);
function CriticaEdicao(DSOrigem: TDataSource; DoQue, AntesDe: String) : boolean;
end;
var
...

101

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

...
procedure TF_Menu.GravaBanco;
begin
if DBDisco.IsSQLbased then
Embutiremos os comandos puros aqui
begin
DBDisco.Commit;
DBDisco.StartTransaction;
end;
end;

Agora substitua os eventos nos dos DataModules Dm_Categ e DM_Basico; pela seguinte
chamada ao procedimento
begin
F_Menu.GravaBanco;
end;

Repare tambm que foi retirado das funes que ficaram no formulrio F_Menu as
referncias da base de dados ao formulrio (eram F_Menu.DBDisco e ficou simplesmente
DBDisco).

Alterando o Menu para receber o formulrio


Agora finalmente vamos rodar nosso formulrio, para tanto precisamos cham-lo atravs
do menu principal para isto:
1. Chame novamente o formulrio F_Menu: no menu principal escolha View e Project
Manager, marque o objeto e clique sobre o boto View form.
2. Clique em Arquivo, Cadastro, coloque o seguinte cdigo:
procedure TF_Menu.Cadastro1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
Transforma o cursor em uma ampulheta
F_Basico := TF_ Basico.Create(Application);
Cria o formulrio em memria
F_ Basico.Inicio;
Chama o formulrio atravs da rea aberta
F_ Basico.Free;
Libera a rea aberta
Screen.Cursor := crDefault;
Transforma o cursor em uma seta
end;

3. O objeto F_Basico faz parte da Unit fBasico ento necessrio fazer o uso desta Unit,
para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fSobre, { Janela do Sobre o Sistema ... }
fCateg, { Utilizada para o cadastro de Categorias }
fBasico; { Utilizada para o cadastro de CDs }

No esquea de retirar o formulrio F_Basico da lista de formulrios criados


automaticamente.
4. Saia do Code Editor e salve o formulrio e o projeto.

102

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

5. Podemos agora salvar e testar o formulrio completo, para incluir algumas imagens
utilize o PaintBrush do Windows, ou outro utilitrio qualquer.
6. Se alguma coisa deu errada, releia o captulo, ou ento confira todo o cdigo:
unit fBasico;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, DBGrids, Buttons, Grids, Mask, ExtCtrls;
type
TF_Basico = class(TForm)
ScrollBox: TScrollBox;
Label2: TLabel;
EditNom_Disco: TDBEdit;
Label3: TLabel;
Label4: TLabel;
ImageFot_Capa: TDBImage;
Label5: TLabel;
EditSig_Categ: TDBEdit;
DBNavigator: TDBNavigator;
Panel1: TPanel;
Panel2: TPanel;
Panel4: TPanel;
ButFechar: TBitBtn;
ButLocalizar: TBitBtn;
ButMusica: TBitBtn;
Label1: TLabel;
ComboTIP_DISCO: TDBComboBox;
DBGrid1: TDBGrid;
DBText1: TDBText;
ButLocCateg: TSpeedButton;
ButInsCateg: TSpeedButton;
ButPaste: TSpeedButton;
{ AbreBmp: TOpenDialog; Se voc utilizou o objeto OpenDialog }
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ButLocalizarClick(Sender: TObject);
procedure ButInsCategClick(Sender: TObject);
procedure ButPasteClick(Sender: TObject);
procedure ButMusicaClick(Sender: TObject);
private
{ private declarations }
public
procedure inicio;
end;
var
F_Basico: TF_Basico;
implementation
{$R *.DFM}
uses

103

Borland

Delphi e Delphi Client/Server

DMBasico,
fMenu,
Dialogs,
fCateg,
fMusica;

{ Referncia ao DataModule }
{ Menu Principal do Sistema }
{ Gerente de Mensagens }
{ Cadastro de Categorias }
{ Cadastro de Msicas }

Desvendando o Caminho das Pedras

procedure TF_Basico.Inicio;
begin
DM_Basico := TDM_Basico.Create(Application);
Screen.Cursor := crDefault;
ShowModal;
end;
procedure TF_Basico.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Fechar') then
begin
Action := caNone;
Exit;
end;
Screen.Cursor := crHourGlass;
DM_Basico.Free;
end;
procedure TF_Basico.ButLocalizarClick(Sender: TObject);
var
ObjPesquisa: String;
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Localizar') then
Exit;
ObjPesquisa := DM_Basico.TabBasicoNom_Disco.Value;
if InputQuery('Pesquisa','Entre com o nome do CD (ou parte).', ObjPesquisa) then
DM_Basico.TabBasico.FindNearest([ObjPesquisa]);
end;
procedure TF_Basico.ButInsCategClick(Sender: TObject);
begin
if not (DM_Basico.DSBasico.State in [dsEdit, dsInsert]) then
begin
MessageDlg('Voc no est no modo de edio!',mtInformation,[mbOK],0);
exit;
end;
F_Menu.Prepara(True);
with TF_Categ.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
end;
procedure TF_Basico.ButPasteClick(Sender: TObject);
begin

104

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

ImageFOT_CAPA.PasteFromClipboard;
end;
{ Ou se voc utilizou o objeto OpenDialog
procedure TF_Basico.ButPasteClick(Sender: TObject);
begin
If AbreBmp.Execute then
ImageFot_Amostra.Picture.LoadFromFile( AbreBmp.FileName );
end;
}
procedure TF_Basico.ButMusicaClick(Sender: TObject);
begin
if DM_Basico.DSBasico.State in [dsEdit, dsInsert] then
begin
MessageDlg('Salve a edio do CD antes de Editar as msicas!',mtInformation, [mbOk], 0);
Exit;
end;
F_Menu.Prepara(True);
with TF_Musica.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
end;
end.
Comandos e suas funes, por ordem de apario:
with [registro ou objeto] do [comandos] - Cria um mtodo de referncia para o registro ou objeto.
[tabela].FindNearest - realiza uma pesquisa aproximada na tabela.

105

Captulo VII
Trabalhando com consultas
Todo um projeto pode ir por ralo abaixo caso o usurio no consiga uma maneira eficaz e
eficiente para localizar seus registros perdidos, as consultas as tabelas devem auxiliar o usurio na
tarefa de lembr-lo qual o cdigo correto para determinada categoria, e as consultas aos CDs
devem ser rpidas e prticas, seno, ficaria muito mais prtico e fcil pesquisar manualmente
cada CD tentando encontrar determinada msica do que acessar o computador para realizar tal
tarefa.

Criando consultas para tabelas


O nosso boto de Localizar (objeto butLocalizar) no formulrio F_Categ, no nem
um pouco amigvel com o usurio, ele solicita apenas um cdigo para localizar uma determinada
categoria, mas se o nosso usurio no lembrar deste cdigo? Maneira idntica acontece com o
nosso boto de pesquisa no objeto F_Basico.

Trabalhando com Grids


O objeto DBGrid mostrado no captulo anterior servir perfeitamente para criarmos uma
janela que permita ao usurio uma localizao mais rpida e prtica de um determinado registro,
vamos ao trabalho:

Inicialmente Clique no boto


(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere as seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsDialog

Estilo da borda do formulrio

Caption

Pesquisa Categoria

Label do objeto (Tarja azul do formulrio)

Name

F_SelCate

Nome do objeto

Position

poScreenCenter

Posio da janela (centralizado)

Crie para esta nova janela uma relao com o DataModule DM_Modelo colocando-o na
clusula Uses, abaixo da diretiva de compilao:

{$R *.DFM}
uses
DMModelo; { Referncia ao DataModule }

106

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Crie para esta nova janela os seguintes objetos:


DBNavigator (encontrado na pgina Data Controls), altere as seguintes propriedades:

Propriedade

Valor

Descrio

DataSource

DM_Modelo.DSCategor

DataSource vinculado (caso esta opo no esteja


disponvel abra o DataModule DM_Modelo)

Hints

Um em cada linha: Primeiro,


Anterior, Prximo e ltimo

Tpicos para ajuda on-line do objeto especfico

Left

Posio a esquerda

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

VisibleButtons

[nbFirst, nbPrior, nbNext, nbLast]

Botes visveis

Top

Distncia do topo

Width

113

Largura do objeto

DBGrid (encontrado na pgina Data Controls), altere as seguintes propriedades:


Propriedade

Valor

Descrio

DataSource

DM_Modelo.DSCategor

DataSource vinculado

Font

MS Sans Serif, normal, 8, azul


marinho

Tipo da letra a ser mostrada no contedo do dbGrid

Left

Posio esquerda

Height

145

Altura do objeto

Options

[dgTitles, dgIndicator,
dgColLines, dgRowLines,
dgRowSelect,
dgAlwawsShowSelection]

Opes de execuo para o objeto

TitleFont

MS Sans Serif, negrito, 8,


Castanho

Tipo de letra a ser mostrada no ttulo do dbGrid

Top

48

Distncia do topo

Width

375

Largura do objeto

MaskEdit (encontrado na pgina Additional), altere as seguintes propriedades:


Propriedade

Valor

Descrio

Font

MS Sans Serif, normal, 8, azul marinho

Tipo de letra a ser mostrada no objeto

Left

56

Alinhamento a esquerda

Name

EdtTrecho

Nome do objeto

Text

Contedo do objeto

Width

97

Largura do objeto

Top

199

Distncia do topo

EditMask

>aa;0;_

Cria uma mscara de edio para o campo.

Label (encontrado na pgina Standard), altere as seguintes propriedades:


Propriedade

Valor

Descrio

Caption

Sigla:

Label do objeto

Focus

EdtTrecho

Controle para a posio do cursor

Font

MS Sans Serif, negrito, 8,


Castanho

Tipo de letra a ser mostrada no objeto

Left

Alinhamento a esquerda

Top

201

Distncia do topo

107

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

BitBtn (encontrado na pgina Additional), altere as seguintes propriedades:


Propriedade

Valor

Descrio

Kind

bkOK

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Caption

&OK

Label do objeto

Font

MS Sans Serif, normal, 8, preto

Tipo de letra a ser mostrada no objeto

Height

25

Altura do objeto

Hint

Confirma a pesquisa

Ajuda on-line para o objeto especfico

Left

16

Alinhamento a esquerda

Name

ButOk

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Spacing

30

Espao entre o Glyph e o Label

Top

248

Distncia do topo

Width

89

Largura do objeto

BitBtn (encontrado na pgina Additional), altere as seguintes propriedades:


Propriedade

Valor

Descrio

Kind

bkCancel

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Caption

&Cancela

Label do objeto

Font, Height,
ShowHint, Top e
Width

idntica ao objeto ButOk

Tipo de letra a ser mostrada no objeto, altura do objeto,


Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line, distncia do topo e tamanho
do objeto

Hint

Abandona a pesquisa

Ajuda on-line para o objeto especfico

Left

288

Alinhamento esquerda

Name

ButCancela

Nome do objeto

Spacing

Espao entre o Glyph e o Label

Width

89

Largura do objeto

SpeedButton (encontrado na pgina Additional), altere as seguintes propriedades:


Propriedade

Valor

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\FDRAWER1.BMP

Hint

Pesquisa o cdigo selecionado na


tabela

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Name

ButPesquisa

Nome do objeto

Left e Top

Modo que o objeto fique ao lado


do objeto EdtTrecho

Posio esquerda e distncia do topo

Descrio

Salve o formulrio com o nome fSelCate e compare-o com o desenho abaixo:

108

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Programando no formulrio
O cdigo para este objeto no chega a ser um troo estranho, medonho e esquisito, na
verdade at bem simples, basta apenas compreendermos o seu funcionamento, o objeto DBGrid
far todo o trabalho, mostrando ao usurio os registros cadastrados em uma tabela, a parte que
nos resta e programar o objeto butPesquisa de maneira quase idntica ao nosso antigo boto de
pesquisa:

Cdigo para o boto butPesquisa, responsvel pela ativao da pesquisa:


1. D um duplo clique no objeto:

procedure TF_SelCate.ButPesquisaClick(Sender: TObject);


Inicia o procedimento
begin
if (EdtTrecho.Text = '') then
Verifica se foi digitado algo
begin
MessageDlg('No foi especificado uma sigla!', mtError, [mbOK], 0);
Exit;
Abandona o procedimento
end;
try
Ativa o comando Try
DM_Modelo.TabCategor.FindNearest([EdtTrecho.Text]);
Faz a pesquisa na tabela
except
Caso acontea alguma falha
on exception do
MessageDlg('Sigla especificada est invlida!',mtError, [mbOK], 0);
end;
end;
Termina o procedimento

O comando Try foi utilizado para prevermos qualquer possibilidade de erro durante a
execuo da pesquisa.

109

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Enviando e recebendo variveis


Existem duas maneira de dois formulrios trocarem valores de variveis, ambas atravs
da criao de variveis definidas na seo public, a diferena est ou no na utilizao do
comando property.
No nosso antigo boto Localizar, enviamos para a funo InputQuery o cdigo da
categoria corrente e a funo nos devolve o cdigo digitado, porque no fazermos o mesmo:

Criando uma varivel de escrita e leitura


1. V para o Code Editor, e insira o trecho abaixo:

private
Parte de procedimentos privados
function GetTrecho: String;
Funo para enviar a varivel
procedure SetTrecho(NewTrecho: String);
Procedimento para receber o trecho
public
Parte de procedimentos pblicos
vCria: Boolean;
Cria uma varivel pblica
property CampTrecho: String read GetTrecho write SetTrecho; Inicializa um varivel
end;

O comando Property declara uma varivel da seguinte maneira, a sub-opo Read


envia um string atravs da funo GetTrecho, e a sub-opo Write recebe o valor enviado
atravs da varivel para o procedimento SetTrecho.
2. Declarando o procedimento e a funo:
function TF_SelCate.GetTrecho: String;
Incio da funo
begin
if vCria then
Verifica se o DataModule no existia
begin
Result := DM_Modelo.TabCategorSIG_CATEG.Value; Atribui ao resultado da funo o valor
do campo SIG_CATEG
DM_Modelo.Free;
end;
end;
procedure TF_SelCate.SetTrecho(NewTrecho: String);
begin
if vCria then
begin
DM_Modelo := TDM_Modelo.Create(Application);
DM_Modelo.TabCategor.FindKey([NewTrecho]);
end;
end;

Incio do procedimento
Se o DataModule no estiver criado
Cria o DataModule
Localiza o valor da string enviada

Alterando o formulrio fCateg


Devemos agora mudar o cdigo do formulrio F_Categ para ativarmos a pesquisa,
lembre-se que o DataModule o mesmo e a tabela tambm, ento no existe a necessidade de
enviarmos ou trazermos uma varivel com a sigla da Categoria, porm lembremos do boto de
cancelar, precisamos ento, caso o formulrio no saia atravs do boto de Ok, retornamos ao
registro anterior:

110

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Chame o formulrio F_Categ atravs do objeto Project Manager, clique no objeto


butLocalizar:
1. D um duplo clique no objeto:

procedure TF_Categ.ButLocalizarClick(Sender: TObject);


Aqui permanece o mesmo
var
MarcaReg: TBookmark;
Cria uma varivel de marca
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'localizar' ) then
Exit;
with DM_Modelo.TabCateg do
begin
MarcaReg := GetBookMark;
F_SelCate := TF_SelCate.Create(Application);
F_SelCate.vCria := False;
if not F_SelCate.ShowModal = mrOk then
GotoBookMark(MarcaReg);
F_SelCate.Free;
FreeBookmark(MarcaReg);
end;
end;

Salva a posio do registro


Cria o formulrio de consulta
Seta a varivel pblica
Caso a sada do formulrio no seja o boto OK
Retorna ao registro marcado
Elimina o formulrio de consulta
Libera a varivel de marca

Os comandos de BookMark so todos aplicados a tabela por isso foi utilizado em


conjunto com um comando with para a simplificao do cdigo.

A varivel declarada objPesquisa no mais necessria.


No necessrio criticar o comando FindKey pois o cdigo retornado pela varivel e
pego diretamente do arquivo.

No esquea que o objeto F_SelCate faz parte da Unit fSelCate ento necessrio
fazer o uso desta Unit, para tanto altere o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fMenu,
DMModelo,
Dialogs,
fSelCate;

{ Menu Principal do Sistema }


{ Referencia ao DataModule }
{ Utilizado para o controle da funo MessageDlg }
{ Seleciona Categoria }

Alterando o formulrio fBasico

Vamos finalmente tornar til o objeto butLocCateg (boto para localizar a categoria).
1. Chame o formulrio F_Basico e d um duplo clique no objeto butLocCateg

procedure TF_Basico.ButLocCategClick(Sender: TObject);


begin
if not (DM_Basico.DSBasico.State in [dsEdit, dsInsert]) then
begin
MessageDlg('Voc no est no modo de edio!', mtInformation, [mbOK], 0);
Exit;

111

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

end;
F_SelCate := TF_SelCate.Create(Application);
F_SelCate.vCria := True;
F_SelCate.CampTrecho := EditSIG_CATEG.Text;

Cria o formulrio de consulta


Seta a varivel pblica
Atribui a vriavel declarado o valor do
campo da tela (dispara a funo SetTrecho)

if F_SelCate.ShowModal = mrOk then


EditSIG_CATEG.Text := F_SelCate.CampTrecho;
F_SelCate.Free;
end;

Executa o objeto F_SelCate


dispara o procedimento GetTrecho
Elimina o formulrio de consulta

Note que para esse caso no queremos localizar uma categoria, mas sim atribuir ao
objeto EditCOD_CATEG ao valor do F_SelCate.CampTrecho localizado

No esquea que o objeto F_SelCate faz parte da Unit fSelCate ento necessrio
fazer o uso desta Unit, para tanto altere o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
DMBasico,
fMenu,
Dialogs,
fCateg,
fMusica,
fSelCate;

{ Referncia ao DataModule }
{ Menu Principal do Sistema }
{ Gerente de Mensagens }
{ Cadastro de Categorias }
{ Cadastro de Msicas }
{ Seleciona Categoria }

Salve o formulrio, retire-o da rea de formulrios auto-create, execute e teste o projeto.

Se alguma coisa deu errada, releia o captulo, ou ento confira o cdigo para a
F_SelCate:

unit fSelCate;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Buttons, StdCtrls, Grids, DBGrids;
type
TF_SelCate = class(TForm)
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
EdtTrecho: TMaskEdit;
Label1: TLabel;
ButOK: TBitBtn;
ButCancela: TBitBtn;
ButPesquisa: TSpeedButton;
procedure ButPesquisaClick(Sender: TObject);
private
VeCria : boolean;
function GetTrecho: String;
procedure SetTrecho(NewTrecho: String);
public
property CampTrecho: String read GetTrecho write SetTrecho;

112

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

end;
var
F_SelCate: TF_SelCate;
implementation
{$R *.DFM}
uses
DMCateg; { Referncia ao DataModule }
function TF_SelCate.GetTrecho: String;
begin
if vCria then
begin
Result := DM_Modelo.TabCategorSIG_CATEG.Value;
DM_Modelo.Free;
end;
end;
procedure TF_SelCate.SetTrecho(NewTrecho: String);
begin
if vCria then
begin
DM_Modelo := TDM_Modelo.Create(Application);
DM_Modelo.TabCategor.FindKey([NewTrecho]);
end;
end;
procedure TF_SelCate.ButPesquisaClick(Sender: TObject);
begin
if (EdtTrecho.Text = '') then
begin
MessageDlg('No foi especificado uma sigla!', mtError, [mbOK], 0);
Exit;
end;
try
DM_Modelo.TabCategor.FindNearest([EdtTrecho.Text]);
except
on exception do MessageDlg('Sigla especificada est invlida!',mtError, [mbOK], 0);
end;
end;
end.
Comandos e suas funes, por ordem de apario:
Property [varivel]: [Tipo] read [funo] write [procedimento] - Declara as propriedades para uma varivel do tipo
leitura (read) e do tipo escrita (write).
Result - constante utilizada para o retorno de uma funo.
Try [declaraes] - palavra reservada para marcar a primeira parte de um bloco de exceo.
Except [bloco de exceo] - caso alguma declarao dentro de um bloco de proteo try acontea erro este bloco
executado.

113

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

On [tipo de exceo] do [declarao] - em conjunto com o bloco try...except define o cdigo para executar um bloco
de exceo.

Criando consultas para o cadastro


Acredito que voc deve ter achado estranho o ttulo das consultas do menu (CDs e
Msicas por CDs), como j mencionei antes devemos permitir ao nosso usurio consultas geis
pelos arquivos, seno no valer a pena verificar no computador onde est determinada msica,
seria mais prtico procur-la manualmente.

Consultas SQL
O objeto Query
, utilizado anteriormente para trabalhar como um contador, mais
poderoso do que se imagina, utilizando-o bem nos podemos dar poderes ao nosso usurio que ele
jamais imaginou que fosse possvel, e voc ver que trabalhar com filtros pode-se transformar em
uma agradvel surpresa.

Realizando Consultas com Filtros


Os filtros so realizados para refinar determinados registros dentro de um ou mais
arquivos, mostrarei de forma simples como utiliz-lo, observe o formulrio a seguir:

Vamos criar um formulrio idntico a este que servir para a montagem dos filtros:

Inicialmente Clique no boto


(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere as seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsDialog

Estilo da borda do objeto

Caption

Define Filtros

Label do objeto

114

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Name

F_Filtro

Nome do objeto

Position

poScreenCenter

Posio do objeto

Crie para esta nova janela os seguintes objetos:

1 Parte - montagem do filtro


Panel (encontrado na pgina Standard) - servir para guardar o bloco de montagem do
filtro, ajuste seu tamanho para caber os outros objetos e coloque branco para a
propriedade Caption. Antes de criar os outros objetos sempre marque este objeto.
3 objetos Label (encontrados na pgina Standard) - altere as seguintes propriedades:
Propriedade

Valor

Descrio

Caption

Campo, Critrio e Comparao


(respectivamente)

Nome do objeto

Font

MS Sans Serif, Negrito, 8,


Castanho

Tipo de letra a ser mostrada no objeto

ComboBox (encontrado na pgina Standard) - que armazenar o nome dos campos do


arquivo, altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

CBCampo

Nome do objeto

Font

MS Sans Serif, Normal, 8, Azul


Marinho

Tipo de letra a ser mostrada no objeto

Items

Nome; Tipo e Categoria (um em


cada linha)

Contedo do objeto

Style

csDropDown

Estilo do objeto

Text

Texto a ser mostrado para o Combo quando nada for


selecionado

ComboBox (encontrado na pgina Standard) - que armazenar os critrios de pesquisa,


altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

CBCriterio

Nome do objeto

Font

MS Sans Serif, Normal, 8, Azul


Marinho

Tipo de letra a ser mostrada no objeto

Items

=; >; <; >=; <=; <> e Dentro de

Contedo do objeto (coloque um em cada linha)

Style

csDropDown

Estilo do objeto

Text

Texto a ser mostrado para o Combo quando nada for


selecionado

Edit (encontrado na pgina Standard) - que armazenar o contedo a ser comparado,


altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

EditCompara

Nome do objeto

Font

MS Sans Serif, Normal, 8, Azul


Marinho

Tipo de letra a ser mostrada no objeto

Text

Texto a ser mostrado para o campo

SpeedButton (encontrado na pgina Additional) - boto que confirmar a condio para


o filtro escolhida, altere as seguintes propriedades:
115

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Propriedade

Valor

Descrio

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\COPY.BMP

Hint

Confirma os dados digitados

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Name

ButEnvia

Nome do objeto

SpeedButton (encontrado na pgina Additional) - este boto servir para chamar a tela
de consulta a tabela, ficando originalmente invisvel, sendo ativado caso o campo
escolhido seja a sigla da categoria, altere as seguintes propriedades:
Propriedade

Valor

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto (consulte o cap.6,


ONS\LANTERNA.BMP
criao do objeto ButLocCateg sobre a imagem)

Descrio

Hint

Pesquisa Categoria

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Name

ButConsulta

Nome do objeto

Visible

False

Objeto deve ser mostrado

2 Parte - servir para guardar o filtro montado e esconder o filtro em linguagem pura
SQL, ajuste seu tamanho para caber os outros objetos
GroupBox (encontrado na pgina Standard) - servir para guardar os blocos montados
do filtro, ajuste seu tamanho para caber os outros objetos, altere as seguintes
propriedades:
Propriedade

Valor

Descrio

Caption

Filtro Completo

Label do objeto

Font

MS Sans Serif, Negrito, 8,


Castanho

Tipo de letra a ser mostrada no objeto

Edit (encontrado na pgina Standard) - que mostrar ao usurio o filtro por ele criado,
ele ocupar toda a rea interna do objeto GroupBox, altere as seguintes propriedades:
Propriedade

Valor

Descrio

BorderStyle

bsNone

Estilo da borda

Color

clBtnFalse (mesma cor do objeto


GroupBox)

Cor do objeto

Ctl3D

False

Possui desenho em 3D

Font

MS Sans Serif, Normal, 8,


Castanho

Tipo de letra a ser mostrada no objeto

Name

FiltroVe

Nome do objeto

ReadOnly

True

Objeto apenas para leitura, no permitida alterao do


seu contedo.

Edit (encontrado na pgina Standard)- que montar o nosso filtro em linguagem pura
SQL, ele ficar invisvel em modo de execuo, altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

FiltroSQL

Nome do objeto

Visible

False

Se o objeto ficar visvel

116

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

3 Parte - botes de controle


BitBtn (encontrado na pgina Additional) - boto que servir para clusula E - Tipo: Um
e Outro, ficar inicialmente desabilitado em modo de execuo, altere as seguintes
propriedades:
Propriedade

Valor

Descrio

Name

ButE

Nome do objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\FOLDRDOC.BMP

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Hint

Um e Outro

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Caption

&E

Label do Objeto

Enabled

False

Habilitao para o uso

BitBtn (encontrado na pgina Additional)- boto que servir de Ou - Tipo: Um ou


Outro, ficar inicialmente desabilitado em modo de execuo, altere as seguintes
propriedades:
Propriedade

Valor

Descrio

Name

ButOu

Nome do objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\FONTBOLD.BMP

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Hint

Um ou Outro

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Caption

O&u

Label do Objeto

Enabled

False

Habilitao para o uso

BitBtn (encontrado na pgina Additional) - boto que servir para limpar o filtro, ficar
inicialmente desabilitado em modo de execuo, altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

ButLimpar

Nome do objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\CLEAR.BMP

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Hint

Apaga o filtro existente

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Caption

&Limpar

Label do Objeto

Enabled

False

Habilitao para o uso

BitBtn (encontrado na pgina Additional) - boto que servir para confirmar o filtro, ele
ficar inicialmente desabilitado em modo de execuo, altere as seguintes
propriedades:
Propriedade

Valor

Descrio

117

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Kind

bkOK

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Name

ButOK

Nome do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Hint

Confirma o filtro editado

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Caption

&OK

Label do Objeto

Enabled

False

Habilitao para o uso

BitBtn (encontrado na pgina Additional) - boto que servir para abandonar o filtro,
altere as seguintes propriedades:
Propriedade

Valor

Descrio

Kind

bkCANCEL

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Name

ButCancela

Nome do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Hint

Cancela o filtro editado

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

Caption

&Cancelar

Label do Objeto

Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fFiltro.
O cdigo para este objeto simples requer apenas que voc compreenda que o formulrio
deve fazer. Este formulrio servir de base para a montagem de um filtro que ser mostrado por
um dbGrid construdo no segundo formulrio, devemos devolver o cdigo que completar a
execuo de um objeto Query colocado no segundo. Ex.: SELECT * FROM BASICO WHERE
[condio criada no formulrio] :

Cdigo para o boto butEnvia, quando for confirmado os dados digitados:


1. D um duplo clique no objeto:

procedure TF_Filtro.ButEnviaClick(Sender: TObject);


var
NomeCampo : String;

Cria uma varivel para armazenar o


nome real do campo

begin
case cbCampo.ItemIndex of
0 { Nome }
: NomeCampo:= 'NOM_DISCO';
1 { Tipo }
: NomeCampo:= 'TIP_DISCO';
2 { Categoria } : NomeCampo:= 'SIG_CATEG';
end;
if (cbCriterio.ItemIndex = 6) then
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + 'Like ''%' + EditCompara.Text + '%'')'

118

Seleciona o nome do campo correto


para o SQL

se o Critrio escolhido for Dentro de


comando LIKE em SQL

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + cbCriterio.Text + '''' + EditCompara.Text + ''')';
FiltroVe.Text := FiltroVe.Text + cbCampo.Text + ' ' +
cbCriterio.Text + ' ' + EditCompara.Text;

caso contrrio atribui o valor


escolhido >, < , >=, <= e <>

Acerta o filtro
Reseta os trs campos envolvidos

cbCampo.ItemIndex := -1;
cbCriterio.ItemIndex := -1;
EditCompara.Text := '';

Desabilita os campos de edio

cbCampo.Enabled := False;
cbCriterio.Enabled := False;
EditCompara.Enabled := False;
ButConsulta.Visible := False;

Habilita os botes

ButE.Enabled := True;
ButOu.Enabled := True;
ButOk.Enabled := True;
ButLimpa.Enabled := True;
end;

caso o sistema que voc desenvolver tenha campos do tipo Data altere a linha do
critrio para o seguinte:
if (cbCriterio.ItemIndex = 6) then
Critrio "Dentro de"
if cbCampo.ItemIndex in [nmero do campos data] then
V os campos Data
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
Condio para este tipo de cmp
'Like ''%' +
FormatDateTime('MM/DD/YY',StrToDate(EditCompara.Text))
+ '%'')'
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
Condio comum para o LIKE
'Like ''%' + EditCompara.Text + '%'')'
else
As outras condies
if cbCampo.ItemIndex = in [nmero do campos data] then
V os campos Data
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
cbCriterio.Text + '''' +
FormatDateTime('MM/DD/YY',StrToDate(EditCompara.Text)) + ''')'
else
Condies para outros campos
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
cbCriterio.Text + '''' + EditCompara.Text + ''')';

...o resto ficar idntico. No esquea no comando USES colocar a biblioteca SysUtils
para a funo FormatDateTime

Cdigo para o boto butE, quando ser escolhida e uma outra condio:
1. D um duplo clique no objeto:

procedure TF_Filtro.ButEClick(Sender: TObject);


begin
FiltroVe.Text := FiltroVe.Text + ' E ';
FiltroSQL.Text := FiltroSQL.Text + ' And ';

Altera os filtros
Habilita os campos de edio

cbCampo.Enabled := True;
cbCriterio.Enabled := True;

119

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

EditCompara.Enabled := True;
ButLimpa.Enabled := True;

Desabilita os botes

ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
end;

Cdigo para o boto butOu, quando ser escolhida ou uma outra condio:
1. D um duplo clique no objeto:

procedure TF_Filtro.ButOuClick(Sender: TObject);


begin
FiltroVe.Text := FiltroVe.Text + ' Ou ';
FiltroSQL.Text := FiltroSQL.Text + ' Or ';

Habilita os campos de edio

cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButLimpa.Enabled := True;

Desabilita os botes

ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
end;

Cdigo para o boto butLimpa, quando for limpo os filtros:


1. D um duplo clique no objeto:

procedure TF_Filtro.ButLimpaClick(Sender: TObject);


begin
cbCampo.ItemIndex := -1;
cbCriterio.ItemIndex := -1;
EditCompara.Text := '';
FiltroVe.Text := '';
FiltroSQL.Text := 'Select * from Basico where ';

Inicia todas as condies

Habilita os campos de edio

cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;

Desabilita os botes

ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
ButLimpa.Enabled := False;
end;

Altera os filtros

Quando o formulrio for criado iniciado o filtro:


1. Selecione o objeto F_Filtro na tela de eventos d um duplo click sobre a opo
OnCreate:

procedure TF_Filtro.FormCreate(Sender: TObject);


begin
FiltroVe.Text := '';
FiltroSQL.Text := 'Select * from BASICO where ';
end;

120

Limpa o filtro visvel


Inicia o filtro escondido

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Caso o campo escolhido seja Sigla da Categoria necessrio habilitar o boto de


consulta:
1. Selecione o objeto CBCampo na tela de eventos d um duplo clique na opo
OnChange:

procedure TF_Filtro.CBCampoChange(Sender: TObject);


begin
CBCriterio.SetFocus;
if cbCampo.ItemIndex = 2 then
ButConsulta.Visible := True
else
ButConsulta.Visible := False;
end;

Desvia o foco para o prximo campo


Se o campo seleciona for SIG_CATEG
Torna visvel o objeto ButConsulta
Seno
Torna invisvel o objeto ButConsulta

Cdigo para o objeto ButConsulta que far a consulta de categoria:


1. D um duplo clique no objeto:

procedure TF_Filtro.ButConsultaClick(Sender: TObject);


begin
if cbCampo.ItemIndex = 2 then
Se o campo for SIG_CATEG
begin
F_SelCate.CampTrecho := EditCompara.Text;
Envia o campo
if F_SelCate.Inicio = mrOk then
Verifica se foi retornado OK
EditCompara.Text := F_SelCate.CampTrecho; Transfere o campo
end;
end;

Perfumaria para o objeto CBCriterio quando selecionado um critrio ser o controle


transferido para o campo seguinte:
1. Selecione o objeto na tela de eventos e d um duplo clique na opo OnChange:

procedure TF_Filtro.CBCriterioChange(Sender: TObject);


begin
EditCompara.SetFocus;
Desvia o foco para o prximo campo
end;

Necessitamos agora criar uma varivel comum que devolver o cdigo SQL para a tela
secundria:

Transfira para a janela do Code Editor:


1. Aps o comando PRIVATE digite:

private
function GetSQL: TEdit;
public
property SQLString : TEdit read GetSQL;
end;

Inicia uma funo Particular


Inicia uma varivel pblica s de leitura

var
F_Filtro: TF_Filtro;
implementation
{$R *.DFM}
uses
fSelCate;

Utilizao das bibliotecas


Seleciona Categoria

121

Borland

Delphi e Delphi Client/Server

function TF_Filtro.GetSQL: TEdit;


begin
Result := FiltroSQL;
end;

Desvendando o Caminho das Pedras

Envia como resultado para a varivel o filtro escondido

Salve o formulrio, teste o projeto.

Se alguma coisa deu errada, releia o captulo, ou ento confira o cdigo para a F_Filtro:

unit Ffiltro;
interface
uses WinTypes, WinProcs, Classes, Graphics, Forms,
Controls, Buttons, StdCtrls, ExtCtrls;
type
TF_Filtro = class(TForm)
Panel1: TPanel;
CBCampo: TComboBox;
CBCriterio: TComboBox;
EditCompara: TEdit;
ButEnvia: TSpeedButton;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ButCancela: TBitBtn;
ButE: TBitBtn;
ButOu: TBitBtn;
Label4: TLabel;
FiltroVe: TEdit;
FiltroSQL: TEdit;
ButOk: TBitBtn;
ButLimpa: TBitBtn;
ButConsulta: TSpeedButton;
procedure ButEnviaClick(Sender: TObject);
procedure ButEClick(Sender: TObject);
procedure ButOuClick(Sender: TObject);
procedure ButLimpaClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CBCampoChange(Sender: TObject);
procedure ButConsultaClick(Sender: TObject);
procedure CBCriterioChange(Sender: TObject);
private
function GetSQL: TEdit;
public
property SQLString : TEdit read GetSQL;
end;
var
F_Filtro: TF_Filtro;
implementation

122

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{$R *.DFM}
uses
fSelCate;
function TF_Filtro.GetSQL: TEdit;
begin
Result := FiltroSQL;
end;
procedure TF_Filtro.ButEnviaClick(Sender: TObject);
var
NomeCampo : String;
begin
case cbCampo.ItemIndex of
0 { Nome }
: NomeCampo:= 'NOM_DISCO';
1 { Tipo }
: NomeCampo:= 'TIP_DISCO';
2 { Categoria } : NomeCampo:= 'SIG_CATEG';
end;
if (cbCriterio.ItemIndex = 6) then
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + 'Like ''%' + EditCompara.Text + '%'')'
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + cbCriterio.Text + '''' + EditCompara.Text + ''')';
FiltroVe.Text := FiltroVe.Text + cbCampo.Text + ' ' +
cbCriterio.Text + ' ' + EditCompara.Text;
cbCampo.ItemIndex := -1;
cbCriterio.ItemIndex := -1;
EditCompara.Text := '';
cbCampo.Enabled := False;
cbCriterio.Enabled := False;
EditCompara.Enabled := False;
ButConsulta.Visible := False;
ButE.Enabled := True;
ButOu.Enabled := True;
ButOk.Enabled := True;
ButLimpa.Enabled := True;
end;
procedure TF_Filtro.ButEClick(Sender: TObject);
begin
FiltroVe.Text := FiltroVe.Text + ' E ';
FiltroSQL.Text := FiltroSQL.Text + ' And ';
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButLimpa.Enabled := True;
ButE.Enabled := False;

123

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

ButOu.Enabled := False;
ButOk.Enabled := False;
end;
procedure TF_Filtro.ButOuClick(Sender: TObject);
begin
FiltroVe.Text := FiltroVe.Text + ' Ou ';
FiltroSQL.Text := FiltroSQL.Text + ' Or ';
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButLimpa.Enabled := True;
ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
end;
procedure TF_Filtro.ButLimpaClick(Sender: TObject);
begin
cbCampo.ItemIndex := -1;
cbCriterio.ItemIndex := -1;
EditCompara.Text := '';
FiltroVe.Text := '';
FiltroSQL.Text := 'Select * from BASICO where ';
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
ButLimpa.Enabled := False;
end;
procedure TF_Filtro.FormCreate(Sender: TObject);
begin
FiltroVe.Text := '';
FiltroSQL.Text := 'Select * from Basico where ';
end;
procedure TF_Filtro.CBCampoChange(Sender: TObject);
begin
CBCriterio.SetFocus;
if cbCampo.ItemIndex = 2 then
ButConsulta.Visible := True
else
ButConsulta.Visible := False;
end;
procedure TF_Filtro.ButConsultaClick(Sender: TObject);
begin
if cbCampo.ItemIndex = 2 then
begin

124

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

F_SelCate.CampTrecho := EditCompara.Text;
if F_SelCate.Inicio = mrOk then
EditCompara.Text := F_SelCate.CampTrecho;
end;
end;
procedure TF_Filtro.CBCriterioChange(Sender: TObject);
begin
EditCompara.SetFocus;
end;
end.

No foi colocado nenhum comando que j no tenha sido visto anteriormente


Criando o formulrio Gerente do Filtro
Criado o formulrio anterior, a idia agora a seguinte, criaremos um outro formulrio
que conter um objeto dbGrid para mostrar todos os campos de determinada tabela, quando for
clicado o boto filtrar, ser disparado o formulrio anterior, ao retornar o usurio poder
ativar/desativar o filtro atravs do SpeedButton (cadeado), ou ainda ser possvel editar um
registro selecionado :

Vamos criar um formulrio idntico a este que servir para o gerenciamento do filtro:

Inicialmente Clique no boto


(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere as seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsDialog

Estilo da borda do objeto

Caption

Consulta aos Discos

Label do objeto

Name

F_ConDisc

Nome do objeto

125

Borland
Position

Delphi e Delphi Client/Server

poScreenCenter

Desvendando o Caminho das Pedras

Posio do objeto

Crie para esta nova janela os seguintes objetos:


Table (encontrado na pgina Data Access) - Tabela que se alternar com a query, altere
as seguintes propriedades:

Propriedade

Valor

Descrio

DatabaseName

AliasDisco

Nome do Alias ou a localizao do diretrio das


tabelas

TableName

BASICO.DBF

Nome externo da tabela

Name

TabBasico

Nome do objeto

IndexFieldNames NOM_DISCO

Nome do campo indexado

DataSource (encontrado na pgina Data Access) - Posicione-o ao lado do objeto


TabBasico. , altere as seguintes propriedades:
Propriedade

Valor

Descrio

DataSet

TabBasico

Nome da tabela vinculada

Name

DSBasico

Nome do objeto

Query (encontrado na pgina Data Access) - Query que se alternar com a tabela, altere
as seguintes propriedades:
Propriedade

Valor

Descrio

DatabaseName

AliasDisco

Nome do Alias ou a localizao do diretrio das


tabelas

SQL

SELECT * FROM BASICO

Comando SQL para consulta

Name

QryBasico

Nome do objeto

DBNavigator (encontrado na pgina Data Controls) - Barra de navegao que servir


para andar sobre os registro, lembre-se no deve ser permitida manuteno nos
mesmos:
Propriedade

Valor

Descrio

DataSource

DSBasico

DataSource associado

VisibleButtons

[nbFirst, nbPrior, nbNext, nbLast]

Botes visveis

Hints

Primeiro; Anterior; Prximo;


ltimo

Ajuda on-line que ser mostrado sobre cada boto


(coloque um em cada linha)

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

SpeedButton (encontrado na pgina Additional) - boto que servir para ativar ou


desativar o filtro, altere as seguintes propriedades:
Propriedade

Valor

Descrio

Name

ButAtivaDesativa

Nome do objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\LOCKOPEN.BMP

Hint

Ativa/Desativa o filtro

Ajuda on-line para o objeto especfico

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

GroupIndex

Pertence a um grupo de botes, esta propriedade faz


com que o boto permanea em estado de
pressionamento.

126

Borland
AllowAllUp

Delphi e Delphi Client/Server

True

Desvendando o Caminho das Pedras

Permite que um grupo de botes no tenha nenhum


boto em estado de pressionamento.

BitBtn (encontrado na pgina Additional) - boto que servir para montagem do filtro,
altere as seguintes propriedades:
Propriedade

Valor

Descrio

Caption

Fil&trar

Label do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\FIND.BMP

Hint

Montagem do Filtro

Ajuda on-line para o objeto especfico

Name

ButFiltrar

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

BitBtn (encontrado na pgina Additional) - boto que servir para editar o campo
selecionado no grid, altere as seguintes propriedades:
Propriedade

Valor

Descrio

Caption

&Editar

Label do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Glyph

[DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto


ONS\FOLDRDOC.BMP

Hint

Edita campo selecionado

Ajuda on-line para o objeto especfico

Name

ButEditar

Nome do objeto

ShowHint

True

Mostrar o contedo da propriedade hint sob a forma de


uma caixa de ajuda on-line

BitBtn (encontrado na pgina Additional) - boto que servir para editar o filtro, altere as
seguintes propriedades:
Propriedade

Valor

Descrio

Kind

bkClose

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Name

ButFechar

Nome do objeto

Font

MS Sans Serif, Normal, 8, Preto

Tipo de letra a ser mostrada no objeto

Caption

&Fechar

Label do Objeto

dbGrid (encontrado na pgina Data Controls) - Objeto Grid que mostrar os campos,
altere as seguintes propriedades:
Propriedade

Valor

Descrio

DataSource

DSDocum

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Name

dbGridBasico

Nome do objeto

Font

MS Sans Serif, Normal, 8, Azul


Marinho

Tipo de letra a ser mostrada para os campos

Options

dgTitles, dgIndicator, dgColLines,


dgRowLines, dgRowSelect

Opes do Grid

TitleFont

MS Sans Serif, Negrito, 8,


Castanho

Tipo de letra a ser mostrada para o ttulo dos campos

127

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fConDisc.
Este formulrio mostrar os dados filtrados no objeto dbGrid, para filtrar os dados
utilizaremos o objeto Query, tudo o que temos a fazer controlar quando o filtro est ativo
(objeto DataSource aponta para o objeto Query) ou quando o filtro no est ativo (objeto
DataSource aponta para o objeto tTable)

Cdigo para quando o formulrio iniciado, abertura das tabelas:


1. Vire para o CodeEditor e insira o seguinte cdigo abaixo:

private
{ Private declarations }
public
procedure Inicio;
end;

Declara um procedimento pblico

var
F_ConDisc: TF_ConDisc;
implementation
{$R *.DFM}
uses
fFiltro,
fEdtDisc;

Utiliza a Unit para a montagem do filtro


Utiliza a Unit para a edio do registro

procedure TF_ConDisc.Inicio;
begin
TabBasico.Open;
ShowModal;
end;

Inicia a tabela
Mostra o formulrio em modo modal

Cdigo para o boto Filtrar, quando for solicitada a edio do filtro.


1. D um duplo clique no objeto butFiltrar:

procedure TF_ConDisc.ButFiltrarClick(Sender: TObject);


begin
if ButAtivaDesativa.Down then
Verifica se o boto de prender o filtro
begin
est pressionado.
MessageDlg('Desative a filtragem antes de editar os filtros...',
mtInformation, [mbOK], 0);
exit;
end;

Chama o filtro e se for retornado OK

if F_Filtro.ShowModal = mrOk then


begin
QryBasico.SQL.Clear;
QryBasico.SQL.Add(F_Filtro.SQLString.Text);
end;
end;

Limpa a Query
Adiciona o novo filtro na Query

Cdigo para o boto Editar, quando for marcado um registro para visualizao geral.

128

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

1. D um duplo clique no objeto butEditar:


procedure TF_ConDisc.ButEditarClick(Sender: TObject);
begin
if ButAtivaDesativa.Down then
F_EdtDisc.Inicio(QryBasicoCOD_DISCO.Value)
else
F_EdtDisc.Inicio(TabBasicoCOD_DISCO.Value);
end;

Verifica se existe filtro preso


Chama a edio atravs da Query
Chama a edio atravs da tTable

Cdigo para o boto Ativa ou Desativa o filtro, para prender ou liberar o filtro.
1. D um duplo clique no objeto butAtivaDesativa:

procedure TF_ConDisc.ButAtivaDesativaClick(Sender: TObject);


begin
if not ButAtivaDesativa.Down then
Se o filtro no estiver ativo
DSBasico.Dataset := TabBasico
Coloca o DataSource apontado para o tTable
else
try
Clusula para um bloco de exceo
QryBasico.Close;
Desativa a Query
QryBasico.Open;
Ativa a Query
DSBasico.Dataset := QryBasico;
Coloca o DataSource apontado para a Query
except
Caso de alguma coisa errada com o filtro
DSBasico.Dataset := TabBasico;
Coloca o DataSource apontado para o tTable
raise;
Complemento do comando Try...except...raise
end;
end;

Salve o formulrio.

Com certeza ser mostrado um erro para a chamada da unit F_EdtDisc.

Editando os registros
O formulrio que editar os registro no ser montado passo a passo, pois muito
simples de ser construdo, ao invs disto darei apenas algumas dicas a respeito da criao do
mesmo:
1. Copie o formulrio F_Basico, renomeando-o para F_EdtDisc;
2. Remova os objetos dbNavigator, Query e as tabelas tabCategConf e tabBasicoConf,
das tabelas restante, entre no FieldsEditor de cada uma e remova os campos;
3. Retire todo o cdigo e proteja as tabelas com a opo ReadOnly = True;
4. Retire todos os botes, deixando apenas o boto para Fechar o formulrio;
5. Insira os seguintes procedimentos:
a. Procedure INICIO, nas declaraes public ( procedure Inicio(var CodDisco: Integer); )
procedure TF_EdtDisc.Inicio(var CodDisco: Integer);
begin
TabBasico.Open;
Abre as tabelas
TabMusica.Open;
TabCateg.Open;
TabBasico.FindKey(CodDisco);
Posiciona a tabela Basico no CodDisco enviado

129

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

ShowModal;
end;
b. Procedure FormClose, no evento OnClose do objeto F_EdtDisc
procedure TF_EdtDisc.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TabBasico.Close;
Fecha as tabelas
TabMusica.Close;
TabCateg.Close;
end;

6. Salve e compile o formulrio com o nome fEdtDisc.

Agora sim, voc pode compilar o projeto e rodar o projeto, para uma conferncia final a
vai o cdigo completo do formulrio F_ConDisc.

unit Fcondisc;
interface
uses
WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, Buttons,
ExtCtrls, DBCtrls;
type
TF_ConDisc = class(TForm)
DBGrid1: TDBGrid;
DSBasico: TDataSource;
ButFiltrar: TBitBtn;
ButFechar: TBitBtn;
QryBasico: TQuery;
DBNavigator1: TDBNavigator;
TabBasico: TTable;
ButEditar: TBitBtn;
ButAtivaDesativa: TSpeedButton;
TabBasicoCOD_DISCO: TSmallintField;
TabBasicoNOM_DISCO: TStringField;
TabBasicoTIP_DISCO: TStringField;
TabBasicoCOD_CATEG: TStringField;
QryBasicoCOD_DISCO: TSmallintField;
QryBasicoNOM_DISCO: TStringField;
QryBasicoTIP_DISCO: TStringField;
QryBasicoCOD_CATEG: TStringField;
procedure ButFiltrarClick(Sender: TObject);
procedure ButEditarClick(Sender: TObject);
procedure ButAtivaDesativaClick(Sender: TObject);
private
{ Private declarations }
public
procedure Inicio;
end;
var

130

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

F_ConDisc: TF_ConDisc;
implementation
{$R *.DFM}
uses
fFiltro,
{ Chama a montagem do Filtro }
fEdtDisc; { Edita o Disco }
procedure TF_ConDisc.Inicio;
begin
TabBasico.Open;
ShowModal;
end;
procedure TF_ConDisc.ButFiltrarClick(Sender: TObject);
begin
if ButAtivaDesativa.Down then
begin
MessageDlg('Desative a filtragem antes de editar os filtros...', mtInformation, [mbOK], 0);
exit;
end;
if F_Filtro.ShowModal = mrOk then
begin
QryBasico.SQL.Clear;
QryBasico.SQL.Add(F_Filtro.SQLString.Text);
end;
end;
procedure TF_ConDisc.ButEditarClick(Sender: TObject);
begin
if ButAtivaDesativa.Down then
F_EdtDisc.Inicio(QryBasicoCOD_DISCO.Value)
else
F_EdtDisc.Inicio(TabBasicoCOD_DISCO.Value);
end;
procedure TF_ConDisc.ButAtivaDesativaClick(Sender: TObject);
begin
if not ButAtivaDesativa.Down then
DSBasico.Dataset := TabBasico
else
try
QryBasico.Close;
QryBasico.Open;
DSBasico.Dataset := QryBasico;
except
DSBasico.Dataset := TabBasico;
raise;
end;
end;
end.

131

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Captulo VIII
Relatrios
A parte impressa do Delphi fica a critrio de trs mtodos: utilizar a ferramenta
ReportSmith, com a unit Printer ou com a utilizao da ferramenta QuickReport (disponvel
no Delphi 1.0 a partir de compra de terceiro, mas disponvel gratuitamente com o Delphi 2.0). O
Delphi oferece um gerador de relatrios bastante poderoso, chamado ReportSmith. Com este
utilitrio, voc pode criar relatrios associados aos diversos bancos que o Delphi se comunica.

Trabalhando com o ReportSmith


O ReportSmith possui alguns relatrios padres, tais como relatrios colunados
(mostra os dados em formas de colunas), referncia cruzada entre tabelas (mostra os dados
tipos uma planilha, associando duas ou mais tabelas), etiquetas (gera etiquetas em formatos
padro), relatrios em modo de pgina (mostra os registros de uma determinada tabela um por
pgina).
Atravs do ReportSmith, e possvel gerar relatrios com as seguintes caractersticas:

Combinao de dados entre vrias tabelas;

Ordem e grupo livre de dados atravs de determinados campos;

Insero de cabealhos e rodaps;

Funes de soma, mdia, mximo e mnimo;

Criao de caixas de dilogo para insero de informaes, filtragem dos dados;

Criao de relatrios do tipo master/details;

Execuo de macros durante o relatrio; e

Acesso as mais variadas bases de dados, entre elas:

Bases de Dados que o ReportSmith permite acesso


Access

Informix

SQLBase

Btrieve

InterBase

Sybase

DB2

ORACLE

Teradata

dBase

Paradox

Arquivo .TXT

Excel

Raima

Unify

FoxPro

AS/400

Watcom SQL

INGRES

SQL Server

qualquer base com driver ODBC

132

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

O ReportSmith um produto separado do Delphi, mas ao comprar o Delphi, voc


adquiriu automaticamente a licena para usar o ReportSmith bem como a distribuio livre do
seu Run-Time.

Criando relatrio com o ReportSmith


Inicie o ReportSmith atravs do cone
, ou da opo do menu principal do Delphi,
Tools | ReportSmith, dependendo da configurao da seo Options, ser mostrada a tela para o
incio de um novo relatrio.
Cancele quaisquer opo que aparea e ative no menu principal File | Connections...,
lembra-se do Alias pois aqui precisamos criar uma conexo para a nossa base de dados, pressione
o boto New e informe Name: DiscoAPP, Type: DBASE(IDAPI) e Data File Path:
C:\SISTEMA\CADDISCO, pressione o boto Save e OK.
No menu principal opo File | New..., escolha a opo Columnar Report, clique no
boto Style e escolha o estilo do relatrio que mais lhe agrade e caso voc deseje pode marcar o
estilo escolhido como default atravs da opo Use As Default clique no boto OK, e clique no
boto OK e a seguinte tela ser mostrada:

Tables - Adiciona, remove ou altera tabelas ou cria links entre elas.


Selections - Cria, edita e exclui critrios de seleo.
Sorting - Adiciona, remove ou reordena dados a serem organizados.

133

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Derived fields - Cria e organiza dados calculados para outras colunas do relatrio, baseado em comandos SQL ou na
linguagem de macro ReportBasic.
Report variables - Cria, edita ou exclui variveis do relatrio. Estas variveis podem ser criadas para atender a
critrios da clusula Selections servindo de comunio entre o ReportSmith e o Delphi.
Database grouping - Grupos de dados e critrios de seleo.
SQL - Permite a edio de declarao SQL para o relatrio corrente.

1. Pressione o boto Tables.


2. Na caixa de dilogo Tables, pressione o boto Add table...
3. No combo Connections: selecione a conexo DiscoAPP e selecione a tabela
Basico.DB e pressione o boto OK, repita a operao para tabela Categor.DB,
confirme e retorne a tela anterior.
4. Pressione o boto Add new link...
5. O relacionamento entre Basico e Categor atravs do campo SIG_CATEG, marque
a opo Include unmatched records (inclua os registros no correspondentes) do
lado de BASICOxDB, confirme e retorne a tela anterior.
6. Selecione a tabela BASICOxDB e pressione o boto Table columns...
7. Selecione o campo FOT_CAPA e marque a opo Exclude from report (retire do
relatrio), confirme e retorne a tela anterior.
8. Pressione o boto Report variables e crie as variveis: CodInicial e CodFinal
ambas com a opo Type igual a Number e a opo Entry igual a Type-in.
9. Pressione o boto Selections e clique no boto amarelo marcado com 1. e escolha a
opo Add selection criteria e marque o seguinte critrio: data field
BASICOxDB.COD_DISCO is between report variable CodInicial and report
variable CodFinal.
10. Clique no boto Sorting, marque o campo COD_DISCO e clique no boto Insert
into sort list (insira para a lista de ordenao).
11. Clique no boto SQL e compare a declarao criada:
SELECT
'BASICOxDB'.'COD_DISCO', 'BASICOxDB'.'NOM_DISCO', 'BASICOxDB'.'TIP_DISCO',
'BASICOxDB'.SIG_CATEG', 'CATEGORxDB'.'SIG_CATEG', 'CATEGORxDB'.'DES_CATEG'
FROM
'C:\SISTEMA\CADDISCO\BASICO.DB' BASICOxDB LEFT JOIN
'C:\SISTEMA\CADDISCO\CATEGOR.DB' CATEGORxDB ON ('BASICOxDB'.'SIG_CATEG' =
'CATEGORxDB'.'SIG_CATEG' )
WHERE
((('BASICOxDB'.'COD_DISCO' BETWEEN <<CodInicial>> AND <<CodFinal>>)))
ORDER BY
'BASICOxDB'.'COD_DISCO'

12. Confirme o relatrio pressionando o boto Done. Informe os dados iniciais e finais e
aguarde a gerao do relatrio.

134

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Organizando os campos do relatrio


Acredito que a esta altura voc tem um belo incio de relatrio nas mos, agora teremos
que alterar alguns campos que no ficaram direito:
1. Selecione os campos SIG_CATEG (tanto o ttulo quanto o detalhe) e pressione DEL.
2. Selecione o detalhe do campo NOM_DISCO e pressione o boto direito do mouse,
selecione a opo Field Height e marque a opo Can Grow (redimensione a
varivel conforme o tamanho) e Can Shrink (corte os caracteres no imprimveis).
3. Troque os ttulos de cada campo para: Cdigo, Nome, Tipo e Categoria. (basta clicar
duas vezes sobre cada ttulo).
4. Troque o ttulo do relatrio para: Cadastro de CDs.
5. No menu selecione a opo Insert | Field..., selecione System Fields, e selecione o
campo Print Date/Time, pressione o boto Insert e clique em qualquer posio da
seo Header.
6. Compare agora o relatrio gerado:

Salve o relatrio gerado com o nome de RCADAST.RPT

Associando o relatrio ao aplicativo


A parte difcil j foi realizada agora resta chamar o relatrio atravs do nosso menu
principal.
Chame o formulrio fmenu e insira o objeto Report
, encontrado na Component
Palette pgina Dialogs, este objeto realiza o trabalho de configurao da impressora.
1. Clique na opo Configura Impressora chamando o evento onClick;
2. Insira o comando
procedure TFMenu.ConfiuraImpressora1Click(Sender: TObject);
begin
PrinterSetupDialog1.Execute;
end;

135

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Criaremos agora uma janela simples de dilogo, onde selecionaremos um cdigo inicial e
final para os cdigos do CD.

Inicialmente Clique no boto


(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere as seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsDialog

Estilo da borda do objeto

Caption

Imprime Cadastro Geral

Label do objeto

Name

F_DgGeral

Nome do objeto

Position

poScreenCenter

Posio do objeto

Crie para esta nova janela os seguintes objetos:


Label (Localizado na pgina Standard) - crie trs objetos labels:

Propriedade

Valor

Descrio

Caption

[1]. Informe o Cdigo dos CDs a


imprimir; [2]. Inicial: e [3]. Final:

Label do objeto

Font

[1]. MS Sans Serif, Negrito, 8, Azul


Marinho e [2,3]. MS Sans Serif,
Negrito, 8, Castanho

Tipo de letra a ser mostrada no objeto

BitBtn (Localizado na pgina Additional) - crie dois botes para confirmar ou cancelar a
emisso do relatrio:
Propriedade

Valor

Descrio

Kind

bkOk e bkCancel

Determina a classe a ser utilizada pelo objeto,


automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult

Caption

&OK e &Cancelar

Label do objeto

Edit (Localizado na pgina Standard) - dois objetos de edio para insero do cdigo
inicial e final:
Propriedade

Valor

Text
Font

Descrio
Texto a ser apresentado inicialmente para o objeto

MS Sans Serif, Normal, 8, Azul


Marinho

Tipo de letra a ser mostrada no objeto

Compare com o formulrio abaixo:

136

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fDgGeral.
Para selecionarmos os cdigos inicial e final, precisamos fazer uma pequena
programao no formulrio:

Cdigo para criar os dois campos que enviaro os cdigos (lembra-se do captulo VII Referente a Consultas):
1. Alterne para o CodeEditor e insira o seguinte cdigo abaixo:

private
function GetCodInicial: String;
function GetCodFinal: String;
public
property CampInicial: String read GetCodInicial;
property CampFinal: String read GetCodFinal;
end;

Inicializa as funes
Cria tipo caractere as variveis,
apenas como sada

var
F_DgGeral: TF_DgGeral;
implementation
{$R *.DFM}
function TF_ DgGeral.GetCodInicial: String;
begin
Result := Edit1.Text;
end;

Envia como resultado o contedo do

function TF_ DgGeral.GetCodFinal: String;


begin
Result := Edit2.Text;
end;

Envia como resultado o contedo do

objeto Edit1

objeto Edit2

Por incrvel que parea isto tudo, agora chame o objeto fMenu, insira o objeto Report
, encontrado na Component Palette pgina Data Access, este objeto realiza o trabalho de
configurao da impresso.
1. Clique na opo Relatrio | Geral chamando o evento onClick;

137

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

2. Insira o comando
procedure TF_Menu.Geral1Click(Sender: TObject);
begin
if F_DgGeral.ShowModal = mrOK then
Chama e verifica se a DgGeral retornou OK
with Report1 do
Para o objeto Report1...
begin
ReportName := 'RCADAST.RPT';
Altera a propriedade Nome do Relatrio
InitialValues.Clear;
Elimina os valores iniciais
InitialValues.Add('@CodInicial=<'+F_DgGeral.CampInicial+'>'); Seta o valor CodInicial do
relatrio com o valor do CampInicial do formulrio fDgGeral
InitialValues.Add('@CodFinal=<'+F_DgGeral.CampFinal+'>'); Seta o valor CodFinal do
relatrio com o valor do CampFinal do formulrio fDgGeral
Run;
Inicia o relatrio
end;
end;

Salve e execute o sistema, informe trechos diferentes para o relatrio.

Caso voc queira que o ReportSmith no execute imediatamente o relatrio mostrando


antes uma prvia na tela modifique a propriedade do objeto Report1 - Preview para True.

Voc descobrir que o ReportSmith uma poderosa e simples ferramenta para a


concepo de relatrios, o nico problema seria com relatrios que se precise imprimir uma nica
ou poucas folhas, como um recibo ou um formulrio pr-impresso, voc descobrir que ele
lento para estas tarefas, existem duas solues para este caso usar a biblioteca Printers ou usar a
impresso livre do formulrio como veremos a seguir.

Imprimindo atravs do Formulrio


Para o nosso prximo relatrio, precisamos apenas imprimir a capa de um CD, se voc
relembra a foto foi armazenada em um campo do tipo BLOB chamado FOT_CAPA, no arquivo
BASICO.
A idia simples, construir um formulrio em branco, sem borda, este ser chamado
atravs do menu principal e solicitado a informao do cdigo do CD a imprimir, neste
formulrio ter os objetos de acesso a Tabela (Table e DataSource) associado ao objeto DBImage
, encontrado na Component Palette na pgina Data Controls, conforme a figura abaixo:

138

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Inicialmente Clique no boto


(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere as seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsNone

Estilo da borda do formulrio

Caption

Label do objeto (Tarja azul do formulrio)

Name

F_Capa

Nome do objeto

Position

poScreenCenter

Posio da janela (centralizado)

BorderIcons

[]

Elimine todos os botes da janela

Color

clWhite

Cor de fundo

Crie para esta nova janela os seguintes objetos:


Table (Localizado na pgina Data Access) , altere as seguintes propriedades:

Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Alias ou a localizao do diretrio das


tabelas

TableName

BASICO.DB

Nome externo da tabela

IndexFieldNames

COD_DISCO

Nome do campo indexado

Name

TabBasico

Nome do objeto

ReadOnly

True

Somente para leitura

DataSource (Localizado na pgina Data Access) , altere as seguintes propriedades:


Propriedade

Valor

Descrio

DataSet

TabBasico

Nome da tabela vinculada

Name

DSBasico

Nome do objeto

dbImage (Localizado na pgina Data Controls) , altere as seguintes propriedades:


Propriedade

Valor

Descrio

DataSource

DSBasico

Nome do DataSource vinculado

DataField

FOT_CAPA

Nome do campo na tabela

Height

457

Largura

139

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Strech

True

Se o tamanho da imagem deve acompanhar o tamanho


do objeto

Width

481

Altura do objeto

O tamanho da imagem foi colocada em 457 x 481 pois em impressoras padro Epson
este, aps impresso, o tamanho da capa do CD. necessrio que voc faa os ajustes
necessrios para se adaptar ao padro de sua impressora.

Cresa o tamanho do formulrio em conjunto ao tamanho do objeto imagem.


Salve o formulrio com o nome de fCapa.

Criando o Cdigo
O cdigo para este formulrio e sua chamada a partir do menu principal bem mais
simples que o realizado anteriormente, verifique:

Para o menu principal

Cdigo para criar a chamada:


1. Chame o formulrio fMenu, e clique na opo Capa do CD :

procedure TF_Menu.CapadoCD1Click(Sender: TObject);


var
NumCD: String;
begin
NumCD := InputBox('Informe', 'Entre com o cdigo do CD para imprimir:', '');
if NumCD = '' then
begin
MessageDlg('No foi informado um cdigo para a impresso', mtInformation, [mbOk], 0);
exit;
end;
F_Capa.Inicio(NumCD);
end;

O cdigo para este evento bem simples: cria uma varivel caracter e solicita a
entrada de seu valor atravs da funo InputBox, caso no seja retornado nenhum valor cancela a
impresso ao contrrio chama o procedimento inicio do formulrio F_Capa enviando o valor
informado.

No se esquea de colocar a unidade fCapa no comando Uses.

Para o formulrio F_Capa

Cdigo para solicitar e permitir a impresso:


1. Chame o formulrio F_Capa, e alterne para o modo do Code Editor :

procedure TF_Capa.Inicio(Numero: String);


begin
TabBasico.Open;
if not TabBasico.FindKey([StrToFloat(Numero)]) then
MessageDlg('Cdigo do CD inexistente !', mtError, [mbOk], 0)

140

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

else
begin
Show;
if MessageDlg('Confirma a impresso da Capa ?', mtConfirmation,
mbOkCancel, 0) = mrOk then
F_Capa.Print;
end;
TabBasico.Close;
Close;
end;

O cdigo para este evento novamente bem simples: abre a tabela e pesquisa a
existncia do cdigo enviado, caso encontre mostra a capa do CD e solicita a confirmao do
relatrio, e imprime ao final fecha a tabela e o formulrio.

No se esquea de declarar o procedimento nas declaraes Public. (procedure


Inicio(Numero: String);)

Trabalhando com o QuickReport


O QuickReport um produto fornecido pela QSD (Quick Soft Development) em verso
Freeware para o Delphi 2.0 e verso Shareware para o Delphi 1.0, pode-se dizer que o primeiro
gerador de relatrios totalmente orientado a objetos, o cdigo final gerado pelo Quick e
incorporado ao executvel no havendo a necessidade de se carregar arquivos externos (como o
caso do Report Smith), os objetos do Quick so formados pela seguinte banda:

Os objetos contidos nesta banda so:

QuickReport

O componente QuickReport e o responsvel pelo controle do relatrio. Seu trabalho


transformar o formulrio do Delphi em um relatrio. Para uma prvia do relatrio (em modo de
construo) basta simplesmente dar um duplo click sobre o objeto mas lembre-se que os cdigos
para os eventos no sero executados. Componente responsvel pelo controle principal do
relatrio. Coloque-o em um formulrio que servir de base para o relatrio e utilize os comandos
Print ou Preview.

QRBand

Uma banda uma simples diviso do relatrio. um relatrio ser dividido em


diferentes partes para a impresso, tais como: Detalhe, Cabealho de Pgina, Rodap, Grupos,

141

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

etc. Alguns tipos de bandas so impressas automaticamente, enquanto que outros tipos necessitam
dos objetos QRGroup ou QRDetailLink para seu controle. possvel tambm utilizar-se de
mltiplas bandas de um mesmo tipo.

QRGroup

Os grupos podem ser formados com o auxlio deste componente, se utiliza de


cabealho e rodap para o controle do grupo. possvel criar no mximo 10 nveis (a proprieade
Level varia de 0 a 9) sendo que os nveis mais baixos dominam a impresso dos mais altos.

QRDetailLink
O componente QRDetailLink usado para criar diferentes tipos de detalhes.

QRLabel

Textos esttico no relatrio so formados pelo componente QRLabel bastando para


isso modificar a propriedade Caption. possvel tambm modificar a propriedade Caption
durante a gerao do relatrio

QRMemo
O componente QRMemo e usado para imprimir multiplas linhas de um campo.

QRDBText
Este componente responsvel pela impresso dos campos dos arquivos.

QRDBCalc
Componente utilizado para realizar clculos bsicos durante a gerao do relatrio

QRSysData

Imprime vrias informaes sobre o sistema tais como: nmero da pgina, data,
hora ou ttulo do relatrio.

QRShape
Utilizado para desenhar simples figuras geomtricas.

QRPreview
Este objeto responsvel pela modificao no Preview padro do relatrio.

142

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Vamos agora realizar um exemplo simples e prtico com o Quick, criando o mesmo
relatrio proposto com o Report Smith, deste modo acredito, que voc pode comparar a
facilidade de ambos os geradores.
1. Inicialmente Clique no boto
(New Form) na Speed Bar, ou no menu principal a
Clique no menu principal a opo File e New..., em New Items, na pgina New e clique
no objeto entitulado Form e altere a propriedade name para F_Relato e salve o
formulrio como fRelato.
2. Coloque os seguintes objetos e faa as seguintes alteraes:
Query (Localizado na pgina Data Access) , altere as seguintes propriedades:
Propriedade

Valor

Descrio

DatabaseName

BaseDisco

Nome do Alias ou a localizao do


diretrio das tabelas

SQL

Select B.Cod_Disco, B.Nom_Disco, B.Tip_Disco, Clusula de consulta


C.Des_Categ from Basico as B left join Categor as
C on (B.Sig_Categ = C.Sig_Categ) where
B.Cod_Disco Between :Cod01 and :Cod02 order
by B.Cod_Disco

Params

Acerte ambos os campos para DataType como


AsFloat

Parmetro da consulta

Name

QryBasico

Nome do objeto

DataSource (Localizado na pgina Data Access) , altere as seguintes propriedades:


Propriedade

Valor

Descrio

DataSet

QryBasico

Nome da tabela vinculada

Name

DSBasico

Nome do objeto

QuickReport (Localizado na pgina QReport)

Propriedade

Valor

Descrio

DataSource

DsBasico

Nome do DataSource vinculado

Name

QrConfere

Nome do objeto

ReportTitle

Cadastro de CDs

Ttulo do Relatorio

Para o Objeto QrBand (Localizado na pgina QReport)

Propriedade

Valor

Descrio

BandType

rbPageHeader

Tipo da banda (Cabealho de Pgina)

Name

bdCabecalho

Nome do objeto

Color

clNavy

Cor da Banda

Para o Objeto QrSysData (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabecalho

Propriedade

Valor

Descrio

AlignToBand

True

Alinha considerando a banda

AutoSize

True

Dimensiona automaticamente o tamanho

Data

qrsReportTitle

Tipo do dado a ser mostrado

Font

Arial, 14, Negrito, Branco

Fonte do objeto

Alignment

taCenter

Alinhamento do objeto

143

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Para o Objeto QrSysData (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabecalho

Propriedade

Valor

Descrio

AlignToBand

True

Alinha considerando a banda

AutoSize

True

Dimensiona automaticamente o tamanho

Data

qrsDateTime

Tipo do dado a ser mostrado

Font

Arial, 8, Normal, Branco

Fonte do objeto

Alignment

taRightJustify

Alinhamento do objeto

Para o Objeto QrBand (Localizado na pgina QReport)

Propriedade

Valor

Descrio

BandType

rbColumnHeader

Tipo da banda (Cabealho de Coluna)

Name

bdCabColuna

Nome do objeto

Color

clNavy

Cor da Banda

LinkBand

bdCabecalho

Banda de depndencia

Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabColuna

Propriedade

Valor

Descrio

Caption

Cdigo

Label do objeto

Font

Arial, 12, Negrito, Branco

Fonte do objeto

Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabColuna

Propriedade

Valor

Descrio

Caption

Nome

Label do objeto

Font

Arial, 12, Negrito, Branco

Fonte do objeto

Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabColuna

Propriedade

Valor

Descrio

Caption

Tipo

Label do objeto

Font

Arial, 12, Negrito, Branco

Fonte do objeto

Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdCabColuna

Propriedade

Valor

Descrio

Caption

Categoria

Label do objeto

Font

Arial, 12, Negrito, Branco

Fonte do objeto

Para o Objeto QrBand (Localizado na pgina QReport)

Propriedade

Valor

Descrio

BandType

rbDetail

Tipo da banda (Cabealho de Coluna)

Name

bdDetalhe

Nome do objeto

LinkBand

bdCabColuna

Banda de depndencia

Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdDetalhe

144

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Propriedade

Valor

Descrio

AutoSize

True

Dimensiona automaticamente o tamanho

DataSource

DsBasico

DataSource vinculado

DataField

Cod_Disco

Campo vinculado

Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdDetalhe

Propriedade

Valor

Descrio

AutoSize

True

Dimensiona automaticamente o tamanho

DataSource

DsBasico

DataSource vinculado

DataField

Nom_Disco

Campo vinculado

Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdDetalhe

Propriedade

Valor

Descrio

AutoSize

True

Dimensiona automaticamente o tamanho

DataSource

DsBasico

DataSource vinculado

DataField

Tip_Disco

Campo vinculado

Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do


objeto bdDetalhe

Propriedade

Valor

Descrio

AutoSize

True

Dimensiona automaticamente o tamanho

DataSource

DsBasico

DataSource vinculado

DataField

Des_Categ

Campo vinculado

Criaremos um relatrio simples com cabealho (BdCabecalho), Impresso das linhas


detalhe (bdDetalhe) e rodap (bdRodape), a ordem de disposio das bandas no importa, o
objeto QuickReport responsvel por este controle.
Ao final acerte a tela de modo que fique semelhante a esta:

3. Por mais incrvel que isto possa parecer nosso relatrio est pronto, precisamos somente
mudar a chamada a partir do objeto F_Menu (aproveitaremos o objeto F_DgGeral criado
para o uso com o Report Smith) chame novamente o objeto F_Menu e clique na opo
Relatrio | Geral chamando o evento onClick;

145

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

4. Insira o comando
procedure TF_Menu.Geral1Click(Sender: TObject);
begin
if F_DgGeral.ShowModal = mrOK then
Chama e verifica se a DgGeral retornou OK
with F_Relato do
Para o objeto F_Relato
begin
QryBasico.Params[0].AsFloat := StrToFloat(F_DgGeral.CampInicial); Envia os parmetros
QryBasico.Params[0].AsFloat := StrToFloat(F_DgGeral.CampFinal);
QryBasico.Open;
Abre a Query
QrConfere.Preview;
Chama o relatrio em tela
QryBasico.Close;
Fecha a Query
end;
end;

Poderiamos ficar criando n tipos de relatrios diferentes mas o melhor mtodo que
voc d uma olhada no diretrio [Diretrio de Instalao do Delphi]\Demos\QuickRpt e execute o
projeto Qrdemo.dpr. Qualquer outra referncia pode ser encontrada no documento Word que
acompanha o produto, o arquivo QrManual.doc.

O usurio do Delphi 1.0 pode ficar se perguntando porque adquirir ou aprender a


utilizar um outro gerador de relatrio quando o Delphi j traz gratuitamente o ReportSmith? O
problema que acontece se restringe a distribuio de um sistema em Delphi que utilize relatrios
gerados com o ReportSmith este exige um run-time para executar (distribudo gratuitamente
tanto na verso 1.0 quanto na verso 2.0) ocupando mais espao na mquina cliente.

Necessariamente, no ser preciso enquanto voc estiver na fase de desenhando o


formulrio executar o sistema para ver como ficou, simplesmente d um duplo clique no objeto e
o relatrio ser automaticamente gerado. Obs. Cuidado que os eventos criados do formulrio no
sero executados.

Captulo IX
Multimdia
Este captulo foi inserido apenas para sanar quaisquer dvidas existentes quanto ao
desenvolvimento de aplicaes que envolvam multimdia com o Delphi, a primeira parte no faz
parte do desenvolvimento do projeto piloto iniciado.

O que multimdia ?
Multimdia e uma associao que decorre com o uso de imagens, sons e movimentos, os
trs tipos de arquivos que se utilizam deste formato de aplicao so:
1. tipo AVI - inclui as produes de vdeo.

146

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

2. tipo MID - arquivos para a produo de msica utilizando a interface de Instrumentos


Musicais Digitalizados, ou formato MIDI.
3. tipo WAV - mais comuns, inclui o registro de sons utilizando a tecnologia
Microsoft's WAVE..
O problema principal que ocorre quanto a aplicaes multimdia o espao fsico
ocupado, por exemplo, arquivos do tipo AVI, comparando um filme de apenas um minuto ou
menos pode ocupar cerca de 5Mb ou at mesmo 10Mb de espao em disco.

Delphi and Multimedia


O objeto TMediaPlayer
, encontrado na Component Pallety na pgina System,
permite o acesso aos arquivos multimdia. O controle extremamente simples. De fato, fcil
criar aplicaes que envolvam som ou imagens em movimento com apenas uma ou duas linhas de
cdigo.
Atravs deste objeto voc tem acesso e controle a rotinas mais internas atravs da MCI
(Media Control Interface). Essas rotinas podem ser programadas para acessar toda a possibilidade
do mundo multimdia. Com este objetos estas rotinas se tornam extremamente simples e intuitivas
para seu uso, como veremos a seguir.

Objeto TMediaPlayer
Para criar uma simples aplicao multimdia crie um novo projeto, e arraste o objeto
para o formulrio, automaticamente criado uma barra de tarefas multimdia, conforme a figura
abaixo:

Clique no objeto e altere a propriedade FileName para C:\WINDOWS\CHIMES.WAV


esta propriedade associa a arquivos tipo AVI, MIDI ou WAVE altere tambm a propriedade
AutoOpen para True, esta propriedade inicia automaticamente o arquivo.
Depois de completos estes simples passos voc j pode rodar o programa. Pressione o
boto verde para ouvir o som do arquivo selecionado. Mas de repente voc no ouviu nada, no
se desespere a causa pode ser um destes problemas
1. Voc entrou com o nome do arquivo invlido.
2. Seu sistema de multimdia no est correto.
3. A propriedade AutoOpen no est true.

147

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Resultados idnticos ocorrem com arquivos MIDI ou AVI.


Colocando as propriedade em modo Runtime
Dependendo das circunstncias prefervel que o arquivo no esteja sempre aberto mas
apenas quando o usurio clicar em um determinado boto. Isto pode ser obtido facilmente
modificando a propriedade AutoOpen para False e no evento OnClick do boto insira o seguinte
comando:
procedure TForm1.Button1Click(Sender: TObject);
begin
MediaPlayer1.Open;
end;

Podemos tambm alterar o arquivo a qual queremos ouvir, para isto insira o objeto
OpenDialog
, encontrado na Component Palette na pgina Dialogs, e um objeto BitBtn
conforme a figura abaixo:

Para o evento onClick do objeto Seleciona insira o seguinte cdigo:


procedure TForm1.SelecionaClick(Sender: TObject);
begin
MediaPlayer1.Close;
if OpenDialog1.Execute then
begin
MediaPlayer1.FileName := OpenDialog1.FileName;
MediaPlayer1.Open;
end;
end;

Um ajuste pode ser feito para permitir que o objeto seleo tenha acesso apenas as
extenses AVI , WAV, or MID. Podendo ser colocado de duas maneiras diferentes, na
propriedade Filter do objeto OpenDialog1:

1. Arquivos Multimdia (*.avi; *wav; *.mid) | *.avi;*.wav;*.mid


2. Arquivo AVI (*.avi) | *.avi
Arquivo WAVE (*.wav) | *.wav
Arquivo MIDI (*.MID) | *.mid

As barras ( | ) so utilizadas para dividir duas sees: Filter Name e Filter.

148

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Pesquisando variveis em modo RunTime


Uma amostra muito simples de um programa multimdia, e um tanto poderoso que quase
qualquer pessoa capaz de faze-lo, pois o programa um pouco robusto, e no aconselho a
tentativa por programadores inexperientes, para as informaes aqui necessitadas preciso ter um
controle total das capacidades multimdia.

Antes de iniciarmos vamos fazer uma pequena observao, principalmente relativo a dois
pontos:
Para alguns programadores que procuram coisas teis, as informaes aqui presentes
contm o essencial para transform-los em programadores multimdia.
Outra observao seria a respeito de alguns controles a arquivos multimdia. D uma
olhada no arquivo [DiretrioDelphi]\SOURCE\RTL\WIN\MMSYSTEM.PAS, uma biblioteca
de funes que contm todas as chamada de acesso a baixo nvel de comandos Windows para
aplicaes multimdia. As tcnicas de acessos esto contidas no prprio documento.
Com estes dois pontos frescos em nossa mente, podemos iniciar o nosso estudo sobre os
aspectos do objeto TMediaPlayer.
D uma olhada na Objeto Inspector na pgina de Eventos do objeto TMediaPlayer voc
encontrar dois mtodos:
O evento OnClick que ocorre quando pressionado qualquer boto do controle. Por
instncia, atravs do parmetro enviado Button possvel saber se o boto pressionado foi o
OnPlay.
Um segundo evento consiste no OnNotify por conter a mensagem mm_MciNotify que so
as chamadas do Windows para o inicio ou o termino de uma execuo, com seus eventuais erros.
Ambos os eventos sero discutidos nos prximos pargrafos.
possvel identificar o boto pressionado atravs do evento OnClick, aqui esto todos os
tipos gerados pelo TMPBtnType:

btPlay: Quando pressionado o boto verde, Iniciar.


btPause: Quando pressionado o boto amarelo, Pausa.

149

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

btStop: Quando pressionado o boto vermelho, Parar.


btBack: Quando pressionado o boto azul, Avana a imagem.
btStep: Quando pressionado o boto azul, Retorna a imagem.
btNext: Quando pressionado o boto azul, Avano rpido.
btPrev: Quando pressionado o boto azul, Retorno rpido.
btRecord: Quando pressionado o boto vermelho, Gravao.
btEject: Quando pressionado o boto azul, Retirar.

Inicialmente vamos determinar qual foi o tipo de boto pressionado, para tanto, crie para
o evento OnClick o seguinte cdigo:
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType; var DoDefault: Boolean);
begin
case Button of
btPlay: Edit1.Text := 'Tocando';
btPause: Edit1.Text := 'Pausado';
btStop: Edit1.Text := 'Parado';
btNext: Edit1.Text := 'Prximo';
btPrev: Edit1.Text := 'Anterior';
btStep: Edit1.Text := 'Avanando';
btBack: Edit1.Text := 'Retornando';
btRecord: Edit1.Text := 'Gravando';
btEject: Edit1.Text := 'Retirando';
end;
end;

Para encontrar o que aconteceu com o processo, necessitamos do evento OnNotify. Aqui
esto as mensagens enviadas pelo sistema operacional:

mci_Notify_Successful: Comando completado com xito


mci_Notify_Superseded: Comando suspenso por outra funo
mci_Notify_Aborted: Funo corrente foi interrompida
mci_Notify_Failure: Algum erro ocorreu.

O Delphi no reconhece estas diretivas de mensagem, mas ele converte para constantes
do tipo:

nvSuccessful indicando o xito.


nvSuperseded indicando que est suspenso, provavelmente por causa de uma pausa.
nvAborted messages indicando que foi pressionado o boto parar, ou causa devido ao
fechamento do arquivo.

Click no evento OnNotify e coloque o seguinte cdigo:


procedure TForm1.MediaPlayer1Notify(Sender: TObject);
var
S: String;
Total: Integer
begin
case MediaPlayer1.NotifyValue of
nvSuccessful: begin
Inc(Total);
S := 'mci_Notify_Successful ' + IntToStr(Total);
end;

150

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

nvSuperseded: S := 'mci_Notify_Superseded';
nvAborted: S := 'mci_Notify_Aborted';
nvFailure: S := 'mci_Notify_Failure';
else
S := 'No consigo identificar a mensagem';
end;
Edit2.Text := S;
if (MediaPlayer1.NotifyValue = nvSuccessful) and (MediaPlayer1.Mode = mpStopped) then
Edit1.Text := 'Arquivo finalizado';
end;

Estes eventos verificam os acontecimentos mais significativos que ocorreram com o


dispositivo MCI. O modo corrente com que o dispositivo MCI especificado tambm pode ser
utilizado pelo objeto TMediaPlayer. Aqui uma listagem dos valores mais comuns designados:

mci_Mode_Not_Ready
mci_Mode_Stop
mci_Mode_Play
mci_Mode_Record
mci_Mode_Seek
mci_Mode_Pause
mci_Mode_Open

Estes valores so auto-explicativos. Por exemplo, o modo do campo fixado em


mci_Mode_Stop, o dispositivo est parado. Se fixado em mci_Mode_Play, o dispositivo est
tocando.
Crie uma nova procedure Private chamada SetMode, e insira o seguinte cdigo:
procedure TForm1.SetMode;
begin
Edit4.Text := MediaPlayer1.FileName;
case MediaPlayer1.Mode of
mpNotReady: Edit3.Text := 'mci_Mode_Not_Ready';
mpStopped: Edit3.Text := 'mci_Mode_Stop';
mpPlaying: Edit3.Text := 'mci_Mode_Play';
mpRecording: Edit3.Text := 'mci_Mode_Record';
mpSeeking: Edit3.Text := 'mci_Mode_Seek';
mpPaused: Edit3.Text := 'mci_Mode_Pause';
mpOpen: Edit3.Text := 'mci_Mode_Open';
else
begin
Edit1.Text := 'Dispositivo Inativo';
Edit2.Text := 'Sem messagens';
Edit3.Text := 'No identificado';
Edit4.Text := 'No h arquivo selecionado';
end;
end;
end;

Para a chamada desta rotina click no objeto Ttimer e chame o evento OnTimer e insira o
seguinte cdigo:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

151

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

SetMode;
end;

Com a propriedade Interval deste objeto fixada em 1000, significa que a cada 1000
milisegundos ser disparada a rotina de verificao que informar o estado para o objeto
TMediaPlayer.
Execute o projeto e atente para os seguintes detalhes:

Toda a vez que for usado um boto da barra multimdia, ser disparado o evento onClick
marcando deste modo o tipo de boto pressionado;

As mensagens da mm_MciNotify ocorrem durante toda a execuo da aplicao, tente


utilizar os botes Pausa e Parar no meio de uma execuo.

Quando for selecionar um novo arquivo, afaste um pouco a janela de dilogo e observe
como esto os campos edit.

Observe e estude tambm o arquivo [DiretrioDelphi]\SOURCE\VCL\MPLAYER


.PAS ele a unidade principal de criao do objeto TMediaPlayer.

Inserindo o multimdia para o Sistema


Que tal se alm de cadastrarmos os nossos CDs pudessemos ouv-los, adicione um opo
do menu principal do sistema que chamar o seguinte formulrio.

Desenvolvimento do CD Player

Inicialmente, crie um novo objeto Form baseado na template Blank form e altere as
seguintes propriedades:

Propriedade

Valor

Descrio

BorderStyle

bsDialog

Estilo da borda do formulrio

Caption

CD Player

Label do objeto (Tarja azul do formulrio)

Name

F_Player

Nome do objeto

Position

poScreenCenter

Posio da janela (centralizado)

Crie para esta nova janela os seguintes objetos:

TMediaPlayer
seguintes propriedades:

, encontrado na Component Pallety na pgina System, e altere as

Propriedade

Valor

Descrio

VisibleButtons

[btPlay,btPause,btStop,btNext,btP Botes que ficaro visveis


rev,btEject]

Name

CD

Nome do objeto

152

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

TTimer
, encontrado na Component Pallety na pgina System, servir para controlar
o tempo das msicas.
Panel
propriedades:

, encontrado na Component Pallete na pgina Standard, e altere as seguintes

Propriedade

Valor

Descrio

Align

alBottom

Alinhamento dentro do form, todo no rodap

Alignment

taLeftJustify

Alinhamento da Caption, justificado esquerda

BevelInner

bvLowered

Borda 3D interna, tipo pressionado

BevelOuter

bvLowered

Borda 3D externa, tipo pressionado

BorderWidth

Tamanho da borda

Caption

Insira o CD

Label do objeto

Name

LinhaStatus

Nome do objeto

Font

MS Sans Serif, Estilo da


fonte: Normal, Tamanho: 8,
Cor: Azul Marinho

Tipo de letra a ser mostrada no objeto, para alterar esta

22

Altura do objeto

Height

Panel
propriedades:

propriedade clique no boto

, encontrado na Component Pallete na pgina Standard, e altere as seguintes

Propriedade

Valor

Descrio

Align

alTop

Alinhamento dentro do form, todo no topo

BevelInner

bvLowered

Borda 3D interna, tipo pressionado

BevelOuter

bvRaise

Borda 3D externa, tipo pressionado

BorderWidth

Tamanho da borda

Height

50

Altura do objeto

Caption

Label do objeto

Crie quatro objetos Label dentro do objeto Panel2, para os dois primeiros altere a
propriedade Caption para Trilha: e Posio: respectivamente para os outros dois altere a
propriedade Name para LblTrack e LblTime, altere a propriedade Font de todos para MS Sans
Serif, Estilo da fonte: Normal, Tamanho: 8, Cor: Castanho.
Compare o desenho do formulrio a seguir:

153

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Quanto ao programa vou explic-lo na integra, acompanhe a listagem colocando os


procedimentos nos locais indicados:
unit Fplayer;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, MPlayer, MMSystem;
type
TF_Player = class(TForm)
CD: TMediaPlayer;
Timer1: TTimer;
LinhaStatus: TPanel;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
LblTrack: TLabel;
LblTime: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure CDPostClick(Sender: TObject; Button: TMPBtnType);
procedure CDNotify(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
TrilhaCorrente: byte;
FinalTrilhaCorrente: Longint;
TrilhaLidas: boolean;
CDPlaying, CDPaused: boolean;
TamTrilha: array[1..100] of LongInt;
function CDPos(Sender:TObject; Trilha, Min, Sec: byte): Longint;
procedure InitCD(Sender:TObject);
procedure ResetCD(Sender:TObject);
public
{ Public declarations }
end;
var
F_Player: TF_Player;
implementation
{$R *.DFM}

154

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

const
ModeStr: array[TmpModes] of string[10] = ('No Lido', 'Parado', 'Tocando',
'Gravando', 'Pesquisando', 'Pausado', 'Aberto');

{ Criado - Calcula a posio }


function TF_Player.CDPos(Sender:TObject; Trilha, Min, Sec: byte): Longint;
var
i: integer;
begin
result := 0;
for i := 1 to (Trilha - 1) do
begin
Inc(Result, mci_MSF_Second(TamTrilha[i]));
Inc(Result, mci_MSF_Minute(TamTrilha[i]) * 60);
end;
Inc(Result, Sec);
Inc(Result, Min * 60);
end;
{ Criado - Inicializa os drivers de CD }
procedure TF_Player.InitCD(Sender:TObject);
var
i : integer;
begin
if not TrilhaLidas then
begin
LinhaStatus.Caption := 'Lendo as trilhas';
LinhaStatus.Update;
for i := 1 to CD.Tracks do
TamTrilha[i] := CD.TrackLength[i];
TrilhaLidas := True;
end;
end;
{ Criado - Reseta o formulrio }
procedure TF_Player.ResetCD(Sender:TObject);
begin
{ Limpa para trilha 0 }
TrilhaCorrente := 1;
LblTrack.Caption := '0';
LblTime.Caption := '00:00';
{ Modifica a cor para vermelho }
LblTrack.Font.Color := clRed;
LblTime.Font.Color := clRed;
{ Para o CD Player }
CD.Stop;
{ Coloca a posicao da trilha para a inicial }
CD.StartPos := mci_Make_TMSF(1, 0, 0, 0);
CDPlaying := False;
CDPaused := False;
end;

155

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Evento Timer do Objeto Timer1 }


procedure TF_Player.Timer1Timer(Sender: TObject);
var
Trilha, Minutes, Seconds : byte;
strMinuto, strSegundo: String;
Pos: LongInt;
begin
{ Acerta o estado da linha }
if CDPaused then
LinhaStatus.Caption := 'Pausado'
else
LinhaStatus.Caption := ModeStr[CD.Mode];
case CD.Mode of
mpStopped:
begin
{ Inicializa o CD para ser lido }
if not TrilhaLidas then
InitCD(CD);
{ No caso de ser Continuous Play }
if CDPlaying and (not CDPaused) then
begin
CD.StartPos := mci_Make_TMSF(1, 0, 0, 0);
CD.Play;
CD.EnabledButtons := [btPause, btStop, btNext, btPrev, btEject];
end;
end;
mpOpen:
begin
TrilhaLidas := False;
ResetCD(CD);
end;
mpPlaying:
begin
Pos := CD.Position;
Trilha := mci_TMSF_Track(Pos);
Minutes := mci_TMSF_Minute(Pos);
Seconds := mci_TMSF_Second(Pos);
TrilhaCorrente := Trilha;
{ Constri os minutos e segundos para mostrar }
strMinuto := IntToStr(Minutes);
strSegundo := IntToStr(Seconds);
if Length(strMinuto) < 2 then
strMinuto := '0' + strMinuto;
if Length(strSegundo) < 2 then
strSegundo := '0' + strSegundo;
{ Mostra os Labels }
LblTrack.Caption := IntToStr(Trilha);
LblTime.Caption := strMinuto + ':' + strSegundo;
end;
end;
end;

156

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Evento PostClick do Objeto CD }


procedure TF_Player.CDPostClick(Sender: TObject; Button: TMPBtnType);
begin
case Button of
btPlay:
begin
{ Modifica a cor para Azul Marinho }
LblTrack.Font.Color := clNavy;
LblTime.Font.Color := clNavy;
CDPlaying := True;
CDPaused := False;
Update;
end;
btPause:
begin
{ Modifica a cor para Roxo }
LblTrack.Font.Color := clPurple;
LblTime.Font.Color := clPurple;
CDPlaying := False;
CDPaused := True;
Update;
end;
btStop:
ResetCD(CD);
btEject:
begin
TrilhaLidas := False;
ResetCD(CD);
end;
end;
Timer1Timer(Timer1);
end;
{ Evento OnNotify do Objeto CD }
procedure TF_Player.CDNotify(Sender: TObject);
begin
Timer1Timer(Timer1);
end;
{ Evento OnCreate do Objeto F_Player }
procedure TF_Player.FormCreate(Sender: TObject);
begin
CDPlaying := False;
CDPaused := False;
TrilhaLidas := False;
end;
end.

157

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Salve o formulrio com o nome de FPlayer e faa a chamada a partir do menu principal
do seu sistema, bom divertimento.

Captulo X
Novos Componentes
Uma das maiores vantagens do Delphi sobre os demais concorrentes o fato da gerao
de novos componentes (de novos objetos).
O exemplo a seguir pretende colocar uma luz sobre o assunto mostrando os passos
bsicos para o desenvolvimento de componentes, estes passos so:

Criando propriedades e mtodos;

Controle ao acesso as propriedades;

Propriedades de leitura e escrita;

Enviando e recebendo mensagens atravs dos componentes.

Criando Componentes
Componentes so como blocos de construo para as aplicaes Delphi. Voc poder
construir uma aplicao simplesmente adicionando estes blocos e modificando os eventos,
propriedades ou mtodos. Todos os componentes possuem duas propriedades em comum: Name e
Tag. Alguns componentes esto distribudos na Component Pallete. Mas alguns componentes
(TApplication, TMenu, TMenuItem, e TScreen) so disponveis apenas atravs de seu cdigo.
Voc pode criar novos componentes utilizando os seguintes passos:
1. Derivando os novos componentes de um componente j existente.
2. Modificando um componente.
3. Registrando um componente.
O componente criado como uma unit separada de um projeto, podendo ser formado por
uma ou mais units. Aps voc criao do componente, compilao e instalao dentro da paleta
de componentes. Para usar o componente, selecione-o da Component Pallete e adicione-o ao
formulrio.

158

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

A Classe TComponent
Voc criar um novo componente utilizando diretamente o Code Editor, para isso voc
usar a Component Expert. Na verdade todos os componentes criados sero derivados de
componentes j existentes, mesmo que voc deseje criar um componente sem eventos ou
propriedades ele ser herdado de uma classe j existente a TComponent.
A TComponent uma classe inicial de componentes, sob ela que foi feita a rvore de
componentes Delphi, por exemplo, a classe TControl, possuem mais de 70 componentes
descendentes, tais como: TBitBtn, TButton, TCheckBox, TColorDialog, TComboBox, TForm,
TFontDialog, TGroupBox, THeader, TImage, TLabel, TListBox, TMainMenu e TMediaPlayer. E
voc ainda pode derivar mais alguns descendentes daqui.

Um Componente Simples
Vamos criar agora um novo componente, para tanto abra um novo projeto e selecione

File | New... selecione a pgina New e o item


. Ser mostrada a janela da Component
Expert. Informe os seguintes parmetros conforme o desenho abaixo:

Clique no boto OK para aceitar a entrada. A Component Expert criar automaticamente


o seguinte cdigo para a chamada da Unit1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
CustComp1 = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
public

159

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Custom', [CustComp1]);
end;
end.

Adicionando o Componente a Palheta


Por incrvel que parea mas voc terminou de construir seu primeiro componente, e bem
verdade que ele no faz absolutamente nada alm de abrigar as nicas propriedades padres
existentes em qualquer componente: Name e Tag. Mas j estamos no comeo.
Salve o componente como Cust, selecionando File | Save, dentro do diretrio de
instalao do Delphi na pasta Lib. Para instalar o componente selecione Component | Install...
aparecer a seguinte janela dilogo:

Clique no boto Add... e ser mostrada a janela dilogo Add Module. Use o boto
Browse para localizar o arquivo Cust.PAS, note que ele ser remetido a ListBox Installed units:
e caminho do componente (se voc salvou-o em outro diretrio) ser colocado no Search Path.

160

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Para novos componentes crie um diretrio embaixo do Delphi entitulado Lib2, pois se
voc sempre colocar cada novo componente no diretrio Lib, caso voc precise copiar apenas os
seus componentes, dificilmente os distinguir dos componentes padres do Delphi.

Lembre-se que o Search Path um campo texto limitado em 255 posies ento
tambm no adianta para cada componente novo colocar um diretrio separado, pois facilmente
voc estourar o tamanho do campo Search Path.
Finalmente clique no boto OK e a COMPLIB.DCL (Biblioteca padro de
componentes) ser recompilada. Ao trmino da compilao, note que foi criada uma nova pgina
na Component Pallete (Custom) e adicionado o novo componente (CustomComp1).
Para testar seu novo componente crie um novo formulrio insira o componente
CustomComp1. Observe atravs da Object Inspector as propriedades do seu novo componente:
Name e Tag.

Criando Propriedades
Para o nosso componente vamos adicionar uma propriedade que armazenar um valor
inteiro, para isto chame novamente a unit do componente e insira os cdigos abaixo da
declarao private:
type
CustComp1 = class(TComponent)
private
fDemoProp:Integer;

Agora criaremos uma propriedade aonde o valor ser lido e escrito atravs desta varivel
para tanto insira os cdigos abaixo da declarao published:
published
property DemoProp: Integer read fDemoProp write fDemoProp;
end;

A seo Public (pblica) abriga as variveis, procedimentos ou funes que podem ser
lidos e executados por quaisquer outras units que utilizem (atravs clusula Uses) a unit em
questo j a seo Published (Publicado) utilizada para inserir propriedades ou eventos aos
componentes.
Salve o componente e recompile a biblioteca atravs das opes Component | Rebuild
Library..., ao trmino da recompilao, note que para o componente foi criada uma nova
propriedade definida como DemoProp que armazena o valores inteiros.

Mtodos de Acesso
A propriedade criada pode disparar um procedimento ou uma funo para executar
determinadas aes (por exemplo, colocando um intervalo vlido para a varivel criada).
Primeiro, escreva a seguinte funo para a funo read do comando property:
function Cust.GetDemoProp: integer;

161

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin
Result := fDemoProp;
end;

Escreva o procedimento para a funo write do comando property:


procedure Cust.SetDemoProp(val: integer);
begin
if val > 99 then
begin
DemoProp := fDemoProp;
raise exception.create('Valor no pode ser maior que 99');
end
else
fDemoProp := val;
end;

Declare a funo GetDemoProp e o procedimento SetDemoProp na seo private,


conforme o exemplo abaixo:
private
fDemoProp:Integer;
function GetDemoProp: integer;
procedure SetDemoProp(val: integer);

E para a seo published troque as propriedades:


published
property DemoProp: Integer read GetDemoProp write SetDemoProp;

Salve o componente e recompile a biblioteca atravs das opes Component | Rebuild


Library..., note que a propriedade no mais permitir valores superiores a 99.

Criando novos tipos


De modo semelhante aos j descritos uma propriedade pode abrigar uma lista de tipos
definidos, para tanto na seo type defina o conjunto que abrigar os tipos:
type
TDirecao = (drCima, drBaixo, drLado);

Na seo private crie uma nova varivel com base no tipo definido:
private
fDemoProp:Integer;
fNovaProp:TDirecao;

E finalmente na seo published defina a propriedade:


published
property DemoProp: Integer read GetDemoProp write SetDemoProp;
property NovaProp: TDirecao read fNovaProp write fNovaProp;

Salve o componente e recompile a biblioteca atravs das opes Component | Rebuild


Library..., teste a nova propriedade.

162

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Pensando em Objetos
Mas para que devemos criar novos componentes? Para aliviarmos os futuros trabalhos.
Lembra-se quando voc copiava aqueles pequenos pedaos de rotinas (do tipo: clculo de
CPF/CGC, clculo de fatorial, um cabealho de relatrio...) os objetos servem exatamente para
guardamos estes pequenos pedaos de blocos de programao, ou se voc preferir o termo
serve para encapsularmos estes cdigos.

Construindo um Objeto
Quando for construir objetos lembre-se que ele deve servir vrios aplicativos, nunca
construa um objeto que servir apenas a um nico aplicativo ( perda de tempo).
Todo o sistema (pelo menos for Windows) necessita de uma janela Sobre o Sistema
ento vamos transformar a janela sobre criada no Captulo IV em um objeto prtico que sirva a
qualquer sistema, inicie um novo projeto e crie um novo componente, para tanto abra um novo
projeto e selecione File | New... selecione a pgina New e o item Component. Ser mostrada a
janela da Component Expert. Informe os seguintes parmetros:
Class Name: SobreDlg
Ancestor type: TComponent
Palette Page: Dialogs
Clique no boto OK para aceitar a entrada. As alteraes propropostas no objeto esto
documentadas com o fonte:
unit SobreDlg;
{ Este objeto permite a criao de uma "caixa sobre" padro para
diversos aplicativos. }
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, fSobre;
type
TSobreDlg = class(TComponent)
private
FProductName, FVersion, FCopyright, FComments: string;
public
function Execute: Boolean;
published
property NomeProduto: string read FProductName write FProductName;
property Versao: string read FVersion write FVersion;
property Direitos: string read FCopyright write FCopyright;
property Comentario: string read FComments write FComments;
end;

163

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

const
PROCESSOR_INTEL_386 = 386;
PROCESSOR_INTEL_486 = 486;
PROCESSOR_INTEL_PENTIUM = 586;
PROCESSOR_INTEL_860 = 860;
PROCESSOR_MIPS_R1000 = 1000;
PROCESSOR_MIPS_R2000 = 2000;
PROCESSOR_MIPS_R3000 = 3000;
PROCESSOR_MIPS_R4000 = 4000;
PROCESSOR_ALPHA_21064 = 21064;
PROCESSOR_PPC_601 = 601;
PROCESSOR_PPC_603 = 603;
PROCESSOR_PPC_604 = 604;
PROCESSOR_PPC_620 = 620;
var
SobreDlg: TSobreDlg;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Dialogs', [TSobreDlg]);
end;
function TSobreDlg.Execute: Boolean;
var
OsInfo: TOSVERSIONINFO;
SysInfo: TSYSTEMINFO;
MemStat: TMEMORYSTATUS;
DiskNo: Integer;
begin
// Cria a janela em memria
F_Sobre := TF_Sobre.Create(Application);
try
with F_Sobre do
begin
// Coloca as propriedades nas variaveis do formulario
ProductName.Caption := NomeProduto;
Version.Caption := Versao;
Copyright.Caption := Direitos;
Comments.Caption := Comentario;
Caption := 'Sobre ' + NomeProduto;
OsInfo.dwOSVersionInfoSize := sizeof(TOSVERSIONINFO);
GetVersionEx(OsInfo);
// Verso do Windows
case OsInfo.dwPlatformId of
VER_PLATFORM_WIN32s : WinVersion.Caption := 'Windows 3.1';
VER_PLATFORM_WIN32_WINDOWS : WinVersion.Caption := 'Windows 95';
VER_PLATFORM_WIN32_NT : WinVersion.Caption := 'Windows NT';

164

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

end;
DosVersion.Caption := format('%d.%d Ver : %d',
[OsInfo.dwMajorVersion,OsInfo.dwMinorVersion,LOWORD(OsInfo.dwBuildNumber)]);
// Pega o processador
GetSystemInfo(SysInfo);
case SysInfo.dwProcessorType of
PROCESSOR_INTEL_386
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel 80386']);
PROCESSOR_INTEL_486
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel 80486']);
PROCESSOR_INTEL_PENTIUM : CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Intel Pentium']);
PROCESSOR_MIPS_R1000
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R1000']);
PROCESSOR_MIPS_R2000
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R2000']);
PROCESSOR_MIPS_R3000
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R3000']);
PROCESSOR_MIPS_R4000
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'MIPS R4000']);
PROCESSOR_ALPHA_21064
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'ALPHA 21064']);
PROCESSOR_PPC_601
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 601']);
PROCESSOR_PPC_603
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 603']);
PROCESSOR_PPC_604
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 604']);
PROCESSOR_PPC_620
: CPU.Caption :=
format('%d %s',[SysInfo.dwNumberOfProcessors, 'Power PC 620']);
end;
MemStat.dwLength := sizeof(TMEMORYSTATUS);
GlobalMemoryStatus(MemStat);
FreeMemory.Caption := format('Tot: %d KB Disp: %d KB',
[Trunc(MemStat.dwTotalPhys/1024),Trunc(MemStat.dwAvailPhys/1024)]);
DiskNo := 3;
FreeDisk.Caption := '';
FreeResources.Caption := '';
repeat
if DiskNo < 7 then
FreeDisk.Caption := FreeDisk.Caption + format('%s: %d MB ',
[Chr(DiskNo + Ord('A')- 1),Trunc(DiskFree(DiskNo)/1024/1024)])
else
FreeResources.Caption := FreeResources.Caption + format('%s: %d MB ',
[Chr(DiskNo + Ord('A')- 1),Trunc(DiskFree(DiskNo)/1024/1024)]);
inc(DiskNo);
until DiskFree(DiskNo) = -1;
ProgramIcon.Picture.Graphic := Application.Icon;
Result := (ShowModal = IDOK);
end;
finally

165

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

F_Sobre.Free;
end;
end;
end.

Para esta primeira etapa do nosso objeto note que tudo gira em torno do procedimento
Execute (o nome se deve apenas a uma questo de padronizao com os outros objetos da palheta
Dialogs), atravs deste procedimento todos as outras variveis so iniciadas, resta-nos agora a
criao do formulrio, crie um novo formulrio, ATENO: No aproveite o formulrio
F_Sobre j criado pois este uma herana do formulrio F_Splash, crie-o conforme o desenho
abaixo:

Para os objetos dentro do painel: altere a propriedade Caption: Nome do Produto,


Verso, Direitos Resevados e Comentrio e a propriedade Name: ProductName, Version,
Copyright, Comments.

Para os objetos fora do painel: altere os objetos Labels da esquerda a propriedade


Caption (Ex: Usurio, Companhia) e os da direita a propriedade Name (Ex: UserName,
CompanyName)

A propriedade Name para todos os componentes, na ordem que eles aparecem so:
Objeto

Tipo

Objeto

Tipo

Objeto

Tipo

Objeto

Tipo

ProgramIcon

TImage

ProductName

TLabel

Version

TLabel

Copyright

TLabel

Comments

TLabel

Label1

TLabel

UserName

TLabel

Label2

TLabel

CompanyName

TLabel

Label3

TLabel

WinVersion

TLabel

Label4

TLabel

DosVersion

TLabel

Label5

TLabel

CPU

TLabel

Label6

TLabel

FreeMemory

TLabel

Label7

TLabel

FreeDisk

TLabel

FreeResources

TLabel

F_Sobre

TForm

Panel1

TPanel

166

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Salve a janela com o nome de FSobre e o componente como SobreDlg e compile a


biblioteca e instale o componente: SobreDlg.PAS, teste o componente da seguinte forma:
1. Remova do projeto o formulrio F_Sobre e retire sua chamada da clusula Uses;
2. Coloque o componente no formulrio F_Menu e acerte as suas propriedades;
3. Insira a chamada ao componente na opo de Sobre o Sistema:
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
SobreDlg.Execute;
end;

4. Compile e rode o sistema.


Bem-vindo ao mundo dos objetos.

Finalmente
facilmente reconhecido que este novo ambiente da Borland possui um poder um tanto
ilimitado, tanto na criao de sistemas como no desenvolvimento de aplicaes de multimdia
resta-nos (a ns desenvolvedores) deixarmos a imaginao fluir e iniciar tudo aquilo que sempre
desejamos, espero que lhe tenha ajudado ao menos a trilhar o caminho das pedras.

167

Apndice A

Documentao
A documentao includa com o Delphi Client/Server:

Delphi Users Guide


Delphi Component Writers Guide
Delphi Database Aplication Developers Guide
SQL Links Users Guide
InterBase Users Guide
InterBase Language Reference
InterBase Data Definition
ReportSmith Creating Reports

Toda a documentao encontrada em forma de livros e modo on-line (para o segundo

caso faz-se necessria a instalao do ACROBAT Reader 2.0 que acompanha o produto).

Hardware/Software requeridos
O Delphi Client/Server requer:

Windows 3.1 ou superior

0 megabytes de espao livre para a instalao mnima


0 megabytes de espao livre para a instalao completa
um processador 80386 ou maior (486 recomendado)
megabytes de RAM

Para instalar, rode o programa INSTALL.EXE direto do CD ROM ou do disquete e


prossiga com as instrues. Sero includas informaes adicionais no arquivo README.TXT
normalmente instalado no diretrio \DELPHI.
Alguns exemplos de aplicaes esto contidas no diretrio \DELPHI\DEMOS.

168

Apndice B

Converso de Campos
possvel, com o DELPHI, criarmos um mesmo sistema que rode em diferentes tipos de
bases, atravs de um nico ALIAS. Para isto precisamos que a definio, tamanho e nome dos
campos e tabelas sejam necessariamente os mesmos. Abaixo est a converso para quatro bases
lgicas de dados:

Sintaxe SQL - para InterBase, ORACLE , Informix entre outras.


BDE Lgico - A chamada do campo interna ao DELPHI.
Paradox - Bases do tipo Paradox.
dBASE - Bases do Tipo .DBF.
Sintaxe SQL

BDE Lgico

Paradox

dBASE

SMALLINT

fldINT16

Short

Number (6,10)

INTEGER

fldINT32

Long Integer

Number (20,4)

DECIMAL(x,y)

fldBCD

BCD

N/A

NUMERIC(x,y)

fldFLOAT

Number

Number (x,y)

FLOAT(x,y)

fldFLOAT

Number

Float (x,y)

CHARACTER(n)

fldZSTRING

Alpha

Character

VARCHAR(n)

fldZSTRING

Alpha

Character

DATE

fldDATE

Date

Date

BOOLEAN

fldBOOL

Logical

Logical

BLOB(n,1)

fldstMEMO

Memo

Memo

BLOB(n,2)

fldstBINARY

Binary

Binary

BLOB(n,3)

fldstFMTMEMO

Formatted memo

No Apresenta

BLOB(n,4)

fldstOLEOBJ

OLE

OLE

BLOB(n,5)

fldstGRAPHIC

Graphic

No Apresenta

TIME

fldTIME

Time

No Apresenta

TIMESTAMP

fldTIMESTAMP

Timestamp

No Apresenta

MONEY

fldFLOAT, fldstMONEY

Money

Float (20,4)

AUTOINC

fldINT32, fldstAUTOINC

Autoincrement

No Apresenta

BYTES(n)

fldBYTES(n)

Bytes

No Apresenta

x = preciso (default: especfico para o driver)


y = escala (default: 0)
n = tamanho em bytes (default: 0)
1-5 = BLOB subtipo (default: 1)

169

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Tipos de Dados para o InterBase


O InterBase suporta alguns tipos de dados SQL, mas no suporta diretamente dados do
tipo TIME ou TIMESTAMP. A lista abaixo contm os tipos de dados disponveis para as
declaraes SQL no InterBase:
Nome

Tamanho

Preciso

Descrio

BLOB

Varivel

No apresenta

Objeto do tipo binrio largo, possvel guardar


dados grandes, tais como grficos, textos e voz
digitalizada.

CHAR(n)

n Caracteres

1 at 32767

Tamanho fixo de caracteres ou tipo de string. O


nome tambm pode apresentar : CHARACTER.

DATE

64 bits

1 jan 100 at 11
jan 5941

Tambm inclui todas as informaes sobre a hora.

DECIMAL
(preciso, escala)

varivel

Preciso: 1 at
15 e escala de 1
at 15

Especifica-se por preciso o nmero de dgitos a


serem gravados e por escala o nmero de casas
decimais, exemplo DECIMAL(10,3) igual ao
formato: ppppppp.eee.

DOUBLE
PRECISION

64 bits

1,7 x 10-308 at
1,7 x 10308

Utilizado para valores cientficos, com 15 dgitos


de preciso.

FLOAT

32 bits

3,4 x 10-38 at
3,4 x 1038

Preciso simples, com 7 dgitos de preciso.

INTEGER

32 bits

-2.147.483.648
at
2.147.483.648

Campo do tipo longo.

NUMERIC
(preciso, escala)

varivel

Preciso: 1 at
15 e escala de 1
at 15

Especifica-se por preciso o nmero de dgitos a


serem gravados e por escala o nmero de casas
decimais, exemplo NUMERIC(10,3) igual ao
formato: ppppppp.eee.

SMALLINT

16 bits

-32.768 at
32.767

Campo mdio.

VARCHAR(n)

n Caracteres

1 at 32767

Tamanho varivel de caracteres ou tipo de string. O


nome tambm pode apresentar : VARYING
CHAR ou VARYING CHARACTER.

170

Apndice C

Aplicao rpida com o Objeto Query


Para no ficar quaisquer dvidas sobre o objeto tQuery
, vamos utiliz-lo para a
demonstrao de uma pequena aplicao, neste exemplo, utilizaremos a base de dados encontrada
no diretrio C:\DELPHI\DEMOS\DATA utilizaremos as tabelas: Customer, Orders, Parts e
Items. A idia mostrar um formulrio com o nome do cliente ligado a um Grid com todas as
encomendas pertencentes a este cliente. Conforme a figura abaixo:

Para comear, coloque em um novo formulrio um objeto tTable


e um objeto
tQuery. O objeto tTable efetuar a ligao com a tabela de Clientes (Tabela Customer),
enquanto que o tQuery ir extrair os detalhes da encomenda (Tabelas Orders, Parts e Items)
apropriados a cada cliente. Os dados esto em uma tabela Paradox, pelo que na propriedade
DataBaseName colocado o nome do diretrio que contm os dados (ou defina o nome do
Alias: DBDemos). A ligao completada atravs da definio das propriedades TableName e
IndexName, e se alternarmos a propriedade Active para true vemos os dados reais, mesmo
durante a fase de construo do formulrio.
Se os registros contendo os detalhes dos pedidos estivessem todos em uma nica tabela, a
juno poderia ser facilmente realizada pela definio das propriedades MasterSource e

171

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

MasterField de um segundo objeto tabela, mas, uma vez que necessitamos de dados de mais de
uma tabela (Orders e Products), esta tcnica simples no funciona. O controle de consulta
recupera um conjunto diferente de registros para cada cliente, extraindo dados das duas tabelas
ligadas. O Delphi oferece duas tcnicas para fazer isto: Uma delas envolve o uso de variveis
Calculadas para uma das trs tabelas em questo; uma outra (mais simples) envolve atribuio
de um valor propriedade SQL do objeto tQuery, ou seja, uma instruo SQL apropriada. Neste
exemplo, vamos fazer colocando algum cdigo no evento OnDataChange do objeto
DataSource. Lembre-se que este evento chamado sempre que o registro corrente alterado.
Insira a seguinte instruo na propriedade SQL do objeto tQuery:
SELECT Orders.OrderNo, Items.Qty, Parts.Description, Parts.ListPrice
FROM Orders, Items, Parts
WHERE Orders.OrderNo = Items.OrderNo AND
Items.PartNo = Parts.PartNo AND
Orders.CustNo = :CustNo;

Repare no cdigo SQL na varivel :CustNo, v para a propriedade Params do objeto


tQuery e coloque para a varivel CustNo criada o Data type como Float, est varivel ser
passada para o SQL atravs do evento OnDataChange do objeto DataSource, insira o seguinte
cdigo:
procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
begin
Query1.Close;
Query1.Params[0].AsFloat := Table1CustNo.Value;
Query1.Open;
end;

Relembrando no Delphi os dados fluem da base de dados para o formulrio na


seguinte seqncia:
Base de Dados objeto DataSet (tTable ou tQuery) objeto DataSource objeto Campo

O objeto DataSource necessrio, pois os objetos de campo no podem ligar-se


diretamente aos objetos do DataSet, mas apenas atravs de um objeto DataSource.
Por conseguinte, para cada objeto DataSet tambm colocado no formulrio um objeto
DataSource. Finalmente, so adicionados objetos de caixa de edio de texto, um objeto Grid
para as linhas da encomenda e um objeto dbNavigator ligado a tabela de Customer, rode o
projeto.
objeto Grid est ligado ao objeto tQuery (atravs do objeto DataSource), ento este
se atualiza automaticamente com os novos resultados das consultas.

172

Apndice D

Imprimindo um Formulrio
Para imprimir um formulrio no tem nenhum segredo, existe o comando PRINT
relacionado a formulrios, o problema se inicia quando o formulrio ultrapassa as dimenses da
tela do seu monitor, ou seja, a largura e altura dele maior que a tela. Digamos um formulrio
qualquer que tenha a propriedade HorzScrollBar.Range = 768 e VertScrollBar.Range = 1008 (isto
corresponde a uma folha de papel tamanho A4).
O programa abaixo resolve exatamente este problema, imprimindo somente objetos:
Tlabel, TEdit, TMemo, TDBText, TDBEdit e TDBMemo, utiliza a biblioteca Printers para
fazer o servio, coloque um boto qualquer no formulrio que deseje imprimir e para o evento
onClick, digite os seguintes comandos:
procedure Tform1.SpeedButton1Click(Sender: TObject);
var
C : array[0..255] of char;
CLen, ScaleX, ScaleY, Ind : Integer;
Format : Word;
DC : HDC;
MComp : Tmemo;
R : TRect;
begin
Printer.BeginDoc;
DC := Printer.Canvas.Handle;
ScaleX := GetDeviceCaps(DC, LOGPIXELSX) div PixelsPerInch;
ScaleY := GetDeviceCaps(DC, LOGPIXELSY) div PixelsPerInch;
for Ind := 0 to ComponentCount -1 do
if (Components[Ind] is TCustomLabel) or (Components[Ind] is TCustomEdit) then
begin
MComp := TMemo(Components[Ind]);
if (MComp.visible) then
begin
Printer.Canvas.Font := MComp.Font;
DC := Printer.Canvas.Handle;
R := MComp.BoundsRect;
R.Top := (R.Top + VertScrollBar.Position) * ScaleY;
R.Left := (R.Left + HorzScrollBar.Position) * ScaleX;
R.Bottom := (R.Bottom + VertScrollBar.Position) * ScaleY;
R.Right := (R.Right + HorzScrollBar.Position) * ScaleY;
if (not (Components[Ind] is TCustomLabel)) and (MComp.BorderStyle = bsSingle) then
Printer.Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
Format := DT_LEFT;
if (Components[Ind] is TEdit) or (Components[Ind] is TCustomMaskEdit) then
Format := Format or DT_SINGLELINE or DT_VCENTER
else

173

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

begin
if MComp.WordWrap then
Format := DT_WORDBREAK;
if MComp.Alignment = taCenter then
Format := Format or DT_CENTER;
if MComp.Alignment = taRightJustify then
Format := Format or DT_RIGHT;
R.Bottom := R.Bottom + Printer.Canvas.Font.Height + 1;
end;
CLen := MComp.GetTextBuf(C,255);
R.Left := R.Left + ScaleX + ScaleX;
DrawText(DC, C, CLen, R, Format);
end;
end;
Printer.EndDoc;
Close;
end;

Se voc conhece um pouco de Pascal 7.0 no acredito que voc teve dificuldades em
interpretar o programa, se voc no conhece aqui vo algumas dicas:
Inicialmente foi declarado uma srie de variveis que sero utilizadas posteriormente. E
ento iniciado o objeto de impresso Printer atravs do comando:
Printer.BeginDoc;

O objeto imprime atravs de uma subclasse conhecida por Canvas. Esta classe e que
torna possvel a criao de toda a interface grfica do Delphi (Este objeto parte de um
encapsulamento da Windows HDC). Uma forma simples de se imprimir seria utilizar os seguintes
comandos:
Printer.BeginDoc;
Printer.Canvas.TextOut(0, 0, Est imprimindo...);
Printer.EndDoc;

Mas, para se obter uma cpia fiel do formulrio preciso fazer mais do que isto,
inicialmente e chamada a propriedade handle (esta faz uma chamada a Windows GDI chamando
funes da API para requerer o modo de desenho dos objetos envolvidos), prximo passo
verificar o tipo de escala (em pixels) da largura e altura da janela a ser impressa.
Agora resta verificar objeto a objeto (do tipo Label ou do tipo Edit) e enviar suas
caractersticas para os dados da classe Canvas e imprim-los. Lembre-se o padro de impresso

do Windows emitir a listagem somente quando a mesma estiver completa e isto s acontecer
no comando :
Printer.EndDoc;

Uma outra sada para a impresso de seus relatrios pode ser conseguida atravs da
utilizao de inmeras bibliotecas prontas que fazem o acesso ao objeto TPrinter. Entre elas

existem a ReportPrint (da Nevrona Designs) que pode ser adquirido uma verso de
demonstrao
atravs
da
internet
atravs
do
seguinte
endereo:

ftp.primenet.com/users/j/jgunkel /delphi/rprinter.zip

174

Apndice E

Trabalhando com Mscaras


Abriremos aqui este apndice para esclarecermos a respeito de campos mascarados no
Delphi, alguns campos podem possuir uma mascara para edio atravs da propriedade MaskEdit,
encontrada para os objetos TDateField, TDateTimeField, TStringField, TTimeField e o objeto.
Para montar uma mscara, utiliza-se a propriedade EditMask observando o limite de
dados que o campo poder armazenar. utilizada basicamente para a validao ou a formatao
da entrada de um determinado campo.
A mscara para os campos pode restringir o uso de determinados caracteres ou formatos
vlidos, mostrando automaticamente uma janela de no aceitao da mscara. A validao ocorre
caracter a caracter. Use o evento OnValidate para validar uma entrada completa.
A mscara basicamente consiste de trs campos, separados por ponto e vrgula. A
primeira parte e a mscara propriamente dita. A segunda parte determina se os caracteres fixos
devem ser ou no salvos com a mscara (ex: /, -, (, ...). A terceira parte da mscara representa o
caracter em branco, podendo ser substitudo por outro (ex: _, @, ...).
Estes so os caracteres especiais utilizados com a mscara:
Caracter

Utilizao na mscara

Causa a digitao da mscara fique parada no primeiro caracter, fazendo com que os caracteres digitados
que se movam. Ex: !;0;_

>

Todos os caracteres digitados sero convertidos para maisculas. Ex: >aaa;0;_

<

Todos os caracteres digitados sero convertidos para minsculas. Ex: <aaa;0;_

<>

Anula o uso dos caractes > e <. Ex: >aaa<>aaa;0;_

Utilizado para marcar determinado caracter no especial como fixo. Ex: !\(999\)000-0000;0;_

Requer somente caracteres alfabticos obrigatrios para a posio, do tipo A-Z, a-z. Ex: LLL;1;_

Permite somente caracteres alfabticos para a posio, mas no-obrigatrios, do tipo A-Z, a-z. Ex: lll;1;_

Requer somente caracteres alfanumricos obrigatrios para a posio, do tipo A-Z, a-z, 0-9. Ex: AAA;1;_

Permite somente caracteres alfanumricos para a posio, mas no-obrigatrios, do tipo A-Z, a-z, 0-9. Ex:
aaa;1;_

Requer um caracter obrigatrio para a posio. Ex: CCC;1;_

Permite o uso de qualquer caracter para a posio, limitando apenas o nmero de caracteres utilizados. Ex:
ccc;1;_

Requer somente caracteres numricos obrigatrios para a posio, do tipo 0-9. Ex: 000;1;_

Permite somente caracteres numricos para a posio, no-obrigatrios, do tipo 0-9. Ex: 999;1;_

Permite somente caracteres numricos para a posio e o uso dos sinais de - ou +, no-obrigatrios. Ex:
###;1;_

Utilizado como separador de horas, minutos e segundos.

Utilizado como separador de dia, ms e ano.

175

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Exemplos de Mscaras:
Tipo
Telefone
CEP
Hora

Mscara
!\(999\)000-0000;1;_
00000\-9999;0;_
!90:00:00 >LL;0;_

Entrada
0613873350
73015020
100043PM

176

Formatao
(061)3873350
73015-020
10:00:43 PM

Sada
(061)387-3350
73015020
22:00:43

Apndice F

Trabalhando com Importao e Exportao


A importao e exportao de arquivos no Delphi pode ser realizada sem problemas
quando se tratar de tabelas em formatos padro para o Delphi (Paradox, dBase, Oracle, Sybase,
ODBC, etc) o quase problema era se tratando de exportao para arquivos no formato .TXT,
quase porque ele ser resolvido a partir deste aplicativo.
1. Crie um novo projeto. Grave a unidade padro como fExpImp e o projeto como
ExpImp.
2. Coloque os seguintes objetos e faa as seguintes alteraes:

Para o Objeto Table (Localizado na pgina Data Access)

Propriedades

Configurao

DataBaseName

DbDemos

TableName

EMPLOYEE

Para o Objeto OpenDialog1 (Localizado na pgina Dialogs)

Propriedades

Configurao

DefaultExt

TXT

Filter

Arquivo Texto|*.TXT

Para o Objeto SaveDialog1 (Localizado na pgina Dialogs)

Propriedades

Configurao

DefaultExt

TXT

Filter

Arquivo Texto|*.TXT

Para o Objeto Button (Localizado na pgina Standard)

Propriedades

Configurao

Caption

&Exporta

Name

ButExporta

Para o Objeto Button (Localizado na pgina Standard)

Propriedades

Configurao

Caption

&Importa

Name

ButImporta

O maior trabalho da codificao ficaria por conta de criar janelas de Salvar e Abrir mas
todo esse trabalho realizado pelos objetos OpenDialog e SaveDialog. O resto do cdigo bem
simples vejamos:

Para o evento OnClick do objeto ButExporta

177

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

procedure TForm1.ButExportaClick(Sender: TObject);


var
Arq: TextFile;
begin
if SaveDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
with Table1 do
begin
Open;
First;
if not EOF then
begin
AssignFile(Arq, SaveDialog1.FileName);
ReWrite(Arq);
repeat
WriteLn(Arq,FieldByName('EmpNo').AsString + '|' +
FieldByName('LastName').AsString + '|' +
FieldByName('FirstName').AsString + '|' +
FieldByName('PhoneExt').AsString + '|' +
FieldByName('HireDate').AsString + '|' +
FieldByName('Salary').AsString + '*');
next;
until EOF;
CloseFile(Arq);
end;
close;
end;
Screen.Cursor := crDefault;
end;
end;

Inicialmente vamos exportar o arquivo (no caso Employee), o funo do comando


AssignFile e iniciar um objeto de arquivo texto (determinada pelo tipo de varivel TextFile) e o
comando ReWrite prepara o objeto iniciado para a gravao. Lembre-se que um arquivo texto s
pode receber logicamente texto definido pelos comandos Write (insere um texto em determinado
arquivo e o cursor de gravao permanece na posio) e WriteLn (insere um texto em
determinado arquivo e o cursor de gravao inicia uma nova linha) ento o nico trabalho ser de
percorrer o nosso arquivo com o comando Repeat.

Para o evento OnClick do objeto ButImporta

procedure TForm1.ButImportaClick(Sender: TObject);


var
Arq: TextFile;
Texto: String;
I: Integer;
function MontaVariavel: String;
var
monta: String;
begin
monta := '';
inc(I);

178

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

while Texto[I] <> '*' do


begin
if Texto[I] = '|' then
break;
monta := monta + Texto[I];
inc(I);
end;
result := monta;
end;
begin
if OpenDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
Table1.Open;
AssignFile(Arq, OpenDialog1.FileName);
Reset(Arq);
if not EOF(Arq) then
repeat
ReadLn(Arq,Texto);
with Table1 do
begin
Insert;
i := 0;
FieldByName('EmpNo').AsString := MontaVariavel;
FieldByName('LastName').AsString := MontaVariavel;
FieldByName('FirstName').AsString := MontaVariavel;
FieldByName('PhoneExt').AsString := MontaVariavel;
FieldByName('HireDate').AsString := MontaVariavel;
FieldByName('Salary').AsString := MontaVariavel;
Post;
end;
until EOF(Arq);
CloseFile(Arq);
Table1.Close;
Screen.Cursor := crDefault;
end;
end;

Vamos agora importar o arquivo (no caso Employee), o funo do comando AssignFile e
inicar um objeto de arquivo texto (determinada pelo tipo de varivel TextFile) e o comando
Reset prepara o objeto iniciado para a gravao. Os comandos de leitura so Read (L um
caractere de determinado arquivo) e ReadLn (L uma linha de determinado arquivo) ento o
trabalho agora ser de separar em pedaos a linha lida isto realizado na funo MontaVariavel
que ler pedaos demarcados do arquivo exportado.

179

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

Apndice G

Doze melhores dicas para o Delphi


Neste ltimo apndice do trabalho reservei uma coisa especial, pesquisei em todos os
documentos tipo Tips & Tricks (Dicas e Truques) e encontrei um documento que falava sobre as
onze melhores dicas para o Delphi.
Autor: Paul Harding [email protected] (algumas foram alteradas)
1. Como fazer para o computador soar o beep:
messageBeep(0);

2. Como pausar um programa por determinado nmero de segundos:


var
NumSec: SmallInt;
StartTime: LongInt;
begin
StartTime := Now;
repeat
Application.ProcessMessages;
until Now > StartTime + NumSec * (1/24/60/60);
end;

3. Como mostrar o mouse como uma ampulheta (e depois retorn-lo ao normal):


try
Screen.Cursor := crHourGlass;
{ Escreva o ao a executar aqui }
finally
Screen.Cursor := crDefault;
end;
Application.ProcessMessages;

4. Como controlar o pressionamento da tecla <Enter>:


procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
{ atravs do evento onKeyPress do formulrio de controle... }
begin
{ se a var Key retornar o cdigo #13 corresponde a <Enter>, #9 corresponde a tecla TAB }
if Key = #13 then
begin
Key := #0 { Suprime o som }
{ escreva aqui os seus comandos }
end;
end;

5. Como modificar a cor do texto dentro de um campo DBGrid dependendo do contedo:


procedure TForm1.DBGridDrawDataCell(Sender: TObject; const Rect: TRect; Field: Tfield; State:
TGridDrawState);
begin
if Table1Client.AsString = XXXX then
begin
DBGrid.Canvas.Brush.Color := clRed;
DBGrid.Canvas.Font.Color := clSilver;
DBGrid.Canvas.FillRect(Rect); { Desenha o pano de fundo }
DBGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+1, Field.AsString);
end;
end;

180

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

6. Como chamar um outro programa (tipo o notepad do Windows ) a partir de um aplicativo


(de trs maneiras diferentes: normal, maximizado e minimizado):
WinExec(C:\windows\notepad.exe, SW_SHOWNORMAL);
WinExec(C:\windows\notepad.exe, SW_SHOWMAXIMIZED);
WinExec(C:\windows\notepad.exe, SW_SHOWMINIMIZED);

7. Como varrer uma tabela inteira:


Table1.First;
if not Table1.Eof then
repeat
{ seus comandos para a tabela }
Table1.Next
until Table1.Eof;

8. Como interceptar as teclas de funo:


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_F5 then
ShowMessage(Voc pressionou a F5);
end;
{ pode ser usado da VK_F1 a VK_F12 }

9. Como os valores de campos de uma tabela para outra:


{ Este exemplo copia apenas tabelas de mesma estrutura }
var
Num: SmallInt;
begin
for Num := 0 to TabelaOrigem.FieldCount - 1 do
begin
TabelaDestino.Insert;
TabelaDestino.Fields[Num].Assign(TabelaOrigem.Fields[Num]);
TabelaDestino.Post;
end;
end;

10. Como verificar se um campo inteiro par ou mpar:


function TestaParaPar(TestaInteiro : Integer) : boolean;
begin
if (TestaInteiro div 2) = (TestaInteiro/2) then
result := True
else
result := False;
end;

11. Como verificar se uma string contm um inteiro:


function IsInteger(TestaString: String) : boolean;
begin
try
StrToInt(TestaString);
except
On EConvertError do result := False;
else
result := True;
end;
end;

12. Como subtrair datas:


function SubData(DataEmprestimo: TDataTime) : Integer;
begin
result := Date - DataEmprestimo;
end;

181

Borland

Delphi e Delphi Client/Server

Desvendando o Caminho das Pedras

182

Você também pode gostar