Bíblia Delphi
Bíblia Delphi
Bíblia Delphi
Fernando Anselmo
Borland
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
CAPTULO I
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
36
37
37
38
38
40
40
41
CAPTULO IV
43
43
43
43
46
47
48
50
50
51
52
54
CAPTULO V
57
57
57
58
58
58
59
60
61
62
63
64
65
65
66
66
68
68
71
74
CAPTULO VI
77
77
77
79
79
81
82
83
84
87
iv
Borland
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
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
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
171
APNDICE D
173
Imprimindo um Formulrio
173
APNDICE E
175
175
APNDICE F
177
177
APNDICE G
180
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
Mas o que possvel fazer com ele ? possvel criar, dentre outros, os seguintes tipos de
aplicaes em Delphi :
Borland
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;
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
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
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
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
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
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
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
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
Adicionais
+, -, or, xor
Relacionais
12
Borland
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.
Equivalente a Form1.Caption
Equivalente a Form1.BorderStyle
Valor de Retorno
Low
Primeiro elemento
High
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
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;
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
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;
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
15
Borland
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;
Procedure
procedure {cabealho}; var {declarao das variveis}; {bloco de comandos};
Function
function {cabealho} : {resultado}; var {declarao das variveis}; {bloco de comandos};
16
Borland
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
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;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
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;
18
Borland
var
Form1: TForm1;
implementation
{$R *.DFM}
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
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.
var
fCores: TfCores;
implementation
{$R *.DFM}
Aqui no !!!
end.
20
Borland
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
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
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
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
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
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
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
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:
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
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
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
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.
30
Borland
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
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
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
34
Borland
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
35
Borland
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.
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.
36
Borland
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.
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.
37
Borland
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.
Para a base dBase a nica diferena seria o comando Default Driver: DBASE.
Encerre o Database Engine Configuration.
38
Borland
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
NOM_AUTOR
40
TMP_MUSICA
localizado no
40
Borland
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);
41
Borland
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.
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.
42
Borland
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.
Foi criado neste momento o objeto MainMenu1 derivado da classe de objeto TMainMenu,
a partir deste objeto vamos criar nosso menu:
43
Borland
Arquivo
Tabela
Categoria
Cadastro
Sair
Consulta
Relatrio
Auxlio
CDs
Geral
Sobre o sistema
Capa do CD
Contedo
Configura Impressora
Tpicos de Ajuda
Ctrl+X
Saia da janela Menu Designer digitando Alt+F4, o menu j existe no objeto form1.
Propriedade
Valor
Descrio
BorderStyle
Single
Caption
44
Borland
Color
clMenu
Name
F_Menu
WindowsState
wsMaximized
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
Alignment
taLeftJustify
45
Borland
BevelInner
bvLowered
BevelOuter
bvLowered
BorderWidth
Tamanho da borda
Caption
Label do objeto
Name
LinhaStatus
Nome do objeto
Font
22
Altura do objeto
Height
Clique no boto
Editor.
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:
46
Borland
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
Teste as opes do menu, veja na linha de Status os hints informados, saia com Alt+F4.
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.
47
Borland
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.
48
Desabilita o auxlio
Borland
end;
Rode o projeto e teste as opes do menu, saia com Ctrl+X ou utilize o comando Sair.
Dados
Ao
HELP_CONTEXT
HELP_CONTENTS
HELP_SETCONTENTS
HELP_CONTEXTPOPUP
HELP_KEY
HELP_PARTIALKEY
HELP_MULTIKEY
HELP_COMMAND
HELP_SETWINPOS
HELP_FORCEFILE
HELP_HELPONHELP
HELP_QUIT
49
Borland
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:
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.
Propriedade
Valor
Descrio
Caption
Sobre o sistema
Name
F_Sobre
Valor
Descrio
Picture
Objeto imagem
Valor
Descrio
Caption
CDDA
Label do objeto
Font
Valor
Descrio
Caption
Label do objeto
Font
Valor
Copyright
Descrio
Label do objeto
Tipo de letra a ser mostrada no objeto
Valor
Descrio
Caption
Label do objeto
50
Borland
Font
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
Hint
ShowHint
True
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 _).
51
Borland
{$R *.DFM}
uses
fSobre;
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.
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.
52
Borland
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.
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
Borland
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.
Propriedade
Valor
Descrio
AliasName
AliasDisco
Nome do Sinnimo
DataBaseName
BaseDisco
Name
DBDisco
Nome do objeto
Clique no boto
(Toggle Form/Unit) da SpeedBar, at voc alternar para a Code
Editor e localize o procedimento FormCreate associado ao evento OnCreate:
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
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
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
56
Borland
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.
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.
3.
4.
Campos a serem inseridos
57
Borland
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
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.
58
Borland
voc poder usar duplicaes da mesma tabela, sem que isso afete a integridade de seu banco de
dados.
Propriedade
Valor
Descrio
DisplayLabel
Sigla
Required
True
EditMask
>AA;0;_
59
Borland
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:
60
Borland
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;
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
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:
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
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
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.
64
Borland
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):
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.
65
Borland
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.
Valor
Descrio
66
Borland
Align
alBottom
Caption
Height
41
Altura do objeto
Os botes que criaremos faro duas funes: 1.Sair da janela e 2.Localizao rpida de
um determinado registro.
, encontrado na
Valor
Descrio
Kind
bkClose
Caption
&Fechar
Label do objeto
Font
Height
25
Altura
Hint
Left
312
Alinhamento a esquerda
Name
ButFechar
Nome do objeto
ShowHint
True
Width
89
Tamanho do objeto
Valor
Descrio
Caption
&Localizar
Label do objeto
Font
Glyph
Height
25
Altura do objeto
Hint
Left
24
Alinhamento a esquerda
Name
ButLocalizar
Nome do objeto
ShowHint
True
Font
Width
89
Tamanho do objeto
67
Borland
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.
Este tempo com base em uma mquina 486 DX2 com 8 Mb de memria.
68
Borland
69
Borland
implementation
{$R *.DFM}
uses
FMenu,
DMModelo;
Inicio do procedimento
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:
70
Borland
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;
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;
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:
71
Aqui
Aqui
Borland
Aqui
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;
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
var
ObjPesquisa: String;
begin
if CriticaEdicao('localizar' ) then
Exit;
...
end;
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;
Elimine
var
F_Categ: TF_Categ;
73
Borland
...
...
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
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 }
74
Borland
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;
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
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.
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.
77
Borland
3.
4.
Campos a serem inseridos
Boto >>
Boto Next
5.
6.
Posio dos Labels
Left - A esquerda
Boto Next
8.
7.
9.
10.
78
Borland
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.
objeto DataSource
, encontrado na Component Palette pgina Data Access, e altere
as seguintes propriedades:
Para o objeto Table1 (J existente):
Propriedade
Valor
Descrio
DatabaseName
TableName
BASICO
Name
TabBasico
Nome do objeto
IndexFieldNames NOM_DISCO
Valor
Descrio
DataSet
TabBasico
Name
DSBasico
Nome do objeto
Valor
Descrio
DatabaseName
BaseDisco
79
Borland
TableName
MUSICA
Name
TabMusica
Nome do objeto
IndexFieldNames COD_DISCO
MasterSource
DSBasico
MasterFields
COD_DISCO
Valor
Descrio
DataSet
TabMusica
Name
DSMusica
Nome do objeto
Valor
Descrio
DatabaseName
BaseDisco
TableName
BASICO
Name
TabBasicoConf
Nome do objeto
IndexFieldNames NOM_DISCO
ReadOnly
True
Valor
Descrio
DatabaseName
BaseDisco
TableName
CATEGOR
Name
TabCategor
IndexFieldNames SIG_CATEG
MasterSource
DSBasico
MasterFields
SIG_CATEG
ReadOnly
True
Valor
Descrio
DataSet
TabCategor
Name
DSCategor
Nome do objeto
Valor
Descrio
DatabaseName
BaseDisco
TableName
CATEGOR
Name
TabCategorConf
Nome do objeto
IndexFieldNames SIG_CATEG
ReadOnly
True
80
Borland
Propriedade
Valor
Descrio
DatabaseName
BaseDisco
Name
QryContador
Nome do Objeto
SQL
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.
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
Controlando o DataModule
Agora falta o cdigo, note que a maior parte uma repetio daquilo que j vimos
anteriormente:
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:
82
Borland
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:
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 }
83
Borland
end;
end;
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:
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;
84
Borland
85
Borland
fMenu;
{ Menu Principal }
86
Borland
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.
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.
Borland
Valor
Descrio
Caption
&Msicas
Label do objeto
Font
Glyph
[DiretrioDelphi]\IMAGES\BUTTON
S\CDDRIVE.BMP
Height
25
Altura do objeto
Hint
Name
ButMusica
Nome do objeto
ShowHint
True
Width
89
Tamanho do objeto
Exclua o label (objeto Label1) e o campo (objeto EditCOD_DISCO) que faz referncia ao
COD_DISCO.
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
88
Borland
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.
Propriedade
Valor
Descrio
Caption
&Msicas:
Label do objeto
Font
FocusControl
DBGrid1
Controle do foco
Propriedade
Valor
Descrio
DataSource
DM_Basico.DSBasico
DataSource vinculado
DataField
TIP_DISCO
Campo de tabela
Font
Hint
Selecione o tipo
Items
Name
ComboTIP_DISCO
Nome do objeto
ShowHint
True
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:).
Modificando a Janela
89
Borland
Propriedade
Valor
Descrio
DataSource
DM_Basico.DSCategor
DataSource vinculado
DataField
DES_CATEG
Campo de tabela
Font
Valor
Descrio
Glyph
Height
25
Altura do objeto
Hint
Name
ButPaste
Nome do objeto
ShowHint
True
Width
25
Tamanho do objeto
Valor
Descrio
Glyph
Height
25
Altura do objeto
Hint
Name
ButLocCateg
Nome do objeto
ShowHint
True
Width
25
Tamanho do objeto
Valor
Descrio
Glyph
Height
25
Altura do objeto
Hint
90
Borland
categoria
Name
ButInsCateg
Nome do objeto
ShowHint
True
Width
25
Tamanho do objeto
na propriedade Glyph.
nome
proposto
91
Borland
Valor
Descrio
Font
Hint
Msicas deste CD
Options
Opes de controle
ShowHint
True
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
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:
public
procedure inicio;
end;
var
F_Basico: TF_Basico;
implementation
{$R *.DFM}
procedure TF_Basico.Inicio;
begin
DM_Basico := TDM_Basico.Create(Application);
Screen.Cursor := crDefault;
ShowModal;
end;
93
Borland
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 }
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
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
uses
DMBasico, { Referncia ao DataModule }
fMenu,
{ Menu Principal do Sistema }
Dialogs;
{ Gerente de Mensagens }
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.
95
Borland
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:
Valor
Descrio
Filter
Arquivos bitmap|*.BMP
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:
96
Borland
Propriedade
Valor
Descrio
DatabaseName
BaseDisco
TableName
MUSICA
Name
TabMusicaConf
Nome do objeto
IndexFieldNames Cod_Disco;Num_Faixa
ReadOnly
Somente leitura
True
Repare no uso do comando GotoKey ao invs do comando FindKey, ele foi utilizado
por se tratar de uma chave composta.
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
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
end;
Deixe apenas o boto Fechar;
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
Borland
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 }
No preciso se preocupar com a gravao para o campo COD_DISCO, isto ser feito
automaticamente pelo Delphi, mantendo a integridade referencial.
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
ShowModal
Free;
end;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
{ Referncia ao DataModule }
{ Menu Principal do Sistema }
{ Gerente de Mensagens }
{ Cadastro de Categorias }
{ Cadastro de Msicas }
100
Borland
end
else
begin
if DBDisco.IsSQLbased then
DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
end;
Seno
Faz a segunda parte
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;
101
Borland
...
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).
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 }
102
Borland
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
DMBasico,
fMenu,
Dialogs,
fCateg,
fMusica;
{ Referncia ao DataModule }
{ Menu Principal do Sistema }
{ Gerente de Mensagens }
{ Cadastro de Categorias }
{ Cadastro de Msicas }
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
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.
Propriedade
Valor
Descrio
BorderStyle
bsDialog
Caption
Pesquisa Categoria
Name
F_SelCate
Nome do objeto
Position
poScreenCenter
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
Propriedade
Valor
Descrio
DataSource
DM_Modelo.DSCategor
Hints
Left
Posio a esquerda
ShowHint
True
VisibleButtons
Botes visveis
Top
Distncia do topo
Width
113
Largura do objeto
Valor
Descrio
DataSource
DM_Modelo.DSCategor
DataSource vinculado
Font
Left
Posio esquerda
Height
145
Altura do objeto
Options
[dgTitles, dgIndicator,
dgColLines, dgRowLines,
dgRowSelect,
dgAlwawsShowSelection]
TitleFont
Top
48
Distncia do topo
Width
375
Largura do objeto
Valor
Descrio
Font
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;_
Valor
Descrio
Caption
Sigla:
Label do objeto
Focus
EdtTrecho
Font
Left
Alinhamento a esquerda
Top
201
Distncia do topo
107
Borland
Valor
Descrio
Kind
bkOK
Caption
&OK
Label do objeto
Font
Height
25
Altura do objeto
Hint
Confirma a pesquisa
Left
16
Alinhamento a esquerda
Name
ButOk
Nome do objeto
ShowHint
True
Spacing
30
Top
248
Distncia do topo
Width
89
Largura do objeto
Valor
Descrio
Kind
bkCancel
Caption
&Cancela
Label do objeto
Font, Height,
ShowHint, Top e
Width
Hint
Abandona a pesquisa
Left
288
Alinhamento esquerda
Name
ButCancela
Nome do objeto
Spacing
Width
89
Largura do objeto
Valor
Glyph
Hint
ShowHint
True
Name
ButPesquisa
Nome do objeto
Left e Top
Descrio
108
Borland
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:
O comando Try foi utilizado para prevermos qualquer possibilidade de erro durante a
execuo da pesquisa.
109
Borland
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;
Incio do procedimento
Se o DataModule no estiver criado
Cria o DataModule
Localiza o valor da string enviada
110
Borland
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;
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
111
Borland
end;
F_SelCate := TF_SelCate.Create(Application);
F_SelCate.vCria := True;
F_SelCate.CampTrecho := EditSIG_CATEG.Text;
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 }
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
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
On [tipo de exceo] do [declarao] - em conjunto com o bloco try...except define o cdigo para executar um bloco
de exceo.
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.
Vamos criar um formulrio idntico a este que servir para a montagem dos filtros:
Propriedade
Valor
Descrio
BorderStyle
bsDialog
Caption
Define Filtros
Label do objeto
114
Borland
Name
F_Filtro
Nome do objeto
Position
poScreenCenter
Posio do objeto
Valor
Descrio
Caption
Nome do objeto
Font
Valor
Descrio
Name
CBCampo
Nome do objeto
Font
Items
Contedo do objeto
Style
csDropDown
Estilo do objeto
Text
Valor
Descrio
Name
CBCriterio
Nome do objeto
Font
Items
Style
csDropDown
Estilo do objeto
Text
Valor
Descrio
Name
EditCompara
Nome do objeto
Font
Text
Borland
Propriedade
Valor
Descrio
Glyph
Hint
ShowHint
True
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
Descrio
Hint
Pesquisa Categoria
ShowHint
True
Name
ButConsulta
Nome do objeto
Visible
False
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
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
Cor do objeto
Ctl3D
False
Possui desenho em 3D
Font
Name
FiltroVe
Nome do objeto
ReadOnly
True
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
116
Borland
Valor
Descrio
Name
ButE
Nome do objeto
Glyph
Font
Hint
Um e Outro
ShowHint
True
Caption
&E
Label do Objeto
Enabled
False
Valor
Descrio
Name
ButOu
Nome do objeto
Glyph
Font
Hint
Um ou Outro
ShowHint
True
Caption
O&u
Label do Objeto
Enabled
False
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
Font
Hint
ShowHint
True
Caption
&Limpar
Label do Objeto
Enabled
False
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
Kind
bkOK
Name
ButOK
Nome do objeto
Font
Hint
ShowHint
True
Caption
&OK
Label do Objeto
Enabled
False
BitBtn (encontrado na pgina Additional) - boto que servir para abandonar o filtro,
altere as seguintes propriedades:
Propriedade
Valor
Descrio
Kind
bkCANCEL
Name
ButCancela
Nome do objeto
Font
Hint
ShowHint
True
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] :
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
Borland
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + cbCriterio.Text + '''' + EditCompara.Text + ''')';
FiltroVe.Text := FiltroVe.Text + cbCampo.Text + ' ' +
cbCriterio.Text + ' ' + EditCompara.Text;
Acerta o filtro
Reseta os trs campos envolvidos
cbCampo.ItemIndex := -1;
cbCriterio.ItemIndex := -1;
EditCompara.Text := '';
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:
Altera os filtros
Habilita os campos de edio
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
119
Borland
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:
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;
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
120
Borland
Necessitamos agora criar uma varivel comum que devolver o cdigo SQL para a tela
secundria:
private
function GetSQL: TEdit;
public
property SQLString : TEdit read GetSQL;
end;
var
F_Filtro: TF_Filtro;
implementation
{$R *.DFM}
uses
fSelCate;
121
Borland
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
{$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
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
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.
Vamos criar um formulrio idntico a este que servir para o gerenciamento do filtro:
Propriedade
Valor
Descrio
BorderStyle
bsDialog
Caption
Label do objeto
Name
F_ConDisc
Nome do objeto
125
Borland
Position
poScreenCenter
Posio do objeto
Propriedade
Valor
Descrio
DatabaseName
AliasDisco
TableName
BASICO.DBF
Name
TabBasico
Nome do objeto
IndexFieldNames NOM_DISCO
Valor
Descrio
DataSet
TabBasico
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
SQL
Name
QryBasico
Nome do objeto
Valor
Descrio
DataSource
DSBasico
DataSource associado
VisibleButtons
Botes visveis
Hints
ShowHint
True
Valor
Descrio
Name
ButAtivaDesativa
Nome do objeto
Glyph
Hint
Ativa/Desativa o filtro
ShowHint
True
GroupIndex
126
Borland
AllowAllUp
True
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
Glyph
Hint
Montagem do Filtro
Name
ButFiltrar
Nome do objeto
ShowHint
True
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
Glyph
Hint
Name
ButEditar
Nome do objeto
ShowHint
True
BitBtn (encontrado na pgina Additional) - boto que servir para editar o filtro, altere as
seguintes propriedades:
Propriedade
Valor
Descrio
Kind
bkClose
Name
ButFechar
Nome do objeto
Font
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
Name
dbGridBasico
Nome do objeto
Font
Options
Opes do Grid
TitleFont
127
Borland
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)
private
{ Private declarations }
public
procedure Inicio;
end;
var
F_ConDisc: TF_ConDisc;
implementation
{$R *.DFM}
uses
fFiltro,
fEdtDisc;
procedure TF_ConDisc.Inicio;
begin
TabBasico.Open;
ShowModal;
end;
Inicia a tabela
Mostra o formulrio em modo modal
Limpa a Query
Adiciona o novo filtro na Query
Cdigo para o boto Editar, quando for marcado um registro para visualizao geral.
128
Borland
Cdigo para o boto Ativa ou Desativa o filtro, para prender ou liberar o filtro.
1. D um duplo clique no objeto butAtivaDesativa:
Salve o formulrio.
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
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;
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
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
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.
Informix
SQLBase
Btrieve
InterBase
Sybase
DB2
ORACLE
Teradata
dBase
Paradox
Arquivo .TXT
Excel
Raima
Unify
FoxPro
AS/400
Watcom SQL
INGRES
SQL Server
132
Borland
133
Borland
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.
12. Confirme o relatrio pressionando o boto Done. Informe os dados iniciais e finais e
aguarde a gerao do relatrio.
134
Borland
135
Borland
Criaremos agora uma janela simples de dilogo, onde selecionaremos um cdigo inicial e
final para os cdigos do CD.
Propriedade
Valor
Descrio
BorderStyle
bsDialog
Caption
Label do objeto
Name
F_DgGeral
Nome do objeto
Position
poScreenCenter
Posio do objeto
Propriedade
Valor
Descrio
Caption
Label do objeto
Font
BitBtn (Localizado na pgina Additional) - crie dois botes para confirmar ou cancelar a
emisso do relatrio:
Propriedade
Valor
Descrio
Kind
bkOk e bkCancel
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
136
Borland
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;
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
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;
138
Borland
Propriedade
Valor
Descrio
BorderStyle
bsNone
Caption
Name
F_Capa
Nome do objeto
Position
poScreenCenter
BorderIcons
[]
Color
clWhite
Cor de fundo
Propriedade
Valor
Descrio
DatabaseName
BaseDisco
TableName
BASICO.DB
IndexFieldNames
COD_DISCO
Name
TabBasico
Nome do objeto
ReadOnly
True
Valor
Descrio
DataSet
TabBasico
Name
DSBasico
Nome do objeto
Valor
Descrio
DataSource
DSBasico
DataField
FOT_CAPA
Height
457
Largura
139
Borland
Strech
True
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.
Criando o Cdigo
O cdigo para este formulrio e sua chamada a partir do menu principal bem mais
simples que o realizado anteriormente, verifique:
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.
140
Borland
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.
QuickReport
QRBand
141
Borland
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
QRDetailLink
O componente QRDetailLink usado para criar diferentes tipos de detalhes.
QRLabel
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
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
SQL
Params
Parmetro da consulta
Name
QryBasico
Nome do objeto
Valor
Descrio
DataSet
QryBasico
Name
DSBasico
Nome do objeto
Propriedade
Valor
Descrio
DataSource
DsBasico
Name
QrConfere
Nome do objeto
ReportTitle
Cadastro de CDs
Ttulo do Relatorio
Propriedade
Valor
Descrio
BandType
rbPageHeader
Name
bdCabecalho
Nome do objeto
Color
clNavy
Cor da Banda
Propriedade
Valor
Descrio
AlignToBand
True
AutoSize
True
Data
qrsReportTitle
Font
Fonte do objeto
Alignment
taCenter
Alinhamento do objeto
143
Borland
Propriedade
Valor
Descrio
AlignToBand
True
AutoSize
True
Data
qrsDateTime
Font
Fonte do objeto
Alignment
taRightJustify
Alinhamento do objeto
Propriedade
Valor
Descrio
BandType
rbColumnHeader
Name
bdCabColuna
Nome do objeto
Color
clNavy
Cor da Banda
LinkBand
bdCabecalho
Banda de depndencia
Propriedade
Valor
Descrio
Caption
Cdigo
Label do objeto
Font
Fonte do objeto
Propriedade
Valor
Descrio
Caption
Nome
Label do objeto
Font
Fonte do objeto
Propriedade
Valor
Descrio
Caption
Tipo
Label do objeto
Font
Fonte do objeto
Propriedade
Valor
Descrio
Caption
Categoria
Label do objeto
Font
Fonte do objeto
Propriedade
Valor
Descrio
BandType
rbDetail
Name
bdDetalhe
Nome do objeto
LinkBand
bdCabColuna
Banda de depndencia
144
Borland
Propriedade
Valor
Descrio
AutoSize
True
DataSource
DsBasico
DataSource vinculado
DataField
Cod_Disco
Campo vinculado
Propriedade
Valor
Descrio
AutoSize
True
DataSource
DsBasico
DataSource vinculado
DataField
Nom_Disco
Campo vinculado
Propriedade
Valor
Descrio
AutoSize
True
DataSource
DsBasico
DataSource vinculado
DataField
Tip_Disco
Campo vinculado
Propriedade
Valor
Descrio
AutoSize
True
DataSource
DsBasico
DataSource vinculado
DataField
Des_Categ
Campo vinculado
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
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.
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
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:
147
Borland
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:
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:
148
Borland
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:
149
Borland
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:
O Delphi no reconhece estas diretivas de mensagem, mas ele converte para constantes
do tipo:
150
Borland
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;
mci_Mode_Not_Ready
mci_Mode_Stop
mci_Mode_Play
mci_Mode_Record
mci_Mode_Seek
mci_Mode_Pause
mci_Mode_Open
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
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;
Quando for selecionar um novo arquivo, afaste um pouco a janela de dilogo e observe
como esto os campos edit.
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
Caption
CD Player
Name
F_Player
Nome do objeto
Position
poScreenCenter
TMediaPlayer
seguintes propriedades:
Propriedade
Valor
Descrio
VisibleButtons
Name
CD
Nome do objeto
152
Borland
TTimer
, encontrado na Component Pallety na pgina System, servir para controlar
o tempo das msicas.
Panel
propriedades:
Propriedade
Valor
Descrio
Align
alBottom
Alignment
taLeftJustify
BevelInner
bvLowered
BevelOuter
bvLowered
BorderWidth
Tamanho da borda
Caption
Insira o CD
Label do objeto
Name
LinhaStatus
Nome do objeto
Font
22
Altura do objeto
Height
Panel
propriedades:
Propriedade
Valor
Descrio
Align
alTop
BevelInner
bvLowered
BevelOuter
bvRaise
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
154
Borland
const
ModeStr: array[TmpModes] of string[10] = ('No Lido', 'Parado', 'Tocando',
'Gravando', 'Pesquisando', 'Pausado', 'Aberto');
155
Borland
156
Borland
157
Borland
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 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
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
159
Borland
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Custom', [CustComp1]);
end;
end.
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
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
begin
Result := fDemoProp;
end;
Na seo private crie uma nova varivel com base no tipo definido:
private
fDemoProp:Integer;
fNovaProp:TDirecao;
162
Borland
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
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
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
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:
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
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:
caso faz-se necessria a instalao do ACROBAT Reader 2.0 que acompanha o produto).
Hardware/Software requeridos
O Delphi Client/Server requer:
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:
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
169
Borland
Tamanho
Preciso
Descrio
BLOB
Varivel
No apresenta
CHAR(n)
n Caracteres
1 at 32767
DATE
64 bits
1 jan 100 at 11
jan 5941
DECIMAL
(preciso, escala)
varivel
Preciso: 1 at
15 e escala de 1
at 15
DOUBLE
PRECISION
64 bits
1,7 x 10-308 at
1,7 x 10308
FLOAT
32 bits
3,4 x 10-38 at
3,4 x 1038
INTEGER
32 bits
-2.147.483.648
at
2.147.483.648
NUMERIC
(preciso, escala)
varivel
Preciso: 1 at
15 e escala de 1
at 15
SMALLINT
16 bits
-32.768 at
32.767
Campo mdio.
VARCHAR(n)
n Caracteres
1 at 32767
170
Apndice C
171
Borland
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;
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
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
Utilizao na mscara
Causa a digitao da mscara fique parada no primeiro caracter, fazendo com que os caracteres digitados
que se movam. Ex: !;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;_
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;_
175
Borland
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
Propriedades
Configurao
DataBaseName
DbDemos
TableName
EMPLOYEE
Propriedades
Configurao
DefaultExt
TXT
Filter
Arquivo Texto|*.TXT
Propriedades
Configurao
DefaultExt
TXT
Filter
Arquivo Texto|*.TXT
Propriedades
Configurao
Caption
&Exporta
Name
ButExporta
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:
177
Borland
178
Borland
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
Apndice G
180
Borland
181
Borland
182