Escolar Documentos
Profissional Documentos
Cultura Documentos
Fernando Anselmo
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 i
INTRODUO 7
Delphi, como Soluo para Desenvolvedores 7
CAPTULO I 9
Conceito de Programao Orientada a Objeto 9
Orientao a Objeto 9
Object Pascal 10
Smbolos Especiais 10
Palavras Reservadas 11
Nmeros 12
Constantes 12
Expresses 12
Identificadores 13
Declaraes 14
Blocos de Procedimentos ou Funes 16
Caractersticas de Objetos 17
Programando com objetos Delphi 18
Renomeando os objetos e os componentes 20
CAPTULO II 21
Conhecendo o Delphi 21
Elementos Visveis 21
Form 22
Code Editor 23
Component Palette 23
Object Inspector 24
SpeedBar 24
Elementos no Visveis 24
Project Manager 25
Menu Designer 25
Fields Editor 26
Repositrio de Objetos 27
Estrutura de Aplicaes com o Delphi 2.0 28
Implementao efetiva 29
Objetos Data Module 29
Dicionrio de Dados Escalvel 30
Herdando os Formulrios 31
Ferramentas Auxiliares de SQL 32
Monitor SQL 32
SQL Explorer 33
InterBase NT - Banco de Dados Relacional 34
CAPTULO III 35
Projeto Piloto 35
iii
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Criando o Modelo Relacional 36
Trabalhando com DataBase Engine Configuration 37
Criando o Alias 37
Trabalhando com DataBase DeskTop 38
Criando o Banco de Dados via Estrutura 38
Criando os Relacionamentos via Estrutura 40
Criando o Banco de Dados via SQL 40
Observaes da utilizao do SQL com o dBase 41
CAPTULO IV 43
Trabalhando com o Menu 43
Metendo a Mo na Massa 43
Criando a janela do menu 43
Inserindo os Cdigos Iniciais 46
Iniciando os comandos do Menu 47
Colocando os comandos para o Auxlio 48
Criando a janela Sobre o Sistema 50
Criando e alterando os objetos 50
Associando o form Sobre o Sistema ao menu 51
Criando a janela Splash 52
Criando o acesso a Base de Dados 54
CAPTULO V 57
Janela para as Tabelas 57
Reabrindo o seu Projeto 57
Alterando as Janelas Criadas 58
DataModules ? 58
Modificando as Tabelas e as Ligaes 58
Alterando os campos da tabela 59
Codificando o DataModule 60
Controlando a duplicao dos Campos-Chave 61
Finalizando o DataModule 62
Alterando o Formulrio 63
Modificando os Labels e Campos 64
Objeto DBNavigator 65
Modificando os Paineis 65
Modificando a Janela 66
Criando o terceiro Painel 66
Programando no formulrio 68
Preservando as reas de Memria 68
Criando Funes Globais 71
Alterando o Menu para receber o formulrio 74
CAPTULO VI 77
Trabalhando com janela Pai X Filha 77
Criando a janela automaticamente 77
Sobre os DataModules 79
Trabalhando com as Tabelas 79
Trabalhando com os Campos 81
Controlando o DataModule 82
Contadores 83
Validando os Campos 84
Alterando a Janela Criada 87
iv
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Organizando os Panels 87
Modificando os campos e Labels 88
Organizando os Panels 88
Modificando a Janela 89
Trabalhando com Grids 91
Finalmente, a programao 93
Consulta 94
Trabalhando com a rea de Transferncia 96
Utilizando o objeto OpenDialog 96
Criando o formulrio para o cadastro das msicas 97
Criando novos Procedimentos Globais 100
Alterando o Menu para receber o formulrio 102
CAPTULO IX 146
Multimdia 146
O que multimdia ? 146
Delphi and Multimedia 147
Objeto TMediaPlayer 147
Colocando as propriedade em modo Runtime 148
Pesquisando variveis em modo RunTime 149
Inserindo o multimdia para o Sistema 152
Desenvolvimento do CD Player 152
CAPTULO X 158
v
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Novos Componentes 158
Criando Componentes 158
A Classe TComponent 159
Um Componente Simples 159
Adicionando o Componente a Palheta 160
Criando Propriedades 161
Mtodos de Acesso 161
Criando novos tipos 162
Pensando em Objetos 163
Construindo um Objeto 163
Finalmente 167
APNDICE A 168
Documentao 168
Hardware/Software requeridos 168
APNDICE B 169
Converso de Campos 169
Tipos de Dados para o InterBase 170
APNDICE C 171
Aplicao rpida com o Objeto Query 171
APNDICE D 173
Imprimindo um Formulrio 173
APNDICE E 175
Trabalhando com Mscaras 175
APNDICE F 177
Trabalhando com Importao e Exportao 177
APNDICE G 180
Doze melhores dicas para o Delphi 180
vi
Introduo
Bem-vindo ao Delphi, o mais novo produto de alta performance da Borland. Delphi um
produto nico em sua categoria combinando cdigos totalmente compilveis, ferramentas visuais
e tecnologia para a composio de bases de dados escalveis, possui facilidades para um rpido
desenvolvimento em plataforma Windows e aplicaes Client/Server.
Este trabalho ser seu guia para uma rpida aprendizagem no desenvolvimento de
sistemas que gerencie bancos de dados. O Delphi encontrado em dois produtos:
Mas o que possvel fazer com ele ? possvel criar, dentre outros, os seguintes tipos de
aplicaes em Delphi :
7
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Um pacote corporativo de aplicaes inteligentes e interpretadores de dados.
Incorporando DLLs e EXEs externos;
Pacotes multimdia com desenho e animao;
Genricos utilitrios do Windows ;
Mas porque arriscar em um ambiente novo quando existe no mercado linguagens mais
difundidas ? No mundo inteiro Delphi foi testado, e em 15 meses de vida produziu os seguintes
resultados:
Delphi est sendo utilizado no momento por mais de 1.500 lugares incluindo as maiores
corporaes, consultores e organizaes de treinamento;
Eleito pela Byte Magazines como Best of Comdex Award;
Vrios livros escritos;
Grupos de discusso e peridicos com dicas de desenvolvimento na WorldWibe
(Consulte s listas da InterNet atravs da palavra DELPHI);
Dezenas de bibliotecas e ferramentas para o suporte em Delphi;
Dezenas de artigos em publicaes do mundo inteiro, tais como PC Week, InfoWorld,
Computer Reseller News, PC Magazine, Windows Sources e muitas outras.
Por tudo aqui exposto fica claro que este no produto demonstra uma inovao para uma
criao em alta performance de aplicaes. Todos os recursos que voc precisar para o
desenvolvimento de seus produtos esto agora disponveis.
Feliz desenvolvimento.
+ Sempre que voc localizar este smbolo significa que existe uma nota que lhe ajudar
em caso de dvida.
8
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Captulo I
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.
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:
9
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Ao - a operao efetuada pelo objeto. Todas as janelas, por exemplo, controlam a
iluminao e temperatura ambiente, dependendo do seu design.
Herana - um objeto novo nem sempre criado do zero. Ele pode herdar atributos e aes
de outros j existentes. Um basculante herda atributos das janelas e das persianas.
Polimorfismo - a capacidade de objetos diferentes reagirem segundo a sua funo a uma
ordem padro. O comando abre, por exemplo, faz um objeto entrar em ao, seja ele
uma janela, uma porta ou uma tampa de garrafa.
Ligao - quando um objeto conecta a sua ao a outro. Um sensor de claridade, por
exemplo, ativa o acendimento automtico da iluminao de rua.
Embutimento - Permite a um objeto incorporar funes de outros, como um liqidificador
que mi carne com a mudana do tipo da lmina.
Object Pascal
Object Pascal uma linguagem Orientada a Objetos no pura mas hbrida por possuir
caractersticas de programao no s visual mas tambm escrita, para os programadores que j
conhecem tcnicas de estruturas de programao, com o C, Basic, Pascal ou xBASE entre outras [AL1] Comentrio:
linguagens a Object Pascal providncia uma migrao de forma natural oferecendo um produto
de maior complexibilidade. Object Pascal fora a voc executar passos lgicos isto torna mais
fcil o desenvolvimento no ambiente Windows de aplicaes livres ou que utilizam banco de
dados do tipo Cliente/Servidor, trabalha com o uso de ponteiros para a alocao de memria e
todo o poder de um cdigo totalmente compilvel. Alm disso possibilita a criao e reutilizao
(vantagem de re-uso to sonhado com a Orientao a Objetos) de objetos e bibliotecas
dinmicas (Dynamic Link Libraries - DLL).
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
11
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
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 >, /, div, mod, and, shl, shr, as
Adicionais +, -, or, xor
Relacionais =, < >, <, >, < =, > =, in, is
12
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Identificadores
Identificadores podem ser constantes, tipos, variveis, procedures, funes, unidades,
programas e campos de registros.
begin
{ ... comandos iniciais ... }
with form1 do
begin
Caption := Teste; Equivalente a Form1.Caption
BorderStyle := bsSizable; Equivalente a Form1.BorderStyle
end;
end;
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
begin
{ ... comandos iniciais ... }
if x > 2 then
{ ... Bloco verdadeiro ... }
else
{ ... Bloco falso ... };
end;
goto... ;
Transfere a execuo de um programa para o ponto determinado pelo Label. A sintaxe do comando :
GOTO {Label};. Ex:
label
primeiro;
begin
{ ... comandos iniciais ... }
if x = 2 then
goto primeiro;
{ ... outros comandos ... }
Primeiro:
{ ... comandos do Primeiro ... }
end;
14
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
begin
{ ... comandos iniciais ... }
case x of
1: { ... Bloco para x = 1 ... }
2, 3: { ... Bloco para x = 2 ou X = 3... }
4..6: { ... Bloco para 4 <= x <= 6 ... }
else
{ ... Bloco para x < 1 ou x > 6 ... };
end;
end;
repeat... until;
Repete um determinado bloco de declaraes at a condio booleana do subcomando until ser satisfeita. A
sintaxe do comando : REPEAT {comandos}; until {condio};. Ex:
begin
{ ... comandos iniciais ... }
x := 0;
repeat
x := x + 1
until (x = 2);
end;
begin
{ ... comandos iniciais ... }
for i := 1 to 10 do Executa o [comandos A] para i = 1,2,3,4,5,6,7,8,9 e 10
{ ... Comandos A ... }
for s := 10 downto 1 do Executa o [comandos B] para i = 10,9,8,7,6,5,4,3,2 e 1
{ ... Comandos B... }
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 Repete o [Bloco de comandos] enquanto i = 1
15
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
{ ... Bloco de comandos ... }
end;
break; ou continue...;
O comando break interrompe um bloco de repetio for, while ou repeat saindo do bloco. A sintaxe do
comando : BREAK; enquanto que o comando continue retorna a primeira instruo do bloco de
repetio for, while ou repeat. A sintaxe do comando : CONTINUE;. Ex:
begin
{ ... comandos iniciais ... }
for i := 1 to 10 do
begin
if i = 8 then
break; Salta para os [comandos C]
{... comandos A...}
if i = 5 then
continue; Retorna para o comando for pulando os [comandos B]
{... 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
begin Corpo do procedimento.
soma := a + b; ou result := 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Uso de outras unidades
Forms, Dialogs;
type
TForm1 = class(TForm) A declarao do objeto inicia aqui
private
{ Private declarations }
public
{ Public declarations }
end; Aqui o final da declarao
var
Form1: TForm1; Atribui a varivel Form1 as caractersticas do objeto TForm1
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Adicionando alguns componentes ao formulrio, veremos como o Delphi completar a
aplicao escrevendo automaticamente o cdigo, e permitindo que ao final tornar-se- possvel a
compilao (lembra-se do Clipper , com .EXE), execuo e distribuio da aplicao.
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TForm1 = class(TForm)
Button1: TButton; Um novo dado foi aqui inserido
procedure Button1Click(Sender: TObject); Declarado um novo mtodo
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
O novo objeto TForm1 agora apresenta um campo Button1 - o boto que voc adicionou
ao formulrio. TButton e o tipo do objeto, e Button1 o objeto boto propriamente dito. Com o
tempo voc colocar novos componentes ao formulrio.
19
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TfCores = class(TForm) Aqui foi modificado
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fCores: TfCores; Aqui foi modificado
implementation
{$R *.DFM}
end.
20
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
9 Controles de menu;
9 Botes de maximizao e minimizao;
9 Barra de ttulo; e
9 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
2. Para imprimir um formulrio no tamanho de um papel A4, atravs do uso de
comandos da biblioteca Printer, veja o Apndice D para maiores detalhes.
Code Editor
O editor de cdigos providncia total acesso ao cdigo gerado pelo projeto, incluindo
alguns dos mais poderosos recursos para a edio. Pode ser selecionado tipos de cores para os
elementos do programa (como por exemplo comentrios, palavras reservadas, cdigos assembler,
...) para tanto a partir do menu principal entre em Tools | Options..., localize a pgina Colors.
+ Para outras informaes adicionais sobre o modo de usar este editor, procure
referncias no Help OnLine no tpico Code Editor.
Ao ser aberto um novo projeto, o Delphi gera automaticamente na pgina do Code Editor
uma Unit com o arquivo cdigo (.PAS). Para ver o cdigo de uma Unit em particular,
simplesmente Click na tabulao de pgina. O Code Editor mostrar sempre o nome do arquivo
corrente ativo na tabulao de pgina.
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).
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
SpeedBar
Contm os botes mais freqentemente utilizados. Fornecendo deste modo um atalho de
navegao ao menu principal do Delphi.
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
3. O desenho do banco de dados, a construo das metodologias de negcio e o desenho e a
criao das janelas de entrada so efetivados dentro da aplicao. O desenvolvimento,
ento paralelamente, resultar em uma maior rapidez.
4. Herdando as janelas de entrada, em nveis de utilizao, reduz-se drasticamente o
processo de codificao, e em conseqncia, o processo futuro de manuteno. As
mudanas lgicas das regras de negcio ou a incorporao de novos padres, so feitas
automaticamente para todos os objetos herdados.
5. O repositrio de objetos, os formulrios reusveis e a utilizao dos objetos Data
Modules, envolve em eliminao da duplicao de cdigos e de trabalhos com desenhos
de janelas, e em conseqncia na reduo da equipe de desenvolvimento.
Implementao efetiva
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
depois da gravao, excluso, insero ou edio dos dados. E at mesmo na colocao
de novos objetos de controle para maior facilidade.
As relaes de dados Master / Detail so definidas em menor quantidade. Possibilita
ento ao desenvolvedor criar aplicaes do tipo Client / Server de forma mais fcil,
rpida, e segura se utilizando das propriedades dos objetos Datasources ou utilizando o
Database Form Expert.
Os formulrios das aplicaes, podem ser ligados diretamente a um ou mais objetos Data
Module para a propagao das regras de negcio sem a necessidade de execuo de um
cdigo extra.
Os objetos Data Modules so classes de objetos que pertencem a interao dos dados do
database server. Isolando totalmente o acesso ao banco de dados com a aplicao Client,
simplificando deste modo toda a manuteno realizada.
O Acesso ao Delphi aos bancos de dados se processa da seguinte maneira:
Os objetos Data Module foram desenvolvidos para criar uma centralizao lgica de
todas as regras de negcio, separando a rea de viso do usurio com a rea do desenho do Banco
de Dados. Este slido fundamento de suporte so distribudos em um n-nmero de aplicaes e
arquiteturas servidoras disponveis, tais como CICS da IBM, TopEnd da ATT, Tuxedo da
Novell, Object Broker da Digital, IONA da Orbix e muitas outras.
30
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
1. Consistncia: Campos idnticos so armazenados centralmente no dicionrio isto reduz
o tempo de definio das duplicidades. Um desenvolvedor poder criar os campos
complementares com domnios e aplicaes apropriadas.
2. Reduo do Trfico da Rede: O Delphi permite que a validao dos dados seja feita nas
mquinas client ou no servidor. O Dicionrio de dados permite que a manuteno dos
atributos dos campos do lado client seja validado de forma eficiente reduzindo a
necessidade do trfego da rede.
Herdando os Formulrios
O desenvolvimento de aplicaes corporativas de uma forma padronizada um fato de
suma importncia para as empresas envolvidas. Mas conseguir e manter este padro uma tarefa
considerada praticamente impossvel, j que as aplicaes devem se modernizar na velocidade
que o mercado de informtica exige. Os formulrios herdados do Delphi so simples extenses da
programao orientada a objetos, conseguindo manter, de forma automtica, os padres e as
modificaes realizadas nos projetos. E em conjunto com o Repositrio de Objetos, padroniza,
organiza e centraliza os formulrios resultando em modificaes de curtssimo tempo.
31
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
32
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
33
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
A verso local do InterBase, disponvel apenas com a cpia Client / Server Suite 2.0,
providencia aos desenvolvedores um caminho rpido para o desenvolvimento de prottipos e de
sistemas com um banco de padro ANSI 92 SQL. Esta verso propicia as mesmas funcionalidades
da verso multi-usurio para NT e Unix, incluindo controles de transaes, procedimentos de
gravao (stored procedures), uso de triggers (gatilhos disparados do banco), ou eventos de
34
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
alerta. Imagine o desenvolvimento de um grande sistema sendo realizado em um Laptop dentro
de um trem, avio ou at mesmo na frente do cliente, apenas o acesso ao banco de dados final
que ser modificado.
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.
O acesso Delphi a arquivos pode ser feito atravs de duas maneiras local ou remoto,
sendo a segunda apenas possvel pela cpia CLIENT-SERVER voltadas a bases de dados mais
complexas como ORACLE ou SYBASE , inicialmente, restringiremos o nosso estudo a base de
dados locais conseguida atravs da verso Desktop. Lembre-se que verso Desktop contm
acesso a criao e a definio de bases dBase e Paradox, alm de outras conseguidas atravs de
ODBC.
35
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 multi-
usurio opte por InterBase.
36
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
1 registro da entidade Bsico se relaciona com 1 registro da entidade Categoria enquanto
que 1 registro da entidade Categoria se relaciona com n registros da entidade Bsico,
1 registro da entidade Msicas se relaciona com 1 registro da entidade Bsico enquanto
que 1 registro da entidade Bsico se relaciona com n registros da entidade Msica.
Com o MER nas mos j se tem a idia de como deve ficar as estruturas das tabelas,
ento, vamos queimar um pouco de neurnios.
Criando o Alias
O ALIAS simplesmente um apelido (sinnimo) a ser dado para o banco de dados, este
apelido permitir que no lugar de falarmos para ao Delphi que a nossa base se encontra em
C:\SISTEMA\... ou D:\DESENV\SISTEMA\..., simplesmente digamos se encontra em AliasX ou
AliasY, isto facilitar o seu trabalho quando voc por exemplo quiser modificar o diretrio do
sistema, basta mudar o endereo do ALIAS e no sair modificando vrios formulrios.
Para trabalhar com ALIAS o caminho mais interessante e com o Database Engine
37
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Com o nosso sinnimo (ALIAS) criado iremos agora definir as nossas tabelas.
Inicialmente vamos definir como nossa rea de trabalho: No menu principal, opo File|Working
Directory..., na opo Aliases: selecione AliasDisco, note que a opo Working Directory ser
automaticamente modificada para :AliasDisco:, finalmente confirme clicando no boto OK. O
diretrio apontado pelo Alias, agora ser o default, ou seja, tudo o que fizermos ser apontado
para o diretrio.
38
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 Key
COD_DISCO N *
NOM_DISCO A 60
TIP_DISCO A 3
FOT_CAPA B 3
SIG_CATEG A 2
+ 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.
1. Categor
Field Name Type Size Key
SIG_CATEG A 2 *
DES_CATEG A 40
2. Musica
Field Name Type Size Key
COD_DISCO N *
NUM_FAIXA N *
NOM_MUSICA A 60
39
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
NOM_AUTOR A 40
TMP_MUSICA A 4
Para o nome do ndice crie um padro de FK_ + {nome do campo} + {nome tabela pai},
uma padronizao dos nomes dos ndices facilita a procura futuramente, ento para o nosso ndice
crie FK_SigCateg_Basico.
Crie agora o outro relacionamento entre a tabela MUSICA e BASICO conforme a figura
abaixo:
No menu principal, opo File, opo New, e opo SQL File, ser mostrada uma janela
para ser digitada a declarao SQL, observe na barra de comandos o boto Select Alias, ou a
partir do menu principal opo SQL/Select Alias..., apenas observe que a rea de trabalho Work
j est selecionada, clique em OK ou Cancel sem fazer nenhuma modificao, observe que o
ttulo da janela SQL Editor :WORK:<Untitled>.
40
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Digite o seguinte na janela:
Create Table Basico
(
COD_DISCO Numeric(4,0),
NOM_DISCO VarChar(60),
TIP_DISCO Char(3),
FOT_CAPA Blob(3,2),
SIG_CATEG Char(2),
Primary Key(COD_DISCO)
);
Clique no boto Run SQL, ou no menu SQL/Run SQL, ou ainda pressione F8,
aps executado o comando a tabela ser criada. Salve o SQL com a opo File/Save (digite
BASICO .SQL)
Caso voc esteja utilizando este tipo de base os passos para as criaes das tabelas so os
mesmos mas corte as clusulas Primary Key necessrio criar os ndices separadamente. Abra
uma nova declarao SQL, idntica a anterior, e digite o seguinte na janela:
Create Index PK_Unica on Basico (COD_DISCO);
41
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Captulo IV
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
2. D um duplo clique em cima do objeto, ou clique na propriedade Items da Object
Inspector aparecer o boto . Clique neste boto.
Saia da janela Menu Designer digitando Alt+F4, o menu j existe no objeto form1.
Altere as seguinte propriedades para o objeto form1:
Propriedade Valor Descrio
BorderStyle Single Estilo da borda da janela; modo simples.
Caption Compact Disc Digital Audio Label escrito na tarja superior da janela.
44
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Color clMenu Cor da janela, clMenu uma constante que guarda a cor
padro da janela definido pelo usurio no Windows.
Name F_Menu Nome do objeto interno.
WindowsState wsMaximized Modo de abertura da janela, modo Maximizado.
+ Caso voc esteje usando o Delphi 1.0 crie a barra de status do seguinte modo:
1. Clique no boto (Panel) na Component Pallete na pgina Standard e clique em
qualquer posio do objeto F_Menu.
2. Clique no objeto criado StatusBar1 e altere as seguintes propriedades:
Propriedade Valor Descrio
Align alBottom Alinhamento dentro do form, todo no rodap
Alignment taLeftJustify Alinhamento da Caption, justificado esquerda
45
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
BevelInner bvLowered Borda 3D interna, tipo pressionado
BevelOuter bvLowered Borda 3D externa, tipo pressionado
BorderWidth 1 Tamanho da borda
Caption Bem vindo ao sistema... Label do objeto
Name LinhaStatus Nome do objeto
Font MS Sans Serif, Estilo da Tipo de letra a ser mostrada no objeto, para alterar esta
fonte: Normal, Tamanho: 8, propriedade clique no boto
Cor: Azul Marinho
Height 22 Altura do objeto
46
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
+ 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end;
49
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
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:
50
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Font Ms Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Elimine o objeto OKButton (boto de OK), clique sobre ele e pressione Delete, clique no
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
F_Sobre.ShowModal; Abre o Objeto F_Sobre em modo Modal.
end;
{$R *.DFM}
uses
fSobre; Utiliza a Unidade fSobre e todos os objetos dependentes dela.
+ 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.
Existem vrios tipos de janela Splash. O tipo mais comum aquela que mostra o nome da
aplicao, o autor, a verso, direitos autorais (Copyright) e uma imagem ou cone que identifica a
aplicao. Atravs da caracterstica de herana dos objetos vamos obter facilmente esta janela:
1. No menu principal selecione a opo File e New..., clique na pgina CDDA e na
figura entitulada F_Sobre.
+ Neste momento voc obteve uma cpia da janela fSobre o problema que a janela
fSplash ter menos objetos que a janela fSobre, e por caracterstica de herana o filho sempre
deve superar os pais nunca ao contrrio, ento necessrio que invertamos as duas janelas.
52
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
55
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
begin
LinhaStatus.Panels.Items[0].Text := Application.hint;
end;
end.
+ Caso o seu sistema no seja migrado para nenhum banco de dados no padro SQL (do
tipo ORACLE , SYBASE ,...) no existe nenhuma necessidade em se utilizar o objeto
DataBase, mas a utilizao ou no do objeto no afeta o tempo de acesso ao sistema, ento
porque no prepar-lo para uma eventual mudana?
56
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Captulo V
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:
1. 2.
O tipo a ser criada. A tabela a ser usada para a janela.
Form Options: Create a simple form Drive or Alias name: AliasDisco
Uma janela simples Table Name: categor.db
DataSet Options: Create a form using TTables objects Boto Next
Usando o objeto tabela
Boto Next.
3. 4.
Campos a serem inseridos Formao dos campos
57
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Boto >> Vertical
Boto Next Boto Next
5. 6.
Posio dos Labels Completo
Left - A esquerda Gera a tela como form principal - No
Boto Next 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.
58
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
voc poder usar duplicaes da mesma tabela, sem que isso afete a integridade de seu banco de
dados.
59
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
procedure TDM_Modelo.TabCategorNewRecord(DataSet: TDataSet);
begin
F_Categ.EditSig_Categ.SetFocus; Altera a posio do cursor para o objeto EditSig_Categ
end;
Finalizando o DataModule
Salve o DataModule com o nome de DMModelo. Confira o cdigo completo para o
DataModule:
unit DMModelo;
interface
uses
SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;
type
TDM_Modelo = class(TDataModule)
TabCategorSig_Categ: TStringField;
TabCategorDes_Categ: TStringField;
DSCategor: TDataSource;
TabCategor: TTable;
TabCategorConf: TTable;
StringField1: TStringField;
StringField2: TStringField;
procedure TabCategorAfterPost(DataSet: TDataSet);
procedure TabCategorSig_CategValidate(Sender: TField);
procedure TabCategorNewRecord(DataSet: TDataSet);
private
{ private declarations }
public
{ public declarations }
end;
var
DM_Modelo: TDM_Modelo;
implementation
{$R *.DFM}
uses
fMenu, { Menu Principal do Sistema }
fCateg; { Cadastro de Categorias }
62
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end.
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).
uses
63
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
DMModelo; { Referencia ao DataModule }
+ Qualquer problema para dimensionar o tamanho de objetos use a tecla SHIFT + Setas.
+ Qualquer problema para acertar a posio de objetos use a tecla CTRL + Setas.
+ Uma propriedade interessante a FocusControl ela indicar um controle para a
posio do cursor. Ex.: Caso seja digitado ALT+S o cursor se posicionar no objeto
EditSig_Categ ou Caso seja digitado ALT+D o cursor se posicionar no objeto EditDes_Categ.
64
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Objeto DBNavigator
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
1. Altere a propriedade Alignment, alinhamento da propriedade Caption do painel,
para taLeftJustify.
2. Coloque na propriedade Caption o nome Categoria.
3. Modifique a propriedade Fonte para MS Sans Serif, Itlico, 14 e azul marinho.
+ 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.
66
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Align alBottom Alinhamento dentro do form, todo no rodap
Caption Label do objeto
Height 41 Altura do objeto
Os botes que criaremos faro duas funes: 1.Sair da janela e 2.Localizao rpida de
um determinado registro.
67
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Seu trabalho final deve ter ficado deste modo:
Programando no formulrio
Agora vem a parte de cdigo. Ao final deste tpico voc observar que o trabalho maior
ficou pr conta de organizar e arrumar os objetos do que com o cdigo em si, i.e., orientao a
objetos.
1
Este tempo com base em uma mquina 486 DX2 com 8 Mb de memria.
68
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
var
F_Categ: TF_Categ;
69
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
implementation
{$R *.DFM}
uses
FMenu, { Menu Principal do Sistema }
DMModelo; { Referencia ao DataModule }
70
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
TabCategor.Close; Fecha a tabela
if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL
F_Menu.DBDisco.Commit; Encerra o modo de transaes gravando
end; as alteraes no banco de dados
+ A funo MessageDlg faz parte da Unit Dialogs ento necessrio fazer uso desta
Unit, para tanto insira o seguinte cdigo (abaixo da diretiva de compilao):
{$R *.DFM}
uses
FMenu, { Menu Principal do Sistema }
DMModelo, { Referencia ao DataModule }
Dialogs; { Utilizado para o controle da funo MessageDlg }
Cdigo para localizar determinado registro, observe que se o usurio no deve estar
inserindo ou editando registros:
1. D um duplo Click sob o objeto ButLocalizar:
procedure TF_Categ.ButLocalizarClick(Sender: TObject);
var Declarao de variveis
ObjPesquisa: String; Cria a varivel ObjPesquisa do tipo String
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then
begin
MessageDlg('Cancele a edio (ou insero) da Categoria antes de localizar!',
mtInformation, [mbOK], 0);
Exit;
end;
ObjPesquisa := DM_Modelo.TabCategorSig_Categ.Value; Atribui a ObjPesquisa o valor do campo
de tabela Sig_Categ
if InputQuery('Entre com a sigla da categoria',
'Sigla',ObjPesquisa) then Solicita a digitao do cdigo a ser procurado
if not DM_Modelo.TabCategor.FindKey([ObjPesquisa]) then Pesquisa o campo digitado na tabela
MessageDlg('Sigla da Categoria no encontrada.', Caso no seja encontrado informa
mtInformation, [mbOK], 0);
end;
71
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
mtInformation, [mbOK], 0); Aqui
Action := caNone;
Exit;
end;
...
end;
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; Cria a funo na rea particular
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;
72
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
var
ObjPesquisa: String;
begin
if CriticaEdicao('localizar' ) then Substitui pela chamada a funo
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; Aqui
end;
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 }
var
F_Categ: TF_Categ;
73
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
uses
fSobre, { Janela do Sobre o Sistema }
fCateg; { Cadastro da Tabela de Categoria }
4. Saia do Code Editor e salve o formulrio e o projeto.
5. Rode o projeto e teste o formulrio de categoria, insira algumas categorias, tente provocar
o erro de duplicao, tente inserir um registro com o cdigo vazio e localizar um registro.
74
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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, { Menu Principal do Sistema }
DMModelo, { Referencia ao DataModule }
Dialogs; { Utilizado para o controle da funo MessageDlg }
procedure TF_Categ.Inicio;
begin
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
DM_Modelo.TabCategor.Open;
Screen.Cursor := crDefault;
ShowModal;
end;
75
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Action := caNone;
Exit;
end;
Screen.Cursor := crHourGlass;
DM_Modelo.TabCategor.Close;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.Commit;
end;
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.
76
Captulo VI
1. 2.
O tipo a ser criada. A tabela mestre a ser usada para a janela.
Form Options: Create a master/detail form Drive or Alias name: AliasDisco
Uma janela mestre e detalhes Table Name: basico.dbf
DataSet Options: Create a form using TTables Boto Next
objects
Usando o objeto tabela
Boto Next.
77
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
3. 4.
Campos a serem inseridos Formao dos campos
Boto >> Vertical
Boto Next Boto Next
5. 6.
Posio dos Labels A tabela detalhe a ser usada para a janela.
Left - A esquerda Drive or Alias name: AliasDisco
Boto Next Table Name: musica.dbf
Boto Next
7. 8.
Campos a serem inseridos Formao dos campos
Boto >> Grid
Boto Next Boto Next
9. 10.
78
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Montagem da chave de ligao Completo
Available Indexes : Primary Gera a tela como form principal - No
Detail Fields : COD_DISCO O Que gerar: Form e DataModule
Master Fields : COD_DISCO Boto Finish
Boto Add
Joined Fields COD_DISCO -> COD_DISCO
Boto Next
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.
Crie trs objetos Table , encontrado na Component Palette pgina Data Access, e um
79
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
TableName MUSICA Nome externo da tabela
Name TabMusica Nome do objeto
IndexFieldNames COD_DISCO Nome do campo indexado
MasterSource DSBasico Nome do DataSource Mestre
MasterFields COD_DISCO Campo de ligao da tabela Mestre
+Os objetos na hora da execuo do formulrio ficaro invisveis, mas bom coloc-los
em cantos estratgicos, isto evita a confuso.
80
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Crie o objeto Query , encontrado na Component Palette pgina Data Access, que
servir para calcular o cdigo automtico, calculando sempre o cdigo de maior valor, e
altere as seguintes propriedades:
Propriedade Valor Descrio
DatabaseName BaseDisco Nome do Banco de Dados ou a localizao do
diretrio das tabelas
Name QryContador Nome do Objeto
SQL Select Max(COD_DISCO) from BASICO Clusula SQL, selecione o maior valor do
campo COD_DISCO da tabela BASICO
+ O campo COD_DISCO criado, servir apenas como uma chave de ligao entre a
tabela Basico e Musica, ser uma chave interna do nosso sistema e sua alimentao se far atravs
deste objeto SQL criado pegando o maior valor e adicionando 1.
81
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Antes de iniciarmos a programao do DataModule compare como ficou o DataModule e
salve-o com o nome de DMBasico:
Controlando o DataModule
Agora falta o cdigo, note que a maior parte uma repetio daquilo que j vimos
anteriormente:
82
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
uses
fMenu; { Menu Principal }
+ Repare que no incio desta Unit tambm existe uma outra declarao Uses, aps a
sesso interface, ento por que no colocar todas essas declaraes em um lugar s? 1o) O Delphi
controlar (colocando ou removendo) as Units ali colocadas (dependendo dos objetos utilizados)
e 2o) Todos os comandos declarados antes da declarao implementation (com exceo de
eventos de criao do tipo onCreate), sero executados e objetos e units ficaro em memria
esperando serem chamados, ento impraticvel colocar units que s sero utilizadas em tempo
de execuo.
Contadores
O objeto query realiza consultas em modo SQL, no prximo captulo o utilizaremos para
criarmos nossas consultas mas, neste momento ele ser utilizado para verificar qual o maior valor
armazenado no campo cdigo.
A cada novo registro devemos criar tambm um novo COD_DISCO (lembra do objeto
QryContador). Alm disso, precisamos nos posicionar no primeiro campo do cadastro,
isto ser realizado em dois eventos distintos:
1. Marque o objeto TabBasico, e d um duplo clique sobre o evento onNewRecord:
procedure TF_Basico.TabBasicoNewRecord(DataSet: TDataset);
begin
F_Basico.EditNOM_DISCO.SetFocus; Posiciona o cursor no objeto
end;
+ Observe que foi utilizado o objeto F_Basico, ento preciso declarar a unidade a qual
ele pertence com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fBasico; { Cadastro do Bsico }
fMenu; { Menu Principal }
83
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end; de 1 ao valor do contador campo
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;
Para que o nosso usurio escolha somente as categorias existentes:
1. Marque o objeto TabBasicoSIG_CATEG, e d um duplo clique sobre o evento
OnValidate:
procedure TDM_Basico.TabBasicoSig_CategValidate(Sender: TField);
begin
if DSBasico.State in [dsEdit, dsInsert] then
if not (TabCategorConf.FindKey([TabBasicoSIG_CATEG])) then Observe o comando NOT
begin
F_Basico.EditSIG_CATEG.SetFocus;
raise Exception.Create('Sigla da categoria no existe'#10+
84
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
'Click no boto "Localiza Categoria" em caso de dvida');
end;
end;
unit DMBasico;
interface
uses
SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;
type
TDM_Basico = class(TDataModule)
TabMusicaCod_Disco: TFloatField;
TabMusicaNum_Faixa: TFloatField;
TabMusicaNom_Musica: TStringField;
DSBasico: TDataSource;
TabBasico: TTable;
TabMusica: TTable;
DSMusica: TDataSource;
TabBasicoConf: TTable;
TabCategor: TTable;
TabCategorConf: TTable;
DSCategor: TDataSource;
TabBasicoCod_Disco: TFloatField;
TabBasicoNom_Disco: TStringField;
TabBasicoTip_Disco: TStringField;
TabBasicoFot_Capa: TBlobField;
TabBasicoSig_Categ: TStringField;
QryContador: TQuery;
QryContadorMAXOFCOD_DISCO: TFloatField;
procedure DM_BasicoCreate(Sender: TObject);
procedure DM_BasicoDestroy(Sender: TObject);
procedure TabBasicoNewRecord(DataSet: TDataSet);
procedure TabBasicoBeforePost(DataSet: TDataSet);
procedure TabBasicoAfterPost(DataSet: TDataSet);
procedure TabBasicoNom_DiscoValidate(Sender: TField);
procedure TabBasicoSig_CategValidate(Sender: TField);
private
{ private declarations }
public
{ public declarations }
end;
var
DM_Basico: TDM_Basico;
implementation
{$R *.DFM}
uses
fBasico, { Cadastro do Bsico }
85
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
fMenu; { Menu Principal }
86
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
end.
Deve ocorrer um erro na clusula Uses informando que a unidade fBasico no existe nem
o objeto F_Basico no foi encontrado, ento antes de qualquer passo chame o objeto Form2 e
altere a propriedade Name para F_Basico e salve o formulrio com o nome de fBasico, pode
novamente verificar a unidade DMBasico que desta vez no haver problemas.
+ Aproveite o objeto F_Basico para alterar a clusula uses logo abaixo da diretiva de
compilao para:
{$R *.DFM}
uses
DMBasico; { Referncia ao DataModule }
Organizando os Panels
Vamos passar para as alteraes com objeto F_Basico. Os objetos da janela se encontram
distribudos em trs objetos Panel, o primeiro (Panel1) guarda o objeto DBNavigator, o segundo
(Panel2) guarda os labels e os campos do arquivo BASICO e o terceiro (Panel3) guarda o objeto
DBGrid1 que controlar o arquivo MUSICA.
87
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Organizando os Panels
Vamos organizar cada objeto Panel por partes:
Objeto Panel1
88
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Modifique tambm o objeto Panel1 conforme descrito no captulo anterior e altere a
propriedade Caption para CDs.
Objeto Panel2
Objeto Panel3
Marque o objeto DBGrid1 e altere as propriedades Align para alNone e BorderStyle para
bsSingle, pressione Ctrl+X marque o objeto ScrollBox e pressione Ctrl+V, acerte o
objeto de forma que este caiba abaixo do objeto Label1 (Msicas:).
Elimine o objeto Panel3, clique sobre ele e pressione Del.
Modificando a Janela
Altere as propriedades BorderIcons, BorderStyle e Position conforme descrito no
captulo anterior.
89
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Mude a propriedade Caption para Cadastro.
Altere a propriedade Align do objeto Panel2 para alClient e acerte as posies no
formulrio.
Salve o formulrio e salve o projeto.
90
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
categoria
Name ButInsCateg Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Width 25 Tamanho do objeto
+
A funo de cada boto est explicada na propriedade hint, para os objetos
ButLocCateg e ButInsCateg iremos nos aproveitar dos formulrios j construdos anteriormente.
+
Provavelmente voc no ir encontrar o arquivo LANTERNA.BMP solicitado para o
segundo boto, teremos de cri-lo:
1. Salve o formulrio e feche o projeto, localize (no diretrio demos do Delphi) e abra o
projeto [DiretrioDelphi]\DEMOS\DB\MASTAPP\MASTAPP.DPR
2. Atravs do Project Manager abra o formulrio SearchDlg.
3. Localize o objeto SearchButton e clique na propriedade Glyph.
4. Escolha o boto Save... e salve-o no diretrio e nome proposto
([DiretrioDelphi]\IMAGES\BUTTONS\ e LANTERNA.BMP).
5. Retorne ao nosso projeto descartando quaisquer aviso para salvar o MASTAPP.DPR.
Por enquanto vou me deter a falar do objeto DBGrid, mais tarde voltaremos a falar dos
outros, este objeto DBGrid vinculado, ao DataSource, apresenta as seguintes propriedades (mais
importantes, algumas ainda no mencionadas):
9 DataSource: Nome do objeto DataSource vinculado;
9 Font: Tipo da letra a ser mostrada no contedo do objeto;
91
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
+ 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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; Criando a chamada para um procedimento pblico.
end;
var
F_Basico: TF_Basico;
implementation
{$R *.DFM}
93
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
1. No objeto F_Basico, d um duplo click sobre o evento OnClose:
procedure TF_Basico.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Fechar') then Lembra da Funo
begin
Action := caNone; Cancela a sada da janela
Exit; Sai da procedure
end;
Screen.Cursor := crHourGlass; Faz o cursor virar uma ampulheta
DM_Basico.Free; Elimina o DataModule
end;
+ Lembre-se que a funo CriticaEdicao faz parte da Unit fMenu, ento preciso
declarar esta unidade com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
DMBasico, { Referncia ao DataModule }
fMenu; { Menu Principal do Sistema } Colocado para o uso da Funo CriticaEdicao
+ Repare que no incio desta Unit existe uma declarao Uses, aps o comando
interface. Ento por que no colocar todas essas declaraes em um lugar s? 1.O Delphi
controlar (colocando ou removendo) estas Units ali colocadas (dependendo dos objetos
utilizados) e 2.Todos os comandos declarados antes da declarao implementation (com exceo
de eventos de criao. Ex.: onCreate), sero executados e objetos e units ficaro em memria
esperando serem chamados, ento impraticvel colocar units que s sero utilizadas em tempo
de execuo.
Consulta
Cdigo para pesquisar os registros das tabelas, basicamente utilizaremos o mesmo
trabalho realizado com o objeto F_Categ:
1. D um duplo click sob o objeto ButLocalizar:
procedure TF_Basico.ButLocalizarClick(Sender: TObject);
var
ObjPesquisa: String;
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Localizar') then Lembra da Funo
Exit;
ObjPesquisa := TabBasicoNOM_DISCO.Value;
+ 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
uses
DMBasico, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs; { Gerente de Mensagens } Colocado para o uso da Funo InputQuery
+ Desta vez foi utilizado o comando FindNearest, este comando consulta por parte
inicial do cdigo encontrado um cdigo igual ou maior que o pesquisado, no preciso ao usurio
lembrar o nome completo como no comando FindKey. Ateno: o comando FindNearest no
retornar uma varivel boolean (True ou False como resultado da pesquisa) ento no se faz a
necessidade de crticas sobre o mesmo. Salvo exceo se o campo for tipo numrico ou tipo data
ento utilize este comando em conjunto com o comando Try. Veja no prximo captulo como.
O cdigo para o boto que localizar um registro na tabela de categoria ser tratado no
prximo captulo.
Para inserir novos registros na tabela de categoria utilizaremos o formulrio construdo
anteriormente, a nica diferena que desta vez devemos estar em modo de edio:
1. D um duplo click sobre o objeto ButInsCateg:
procedure TF_Basico.ButInsCategClick(Sender: TObject);
begin
if not (DSBasico.State in [dsEdit, dsInsert]) then Se no estiver em estado de ediao ou
begin incluso
MessageDlg('Voc no est no modo de edio!', Envia mensagem de erro
mtInformation, [mbOK], 0);
exit;
end
uses
DMBasico, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs, { Gerente de Mensagens }
fCateg; { Cadastro de Categorias }
95
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
procedure TF_Basico.ButPasteClick(Sender: TObject);
begin
ImageFOT_CAPA.PasteFromClipboard;
end;
Prximo passo, o cdigo para o boto que permitir trazer uma imagem em arquivo .BMP
para o campo da Foto:
1. D um duplo click sobre o objeto ButPaste:
procedure TF_Basico.ButPasteClick(Sender: TObject);
begin
If AbreBmp.Execute then Verifica se foi clicado em OK
ImageFot_Amostra.Picture.LoadFromFile( AbreBmp.FileName ); Carrega o arquivo
end;
96
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
+ Repare no uso do comando GotoKey ao invs do comando FindKey, ele foi utilizado
por se tratar de uma chave composta.
+
Coloque tambm a crtica para a tabela de msica, evento OnNewRecord do objeto
TabMusica:
procedure TDM_Basico.TabMusicaNewRecord(DataSet: TDataSet);
begin
F_Musica.EditNUM_FAIXA.SetFocus;
end;
+Uma ltima crtica ser para confirmarmos as alteraes para a base SQL, pressione
novamente a tecla F11 e na pgina Events, d um duplo click sobre o evento AfterPost:
97
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
F_Menu.DBDisco.Commit; Gravando as alteraes da tabela
F_Menu.DBDisco.StartTransaction; Reinicia o modo de transaes
end;
end;
9 Deixe apenas o boto Fechar;
9 Remova o Label e o DBEdit do campo COD_DISCO; e
9 Mude a propriedade do BorderStyle para bsDialog.
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, Buttons, Mask, ExtCtrls;
type
TF_Musica = class(TForm)
ScrollBox: TScrollBox;
Label2: TLabel;
EditNum_Faixa: TDBEdit;
Label3: TLabel;
EditNom_Musica: TDBEdit;
Label4: TLabel;
EditNom_Autor: TDBEdit;
Label5: TLabel;
EditTmp_Musica: TDBEdit;
DBNavigator: TDBNavigator;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
98
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 }
end.
+ 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
ShowModal Chamaremos aqui o novo formulrio
Free; Eliminamos o Formulrio
end;
if F_Menu.DBDisco.IsSQLbased then
F_Menu.DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
uses
DMBasico, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs, { Gerente de Mensagens }
fCateg, { Cadastro de Categorias }
fMusica; { Cadastro de Msicas }
var
...
...
procedure TF_Menu.Prepara(Tipo: boolean);
begin
if tipo then Se o valor da varivel tipo recebida for verdadeiro
begin
Screen.Cursor := crHourGlass; Faz a primeira parte
if DBDisco.IsSQLbased then
DBDisco.Commit;
100
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end
else Seno
begin
if DBDisco.IsSQLbased then Faz a segunda parte
DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
end;
Um segundo procedimento global pode ser criado verificando os eventos AfterPost dos
DataModules Dm_Categ e DM_Basico (este segundo em dois lugares); observamos o mesmo
procedimento:
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
var
...
101
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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).
{$R *.DFM}
uses
fSobre, { Janela do Sobre o Sistema ... }
fCateg, { Utilizada para o cadastro de Categorias }
fBasico; { Utilizada para o cadastro de CDs }
102
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
DMBasico, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs, { Gerente de Mensagens }
fCateg, { Cadastro de Categorias }
fMusica; { Cadastro de Msicas }
procedure TF_Basico.Inicio;
begin
DM_Basico := TDM_Basico.Create(Application);
Screen.Cursor := crDefault;
ShowModal;
end;
ObjPesquisa := DM_Basico.TabBasicoNom_Disco.Value;
F_Menu.Prepara(True);
with TF_Categ.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
end;
104
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
ImageFOT_CAPA.PasteFromClipboard;
end;
F_Menu.Prepara(True);
with TF_Musica.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
end;
end.
105
Captulo VII
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.
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
107
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
108
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
110
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
with DM_Modelo.TabCateg do
begin
MarcaReg := GetBookMark; Salva a posio do registro
F_SelCate := TF_SelCate.Create(Application); Cria o formulrio de consulta
F_SelCate.vCria := False; Seta a varivel pblica
if not F_SelCate.ShowModal = mrOk then Caso a sada do formulrio no seja o boto OK
GotoBookMark(MarcaReg); Retorna ao registro marcado
F_SelCate.Free; Elimina o formulrio de consulta
FreeBookmark(MarcaReg); Libera a varivel de marca
end;
end;
+ 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, { Menu Principal do Sistema }
DMModelo, { Referencia ao DataModule }
Dialogs, { Utilizado para o controle da funo MessageDlg }
fSelCate; { Seleciona Categoria }
111
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end;
+ 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, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs, { Gerente de Mensagens }
fCateg, { Cadastro de Categorias }
fMusica, { Cadastro de Msicas }
fSelCate; { Seleciona Categoria }
Salve o formulrio, retire-o da rea de formulrios auto-create, execute e teste o projeto.
Se alguma coisa deu errada, releia o captulo, ou ento confira o cdigo para a
F_SelCate:
unit fSelCate;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Buttons, StdCtrls, Grids, DBGrids;
type
TF_SelCate = class(TForm)
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
EdtTrecho: TMaskEdit;
Label1: TLabel;
ButOK: TBitBtn;
ButCancela: TBitBtn;
ButPesquisa: TSpeedButton;
procedure ButPesquisaClick(Sender: TObject);
private
VeCria : boolean;
function GetTrecho: String;
procedure SetTrecho(NewTrecho: String);
public
property CampTrecho: String read GetTrecho write SetTrecho;
112
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end;
var
F_SelCate: TF_SelCate;
implementation
{$R *.DFM}
uses
DMCateg; { Referncia ao DataModule }
try
DM_Modelo.TabCategor.FindNearest([EdtTrecho.Text]);
except
on exception do MessageDlg('Sigla especificada est invlida!',mtError, [mbOK], 0);
end;
end;
end.
113
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Vamos criar um formulrio idntico a este que servir para a montagem dos filtros:
114
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Name F_Filtro Nome do objeto
Position poScreenCenter Posio do objeto
115
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
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 Descrio
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto (consulte o cap.6,
ONS\LANTERNA.BMP criao do objeto ButLocCateg sobre a imagem)
Hint Pesquisa Categoria Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Name ButConsulta Nome do objeto
Visible False Objeto deve ser mostrado
2 Parte - servir para guardar o filtro montado e esconder o filtro em linguagem pura
SQL, ajuste seu tamanho para caber os outros objetos
GroupBox (encontrado na pgina Standard) - servir para guardar os blocos montados
do filtro, ajuste seu tamanho para caber os outros objetos, altere as seguintes
propriedades:
Propriedade Valor Descrio
Caption Filtro Completo Label do objeto
Font MS Sans Serif, Negrito, 8, Tipo de letra a ser mostrada no objeto
Castanho
Edit (encontrado na pgina Standard) - que mostrar ao usurio o filtro por ele criado,
ele ocupar toda a rea interna do objeto GroupBox, altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsNone Estilo da borda
Color clBtnFalse (mesma cor do objeto Cor do objeto
GroupBox)
Ctl3D False Possui desenho em 3D
Font MS Sans Serif, Normal, 8, Tipo de letra a ser mostrada no objeto
Castanho
Name FiltroVe Nome do objeto
ReadOnly True Objeto apenas para leitura, no permitida alterao do
seu contedo.
Edit (encontrado na pgina Standard)- que montar o nosso filtro em linguagem pura
SQL, ele ficar invisvel em modo de execuo, altere as seguintes propriedades:
Propriedade Valor Descrio
Name FiltroSQL Nome do objeto
Visible False Se o objeto ficar visvel
116
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
BitBtn (encontrado na pgina Additional) - boto que servir para limpar o filtro, ficar
inicialmente desabilitado em modo de execuo, altere as seguintes propriedades:
Propriedade Valor Descrio
Name ButLimpar Nome do objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\CLEAR.BMP
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Hint Apaga o filtro existente Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Caption &Limpar Label do Objeto
Enabled False Habilitao para o uso
BitBtn (encontrado na pgina Additional) - boto que servir para confirmar o filtro, ele
ficar inicialmente desabilitado em modo de execuo, altere as seguintes
propriedades:
Propriedade Valor Descrio
117
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
BitBtn (encontrado na pgina Additional) - boto que servir para abandonar o filtro,
altere as seguintes propriedades:
Propriedade Valor Descrio
Kind bkCANCEL Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Name ButCancela Nome do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Hint Cancela o filtro editado Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Caption &Cancelar Label do Objeto
Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fFiltro.
O cdigo para este objeto simples requer apenas que voc compreenda que o formulrio
deve fazer. Este formulrio servir de base para a montagem de um filtro que ser mostrado por
um dbGrid construdo no segundo formulrio, devemos devolver o cdigo que completar a
execuo de um objeto Query colocado no segundo. Ex.: SELECT * FROM BASICO WHERE
[condio criada no formulrio] :
118
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo caso contrrio atribui o valor
+ ' ' + cbCriterio.Text + '''' + EditCompara.Text + ''')'; escolhido >, < , >=, <= e <>
+ caso o sistema que voc desenvolver tenha campos do tipo Data altere a linha do
critrio para o seguinte:
if (cbCriterio.ItemIndex = 6) then Critrio "Dentro de"
if cbCampo.ItemIndex in [nmero do campos data] then V os campos Data
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' + Condio para este tipo de cmp
'Like ''%' +
FormatDateTime('MM/DD/YY',StrToDate(EditCompara.Text))
+ '%'')'
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' + Condio comum para o LIKE
'Like ''%' + EditCompara.Text + '%'')'
else As outras condies
if cbCampo.ItemIndex = in [nmero do campos data] then V os campos Data
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
cbCriterio.Text + '''' +
FormatDateTime('MM/DD/YY',StrToDate(EditCompara.Text)) + ''')'
else Condies para outros campos
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo + ' ' +
cbCriterio.Text + '''' + EditCompara.Text + ''')';
+ ...o resto ficar idntico. No esquea no comando USES colocar a biblioteca SysUtils
para a funo FormatDateTime
Cdigo para o boto butE, quando ser escolhida e uma outra condio:
1. D um duplo clique no objeto:
procedure TF_Filtro.ButEClick(Sender: TObject);
begin
FiltroVe.Text := FiltroVe.Text + ' E '; Altera os filtros
FiltroSQL.Text := FiltroSQL.Text + ' And ';
119
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
EditCompara.Enabled := True;
ButLimpa.Enabled := True;
120
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Necessitamos agora criar uma varivel comum que devolver o cdigo SQL para a tela
secundria:
var
F_Filtro: TF_Filtro;
implementation
{$R *.DFM}
121
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
unit Ffiltro;
interface
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
{$R *.DFM}
uses
fSelCate;
if (cbCriterio.ItemIndex = 6) then
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + 'Like ''%' + EditCompara.Text + '%'')'
else
FiltroSQL.Text := FiltroSQL.Text + '(' + NomeCampo
+ ' ' + 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;
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButLimpa.Enabled := True;
ButE.Enabled := False;
123
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
ButOu.Enabled := False;
ButOk.Enabled := False;
end;
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButLimpa.Enabled := True;
ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
end;
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
ButLimpa.Enabled := False;
end;
124
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
F_SelCate.CampTrecho := EditCompara.Text;
if F_SelCate.Inicio = mrOk then
EditCompara.Text := F_SelCate.CampTrecho;
end;
end;
end.
Vamos criar um formulrio idntico a este que servir para o gerenciamento do filtro:
125
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Query (encontrado na pgina Data Access) - Query que se alternar com a tabela, altere
as seguintes propriedades:
Propriedade Valor Descrio
DatabaseName AliasDisco Nome do Alias ou a localizao do diretrio das
tabelas
SQL SELECT * FROM BASICO Comando SQL para consulta
Name QryBasico Nome do objeto
126
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
BitBtn (encontrado na pgina Additional) - boto que servir para montagem do filtro,
altere as seguintes propriedades:
Propriedade Valor Descrio
Caption Fil&trar Label do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\FIND.BMP
Hint Montagem do Filtro Ajuda on-line para o objeto especfico
Name ButFiltrar Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
BitBtn (encontrado na pgina Additional) - boto que servir para editar o campo
selecionado no grid, altere as seguintes propriedades:
Propriedade Valor Descrio
Caption &Editar Label do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\FOLDRDOC.BMP
Hint Edita campo selecionado Ajuda on-line para o objeto especfico
Name ButEditar Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
BitBtn (encontrado na pgina Additional) - boto que servir para editar o filtro, altere as
seguintes propriedades:
Propriedade Valor Descrio
Kind bkClose Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Name ButFechar Nome do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Caption &Fechar Label do Objeto
dbGrid (encontrado na pgina Data Controls) - Objeto Grid que mostrar os campos,
altere as seguintes propriedades:
Propriedade Valor Descrio
DataSource DSDocum Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Name dbGridBasico Nome do objeto
Font MS Sans Serif, Normal, 8, Azul Tipo de letra a ser mostrada para os campos
Marinho
Options dgTitles, dgIndicator, dgColLines, Opes do Grid
dgRowLines, dgRowSelect
TitleFont MS Sans Serif, Negrito, 8, Tipo de letra a ser mostrada para o ttulo dos campos
Castanho
127
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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)
var
F_ConDisc: TF_ConDisc;
implementation
{$R *.DFM}
uses
fFiltro, Utiliza a Unit para a montagem do filtro
fEdtDisc; Utiliza a Unit para a edio do registro
procedure TF_ConDisc.Inicio;
begin
TabBasico.Open; Inicia a tabela
ShowModal; Mostra o formulrio em modo modal
end;
Cdigo para o boto Filtrar, quando for solicitada a edio do filtro.
1. D um duplo clique no objeto butFiltrar:
procedure TF_ConDisc.ButFiltrarClick(Sender: TObject);
begin
if ButAtivaDesativa.Down then Verifica se o boto de prender o filtro
begin est pressionado.
MessageDlg('Desative a filtragem antes de editar os filtros...',
mtInformation, [mbOK], 0);
exit;
end;
128
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
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:
129
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
ShowModal;
end;
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
end.
131
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Captulo VIII
Relatrios
132
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Cancele quaisquer opo que aparea e ative no menu principal File | Connections...,
lembra-se do Alias pois aqui precisamos criar uma conexo para a nossa base de dados, pressione
o boto New e informe Name: DiscoAPP, Type: DBASE(IDAPI) e Data File Path:
C:\SISTEMA\CADDISCO, pressione o boto Save e OK.
No menu principal opo File | New..., escolha a opo Columnar Report, clique no
boto Style e escolha o estilo do relatrio que mais lhe agrade e caso voc deseje pode marcar o
estilo escolhido como default atravs da opo Use As Default clique no boto OK, e clique no
boto OK e a seguinte tela ser mostrada:
133
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
135
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Criaremos agora uma janela simples de dilogo, onde selecionaremos um cdigo inicial e
final para os cdigos do CD.
BitBtn (Localizado na pgina Additional) - crie dois botes para confirmar ou cancelar a
emisso do relatrio:
Propriedade Valor Descrio
Kind bkOk e bkCancel Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Caption &OK e &Cancelar Label do objeto
Edit (Localizado na pgina Standard) - dois objetos de edio para insero do cdigo
inicial e final:
Propriedade Valor Descrio
Text Texto a ser apresentado inicialmente para o objeto
Font MS Sans Serif, Normal, 8, Azul Tipo de letra a ser mostrada no objeto
Marinho
136
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fDgGeral.
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; Inicializa as funes
function GetCodFinal: String;
public
property CampInicial: String read GetCodInicial; Cria tipo caractere as variveis,
property CampFinal: String read GetCodFinal; apenas como sada
end;
var
F_DgGeral: TF_DgGeral;
implementation
{$R *.DFM}
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
A idia simples, construir um formulrio em branco, sem borda, este ser chamado
atravs do menu principal e solicitado a informao do cdigo do CD a imprimir, neste
formulrio ter os objetos de acesso a Tabela (Table e DataSource) associado ao objeto DBImage
138
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
139
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
+
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
QRLabel
QRMemo
QRDBText
QRDBCalc
QRSysData
Imprime vrias informaes sobre o sistema tais como: nmero da pgina, data,
hora ou ttulo do relatrio.
QRShape
QRPreview
142
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
143
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
144
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Propriedade Valor Descrio
AutoSize True Dimensiona automaticamente o tamanho
DataSource DsBasico DataSource vinculado
DataField Cod_Disco 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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Atravs deste objeto voc tem acesso e controle a rotinas mais internas atravs da MCI
(Media Control Interface). Essas rotinas podem ser programadas para acessar toda a possibilidade
do mundo multimdia. Com este objetos estas rotinas se tornam extremamente simples e intuitivas
para seu uso, como veremos a seguir.
Objeto TMediaPlayer
Para criar uma simples aplicao multimdia crie um novo projeto, e arraste o objeto
para o formulrio, automaticamente criado uma barra de tarefas multimdia, conforme a figura
abaixo:
Depois de completos estes simples passos voc j pode rodar o programa. Pressione o
boto verde para ouvir o som do arquivo selecionado. Mas de repente voc no ouviu nada, no
se desespere a causa pode ser um destes problemas
1. Voc entrou com o nome do arquivo invlido.
2. Seu sistema de multimdia no est correto.
3. A propriedade AutoOpen no est true.
147
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Podemos tambm alterar o arquivo a qual queremos ouvir, para isto insira o objeto
Um ajuste pode ser feito para permitir que o objeto seleo tenha acesso apenas as
extenses AVI , WAV, or MID. Podendo ser colocado de duas maneiras diferentes, na
propriedade Filter do objeto OpenDialog1:
1. Arquivos Multimdia (*.avi; *wav; *.mid) | *.avi;*.wav;*.mid
2. Arquivo AVI (*.avi) | *.avi
Arquivo WAVE (*.wav) | *.wav
Arquivo MIDI (*.MID) | *.mid
148
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Com estes dois pontos frescos em nossa mente, podemos iniciar o nosso estudo sobre os
aspectos do objeto TMediaPlayer.
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.
possvel identificar o boto pressionado atravs do evento OnClick, aqui esto todos os
tipos gerados pelo TMPBtnType:
9 btPlay: Quando pressionado o boto verde, Iniciar.
9 btPause: Quando pressionado o boto amarelo, Pausa.
149
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
9 mci_Notify_Successful: Comando completado com xito
9 mci_Notify_Superseded: Comando suspenso por outra funo
9 mci_Notify_Aborted: Funo corrente foi interrompida
9 mci_Notify_Failure: Algum erro ocorreu.
O Delphi no reconhece estas diretivas de mensagem, mas ele converte para constantes
do tipo:
9 nvSuccessful indicando o xito.
9 nvSuperseded indicando que est suspenso, provavelmente por causa de uma pausa.
9 nvAborted messages indicando que foi pressionado o boto parar, ou causa devido ao
fechamento do arquivo.
150
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
Crie uma nova procedure Private chamada SetMode, e insira o seguinte cdigo:
procedure TForm1.SetMode;
begin
Edit4.Text := MediaPlayer1.FileName;
case MediaPlayer1.Mode of
mpNotReady: Edit3.Text := 'mci_Mode_Not_Ready';
mpStopped: Edit3.Text := 'mci_Mode_Stop';
mpPlaying: Edit3.Text := 'mci_Mode_Play';
mpRecording: Edit3.Text := 'mci_Mode_Record';
mpSeeking: Edit3.Text := 'mci_Mode_Seek';
mpPaused: Edit3.Text := 'mci_Mode_Pause';
mpOpen: Edit3.Text := 'mci_Mode_Open';
else
begin
Edit1.Text := 'Dispositivo Inativo';
Edit2.Text := 'Sem messagens';
Edit3.Text := 'No identificado';
Edit4.Text := 'No h arquivo selecionado';
end;
end;
end;
Para a chamada desta rotina click no objeto Ttimer e chame o evento OnTimer e insira o
seguinte cdigo:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
151
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Toda a vez que for usado um boto da barra multimdia, ser disparado o evento onClick
marcando deste modo o tipo de boto pressionado;
As mensagens da mm_MciNotify ocorrem durante toda a execuo da aplicao, tente
utilizar os botes Pausa e Parar no meio de uma execuo.
Quando for selecionar um novo arquivo, afaste um pouco a janela de dilogo e observe
como esto os campos edit.
Desenvolvimento do CD Player
Inicialmente, crie um novo objeto Form baseado na template Blank form e altere as
seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsDialog Estilo da borda do formulrio
Caption CD Player Label do objeto (Tarja azul do formulrio)
Name F_Player Nome do objeto
Position poScreenCenter Posio da janela (centralizado)
152
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
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.
153
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls, MPlayer, MMSystem;
type
TF_Player = class(TForm)
CD: TMediaPlayer;
Timer1: TTimer;
LinhaStatus: TPanel;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
LblTrack: TLabel;
LblTime: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure CDPostClick(Sender: TObject; Button: TMPBtnType);
procedure CDNotify(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
TrilhaCorrente: byte;
FinalTrilhaCorrente: Longint;
TrilhaLidas: boolean;
CDPlaying, CDPaused: boolean;
TamTrilha: array[1..100] of LongInt;
function CDPos(Sender:TObject; Trilha, Min, Sec: byte): Longint;
procedure InitCD(Sender:TObject);
procedure ResetCD(Sender:TObject);
public
{ Public declarations }
end;
var
F_Player: TF_Player;
implementation
{$R *.DFM}
154
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
const
ModeStr: array[TmpModes] of string[10] = ('No Lido', 'Parado', 'Tocando',
'Gravando', 'Pesquisando', 'Pausado', 'Aberto');
{ Para o CD Player }
CD.Stop;
CDPlaying := False;
CDPaused := False;
end;
155
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
case CD.Mode of
mpStopped:
begin
{ Inicializa o CD para ser lido }
if not TrilhaLidas then
InitCD(CD);
{ Mostra os Labels }
LblTrack.Caption := IntToStr(Trilha);
LblTime.Caption := strMinuto + ':' + strSegundo;
end;
end;
end;
156
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
end.
157
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 propriedades e mtodos;
Controle ao acesso as propriedades;
Propriedades de leitura e escrita;
Enviando e recebendo mensagens atravs dos componentes.
Criando Componentes
Componentes so como blocos de construo para as aplicaes Delphi. Voc poder
construir uma aplicao simplesmente adicionando estes blocos e modificando os eventos,
propriedades ou mtodos. Todos os componentes possuem duas propriedades em comum: Name e
Tag. Alguns componentes esto distribudos na Component Pallete. Mas alguns componentes
(TApplication, TMenu, TMenuItem, e TScreen) so disponveis apenas atravs de seu cdigo.
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
File | New... selecione a pgina New e o item . Ser mostrada a janela da Component
Expert. Informe os seguintes parmetros conforme o desenho abaixo:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
CustComp1 = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
public
159
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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;
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).
161
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
begin
Result := fDemoProp;
end;
Na seo private crie uma nova varivel com base no tipo definido:
private
fDemoProp:Integer;
fNovaProp:TDirecao;
162
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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);
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
+
Para os objetos fora do painel: altere os objetos Labels da esquerda a propriedade
Caption (Ex: Usurio, Companhia) e os da direita a propriedade Name (Ex: UserName,
CompanyName)
+ A propriedade Name para todos os componentes, na ordem que eles aparecem so:
Objeto Tipo Objeto Tipo Objeto Tipo Objeto Tipo
ProgramIcon TImage ProductName TLabel Version TLabel Copyright TLabel
Comments TLabel Label1 TLabel UserName TLabel Label2 TLabel
CompanyName TLabel Label3 TLabel WinVersion TLabel Label4 TLabel
DosVersion TLabel Label5 TLabel CPU TLabel Label6 TLabel
FreeMemory TLabel Label7 TLabel FreeDisk TLabel FreeResources TLabel
F_Sobre TForm Panel1 TPanel
166
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
Delphi Users Guide
Delphi Component Writers Guide
Delphi Database Aplication Developers Guide
SQL Links Users Guide
InterBase Users Guide
InterBase Language Reference
InterBase Data Definition
ReportSmith Creating Reports
Toda a documentao encontrada em forma de livros e modo on-line (para o segundo
caso faz-se necessria a instalao do ACROBAT Reader 2.0 que acompanha o produto).
Hardware/Software requeridos
O Delphi Client/Server requer:
Windows 3.1 ou superior
40 megabytes de espao livre para a instalao mnima
90 megabytes de espao livre para a instalao completa
um processador 80386 ou maior (486 recomendado)
8 megabytes de RAM
Para instalar, rode o programa INSTALL.EXE direto do CD ROM ou do disquete e
prossiga com as instrues. Sero includas informaes adicionais no arquivo README.TXT
normalmente instalado no diretrio \DELPHI.
168
Apndice B
Converso de Campos
possvel, com o DELPHI, criarmos um mesmo sistema que rode em diferentes tipos de
bases, atravs de um nico ALIAS. Para isto precisamos que a definio, tamanho e nome dos
campos e tabelas sejam necessariamente os mesmos. Abaixo est a converso para quatro bases
lgicas de dados:
Sintaxe SQL - para InterBase, ORACLE , Informix entre outras.
BDE Lgico - A chamada do campo interna ao DELPHI.
Paradox - Bases do tipo Paradox.
dBASE - Bases do Tipo .DBF.
169
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
170
Apndice C
Para no ficar quaisquer dvidas sobre o objeto tQuery , vamos utiliz-lo para a
demonstrao de uma pequena aplicao, neste exemplo, utilizaremos a base de dados encontrada
no diretrio C:\DELPHI\DEMOS\DATA utilizaremos as tabelas: Customer, Orders, Parts e
Items. A idia mostrar um formulrio com o nome do cliente ligado a um Grid com todas as
encomendas pertencentes a este cliente. Conforme a figura abaixo:
Se os registros contendo os detalhes dos pedidos estivessem todos em uma nica tabela, a
juno poderia ser facilmente realizada pela definio das propriedades MasterSource e
171
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Por conseguinte, para cada objeto DataSet tambm colocado no formulrio um objeto
DataSource. Finalmente, so adicionados objetos de caixa de edio de texto, um objeto Grid
para as linhas da encomenda e um objeto dbNavigator ligado a tabela de Customer, rode o
projeto.
objeto Grid est ligado ao objeto tQuery (atravs do objeto DataSource), ento este
se atualiza automaticamente com os novos resultados das consultas.
172
Apndice D
Imprimindo um Formulrio
Para imprimir um formulrio no tem nenhum segredo, existe o comando PRINT
relacionado a formulrios, o problema se inicia quando o formulrio ultrapassa as dimenses da
tela do seu monitor, ou seja, a largura e altura dele maior que a tela. Digamos um formulrio
qualquer que tenha a propriedade HorzScrollBar.Range = 768 e VertScrollBar.Range = 1008 (isto
corresponde a uma folha de papel tamanho A4).
173
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
175
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Exemplos de Mscaras:
Tipo Mscara Entrada Formatao Sada
Telefone !\(999\)000-0000;1;_ 0613873350 (061)3873350 (061)387-3350
CEP 00000\-9999;0;_ 73015020 73015-020 73015020
Hora !90:00:00 >LL;0;_ 100043PM 10:00:43 PM 22:00:43
176
Apndice F
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
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
178
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
begin
if OpenDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
Table1.Open;
AssignFile(Arq, OpenDialog1.FileName);
Reset(Arq);
if not EOF(Arq) then
repeat
ReadLn(Arq,Texto);
with Table1 do
begin
Insert;
i := 0;
FieldByName('EmpNo').AsString := MontaVariavel;
FieldByName('LastName').AsString := MontaVariavel;
FieldByName('FirstName').AsString := MontaVariavel;
FieldByName('PhoneExt').AsString := MontaVariavel;
FieldByName('HireDate').AsString := MontaVariavel;
FieldByName('Salary').AsString := MontaVariavel;
Post;
end;
until EOF(Arq);
CloseFile(Arq);
Table1.Close;
Screen.Cursor := crDefault;
end;
end;
Vamos agora importar o arquivo (no caso Employee), o funo do comando AssignFile e
inicar um objeto de arquivo texto (determinada pelo tipo de varivel TextFile) e o comando
Reset prepara o objeto iniciado para a gravao. Os comandos de leitura so Read (L um
caractere de determinado arquivo) e ReadLn (L uma linha de determinado arquivo) ento o
trabalho agora ser de separar em pedaos a linha lida isto realizado na funo MontaVariavel
que ler pedaos demarcados do arquivo exportado.
179
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
Apndice G
180
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
6. Como chamar um outro programa (tipo o notepad do Windows ) a partir de um aplicativo
(de trs maneiras diferentes: normal, maximizado e minimizado):
WinExec(C:\windows\notepad.exe, SW_SHOWNORMAL);
WinExec(C:\windows\notepad.exe, SW_SHOWMAXIMIZED);
WinExec(C:\windows\notepad.exe, SW_SHOWMINIMIZED);
7. Como varrer uma tabela inteira:
Table1.First;
if not Table1.Eof then
repeat
{ seus comandos para a tabela }
Table1.Next
until Table1.Eof;
8. Como interceptar as teclas de funo:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key = VK_F5 then
ShowMessage(Voc pressionou a F5);
end;
{ pode ser usado da VK_F1 a VK_F12 }
9. Como os valores de campos de uma tabela para outra:
{ Este exemplo copia apenas tabelas de mesma estrutura }
var
Num: SmallInt;
begin
for Num := 0 to TabelaOrigem.FieldCount - 1 do
begin
TabelaDestino.Insert;
TabelaDestino.Fields[Num].Assign(TabelaOrigem.Fields[Num]);
TabelaDestino.Post;
end;
end;
10. Como verificar se um campo inteiro par ou mpar:
function TestaParaPar(TestaInteiro : Integer) : boolean;
begin
if (TestaInteiro div 2) = (TestaInteiro/2) then
result := True
else
result := False;
end;
11. Como verificar se uma string contm um inteiro:
function IsInteger(TestaString: String) : boolean;
begin
try
StrToInt(TestaString);
except
On EConvertError do result := False;
else
result := True;
end;
end;
12. Como subtrair datas:
function SubData(DataEmprestimo: TDataTime) : Integer;
begin
result := Date - DataEmprestimo;
end;
181
Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Borland
182