Академический Документы
Профессиональный Документы
Культура Документы
Fernando Anselmo
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Todos os nomes dos produtos citados so marcas registradas da Borland International, Inc.
Outros produtos citados so marcas registradas no respectivo cabealho
As vrias Marcas Registradas que aparecem no decorrer deste livro. Mais do que simplesmente listar esses nomes e informar quem possui seus direitos de
explorao, ou ainda imprimir o logotipo das mesmas, o autor declara estar utilizando tais nomes apenas para fins editoriais, em benefcio exclusivo do dono da
marca registrada, sem inteno de infringir as regras de sua utilizao.
ii
SUMRIO
Desvendando o Caminho das Pedras
INTRODUO
Delphi, como Soluo para Desenvolvedores
CAPTULO I
Conceito de Programao Orientada a Objeto
Orientao a Objeto
Object Pascal
Smbolos Especiais
Palavras Reservadas
Nmeros
Constantes
Expresses
Identificadores
Declaraes
Blocos de Procedimentos ou Funes
Caractersticas de Objetos
Programando com objetos Delphi
Renomeando os objetos e os componentes
CAPTULO II
Conhecendo o Delphi
Elementos Visveis
Form
Code Editor
Component Palette
Object Inspector
SpeedBar
Elementos no Visveis
Project Manager
Menu Designer
Fields Editor
Repositrio de Objetos
Estrutura de Aplicaes com o Delphi 2.0
Implementao efetiva
Objetos Data Module
Dicionrio de Dados Escalvel
Herdando os Formulrios
Ferramentas Auxiliares de SQL
Monitor SQL
SQL Explorer
InterBase NT - Banco de Dados Relacional
CAPTULO III
Projeto Piloto
Criando o Modelo Relacional
Trabalhando com DataBase Engine Configuration
Criando o Alias
iii
Trabalhando com DataBase DeskTop
Criando o Banco de Dados via Estrutura
Criando os Relacionamentos via Estrutura
Criando o Banco de Dados via SQL
Observaes da utilizao do SQL com o dBase
CAPTULO IV
Trabalhando com o Menu
Metendo a Mo na Massa
Criando a janela do menu
Inserindo os Cdigos Iniciais
Iniciando os comandos do Menu
Colocando os comandos para o Auxlio
Criando a janela Sobre o Sistema
Criando e alterando os objetos
Associando o form Sobre o Sistema ao menu
Criando a janela Splash
Criando o acesso a Base de Dados
CAPTULO V
Janela para as Tabelas
Reabrindo o seu Projeto
Alterando as Janelas Criadas
DataModules ?
Modificando as Tabelas e as Ligaes
Alterando os campos da tabela
Codificando o DataModule
Controlando a duplicao dos Campos-Chave
Finalizando o DataModule
Alterando o Formulrio
Modificando os Labels e Campos
Objeto DBNavigator
Modificando os Paineis
Modificando a Janela
Criando o terceiro Painel
Programando no formulrio
Preservando as reas de Memria
Criando Funes Globais
Alterando o Menu para receber o formulrio
CAPTULO VI
Trabalhando com janela Pai X Filha
Criando a janela automaticamente
Sobre os DataModules
Trabalhando com as Tabelas
Trabalhando com os Campos
Controlando o DataModule
Contadores
Validando os Campos
Alterando a Janela Criada
Organizando os Panels
Modificando os campos e Labels
Organizando os Panels
iv
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Modificando a Janela
Trabalhando com Grids
Finalmente, a programao
Consulta
Trabalhando com a rea de Transferncia
Utilizando o objeto OpenDialog
Criando o formulrio para o cadastro das msicas
Criando novos Procedimentos Globais
Alterando o Menu para receber o formulrio
CAPTULO VII
Trabalhando com consultas
Criando consultas para tabelas
Trabalhando com Grids
Programando no formulrio
Enviando e recebendo variveis
Alterando o formulrio fCateg
Alterando o formulrio fBasico
Criando consultas para o cadastro
Consultas SQL
Realizando Consultas com Filtros
Programando o formulrio
Criando o formulrio Gerente do Filtro
Programando o formulrio
Editando os registros
CAPTULO VIII
Relatrios
Trabalhando com o ReportSmith
Criando relatrio com o ReportSmith
Organizando os campos do relatrio
Associando o relatrio ao aplicativo
Programando o formulrio
Imprimindo atravs do Formulrio
Criando o Cdigo
Trabalhando com o QuickReport
CAPTULO IX
Multimdia
O que multimdia ?
Delphi and Multimedia
Objeto TMediaPlayer
Colocando as propriedade em modo Runtime
Pesquisando variveis em modo RunTime
Inserindo o multimdia para o Sistema
Desenvolvimento do CD Player
CAPTULO X
Novos Componentes
Criando Componentes
A Classe TComponent
Um Componente Simples
Adicionando o Componente a Palheta
Criando Propriedades
v
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Mtodos de Acesso
Criando novos tipos
Pensando em Objetos
Construindo um Objeto
Finalmente
APNDICE A
Documentao
Hardware/Software requeridos
APNDICE B
Converso de Campos
Tipos de Dados para o InterBase
APNDICE C
Aplicao rpida com o Objeto Query
APNDICE D
Imprimindo um Formulrio
APNDICE E
Trabalhando com Mscaras
APNDICE F
Trabalhando com Importao e Exportao
APNDICE G
Doze melhores dicas para o Delphi
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
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
Objeto - qualquer estrutura modular que faz parte de um produto. Uma janela por
exemplo, um objeto de uma casa, de um carro ou de um software com interface
grfica para o usurio.
Atributos - So as caractersticas do objeto, como cor e tamanho, a janela, por exemplo, tem atributos
como o modelo, tamanho, abertura simples ou dupla, entre outros.
Encapsulao - um mecanismo interno do objeto escondido do usurio. Uma pessoa pode abrir
uma janela girando a tranca sem precisar saber o que h dentro dela.
9
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Ao - a operao efetuada pelo objeto. Todas as janelas, por exemplo, controlam a iluminao e
temperatura ambiente, dependendo do seu design.
Herana - um objeto novo nem sempre criado do zero. Ele pode herdar atributos e aes de outros
j existentes. Um basculante herda atributos das janelas e das persianas.
Polimorfismo - a capacidade de objetos diferentes reagirem segundo a sua funo a uma ordem
padro. O comando abre, por exemplo, faz um objeto entrar em ao, seja ele uma janela, uma
porta ou uma tampa de garrafa.
Ligao - quando um objeto conecta a sua ao a outro. Um sensor de claridade, por exemplo, ativa
o acendimento automtico da iluminao de rua.
Embutimento - Permite a um objeto incorporar funes de outros, como um liqidificador que mi
carne com a mudana do tipo da lmina.
Object Pascal
Object Pascal uma linguagem Orientada a Objetos no pura mas hbrida por possuir
caractersticas de programao no s visual mas tambm escrita, para os programadores que j conhecem
tcnicas de estruturas de programao, com o C, Basic, Pascal ou xBASE entre outras linguagens a Object
Pascal providncia uma migrao de forma natural oferecendo um produto de maior complexibilidade.
Object Pascal fora a voc executar passos lgicos isto torna mais fcil o desenvolvimento no ambiente
Windows de aplicaes livres ou que utilizam banco de dados do tipo Cliente/Servidor, trabalha com o
uso de ponteiros para a alocao de memria e todo o poder de um cdigo totalmente compilvel. Alm
disso possibilita a criao e reutilizao (vantagem de re-uso to sonhado com a Orientao a Objetos)
de objetos e bibliotecas dinmicas (Dynamic Link Libraries - DLL).
Object Pascal contm todo o conceito da orientao a objetos incluindo encapsulamento, herana
e polimorfismo. Algumas extenses foram includas para facilitar o uso tais como conceitos de
propriedades, particulares e pblicas, e tipos de informaes em modo run-time, manuseamento de
excees, e referncias de classes. O resultado de toda esta juno faz com que Object Pascal consiga
suportar as facilidades de um baixo nvel de programao, tais como:
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:
Letras - do Alfabeto Ingls: A at Z e a at z.
Dgitos - Decimal: 0 at 9 e HexaDecimal: 0 at 9 e A at F (ou a at f)
Brancos - Espao (ASCII 32) e todos os caracteres de controle ASCII (ASCII 0 at ASCII 31),
incluindo final de linha e Enter (ASCII 13).
Especiais - Caracteres: + - * / = < > [ ] . , ( ) : ; ^ @ { } $ #
10
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Palavras Reservadas
A Object Pascal se utiliza das seguintes palavras reservadas, no podendo as mesmas serem
utilizadas ou redefinidas:
And Exports Library Set
Array File Mod Shl
As Finnaly Nil Shr
Asm For Not String
Begin Function Object Then
Case Goto Of To
Class If On Try
Const Implementation Or Type
Constructor In Packed Unit
Destructor Inherited Procedure Until
Div Initialization Program Uses
Do Inline Property Var
Downto Interface Raise While
Else Is Record With
End Label Repeat Xor
Except
Uma outra lista a seguir, apresenta as diretivas que so utilizadas em contextos de identificao de
objetos:
Absolute Export Name Published
Abstract External Near Read
Assembler Far Nodefault Resident
At Forward Override Stored
Cdecl Index Private Virtual
Default Interrupt Protected Write
Dynamic Message Public
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:
11
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
As expresses obdecem as regras bsicas de lgica para a precedncia da execuo das operaes.
Identificadores
Identificadores podem ser constantes, tipos, variveis, procedures, funes, unidades, programas e
campos de registros.
begin
{ ... comandos iniciais ... }
with form1 do
12
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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 ... }
13
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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
14
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
{ ... 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};
O cabealho da procedure composto pelo nome do procedimento e variveis que sero recebidas
(ou modificadas atravs da declarao var, ex: procedure teste(var x:string);).
15
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Function
function {cabealho} : {resultado}; var {declarao das variveis}; {bloco de comandos};
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.
16
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
Form1 a chamada de instncia ao tipo TForm1. Esta varivel refere-se ao formulrio em si,
aonde ser adicionado componentes e desenhado a interface entre o computador e o usurio que for operar
o sistema. sempre notado declaraes de uma ou mais instncias referidas ao tipo de objeto.
Futuramente ser mostrado o poder deste tipo de declaraes quando falarmos sobre janela MDI (Multiple
Document Interface - Interface de documento mltiplos) gerenciando vrias janelas filhas, no
permitindo que estas janelas filhas saiam do espao criado pela janela pai.
17
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Em nosso formulrio, colocaremos um boto que, em tempo de execuo, ao ser dado um clique
com o mouse sobre este objeto, o formulrio mude sua cor. Aperte a tecla F12 para retornar a viso do
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.
Rode o projeto, clicando no boto (Run), d um clique no boto e veja o que acontece. Pare a
aplicao fechando a janela com Alt+F4.
S por curiosidade, salve este arquivo, feche-o e abra o arquivo UNIT1.DFM (com a opo File
| Open File...) notaremos que o Delphi criou um arquivo com todas as propriedades dos objetos criados e
que a declarao do objeto Form1 engloba todos os outros, noes de Encapsulamento.
18
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
19
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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.
20
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Voc pode imaginar que o formulrio um objeto que contm outros objetos. Sua aplicao ficar
localizada em um formulrio principal e este interagir com outros formulrios criados. possvel
aumentar, mover ou ocupar completamente a tela do monitor, ou at mesmo ultrapass-la. Um formulrio
bsico inclui os seguintes componentes:
Controles de menu;
Botes de maximizao e minimizao;
Barra de ttulo; e
Bordas redimensionveis.
O cdigo gerado, na rea conhecida como Code Editor, fica exatamente atrs do objeto
formulrio, clique na barra de notas, em Unit1, se alguma coisa for desconhecida para voc, leia maiores
explicaes no Captulo I.
possvel enviar um formulrio para a impressora, para isto existem duas maneiras:
1. Tipo um PrintScreen de Tela, coloque o seguinte comando [Nome do formulrio].Print;
no evento onShow do formulrio; ou
2. Para imprimir um formulrio no tamanho de um papel A4, atravs do uso de comandos da
biblioteca Printer, veja o Apndice D para maiores detalhes.
Code Editor
O editor de cdigos providncia total acesso ao cdigo gerado pelo projeto, incluindo alguns dos
mais poderosos recursos para a edio. Pode ser selecionado tipos de cores para os elementos do programa
(como por exemplo comentrios, palavras reservadas, cdigos assembler, ...) para tanto a partir do menu
principal entre em Tools | Options..., localize a pgina Colors.
Para outras informaes adicionais sobre o modo de usar este editor, procure referncias no
Help OnLine no tpico Code Editor.
Ao ser aberto um novo projeto, o Delphi gera automaticamente na pgina do Code Editor uma
Unit com o arquivo cdigo (.PAS). Para ver o cdigo de uma Unit em particular, simplesmente Click na
tabulao de pgina. O Code Editor mostrar sempre o nome do arquivo corrente ativo na tabulao de
pgina.
possvel alternar entre o objeto Form e a Code Editor atravs do pressionamento da tecla
F12, do boto boto (Toggle Form/Unit) da SpeedBar, ou ainda atravs das opes do menu View |
Toggle Form/Unit. (curiosidade: o acesso rpido atravs da tecla Alt + Letra sublinhada para esta opo
est marcado sobre a letra G)
Component Palette
Componentes (ou objetos) so os elementos que voc usar para trabalhar com a aplicao. Foram
includos objetos em vrias pginas, tais como caixas de dilogos e botes, a palheta inclui tambm alguns
espaos em branco para ser permitida a adio de novos objetos. Alguns objetos no sero visveis
enquanto a aplicao estiver executando, eles fazem parte do servio da DDE (Dynamic Data Exchange).
21
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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.
possvel a personalizao da SpeedBar colocando nela os caminhos do menu principal que voc
mais utiliza, bastando para isso:
1. Redimensione a SpeedBar. Para tanto posicione o cursor do mouse sobre o ponto de encontro da
SpeedBar com a Component Palette conforme o desenho abaixo:
2. Quando o cursor do mouse mudar de formato, clique o boto esquerdo do mouse e arraste abrindo
a rea da SpeedBar.
3. Clique com o boto direito do mouse na rea aberta, aparea um menu PullDown contendo entre
outras opes a opo Properties, selecione-a.
4. As categorias e os comando so divididos de acordo com o menu, clique em cima dos comandos
disponveis e arraste-os para a rea aberta de acordo com a sua necessidade, para retirar os botes
da SpeedBar faa o processo inverso.
22
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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.
23
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Fields Editor
Para o Delphi possvel editar e modificar as propriedades de quaisquer campos dos objetos de
tabelas associadas ao banco de dados, a Fields Editor em conjunto com a Object Inspector controlam o
modo de mostrar determinados campos de arquivos, importante lembrar que esta modificao no
afetar os campos da tabela, apenas para o formulrio ativo em questo. Sua utilizao efetiva ser
mostrada a partir do Captulo V.
Add fields... responsvel pela adio de definies de campos da
tabela, possvel inserir um ou mais campos, dependendo de sua
utilizao para o formulrio.
New field... permite a criao de um novo campo, este pode ser a derivao de um ou mais campos da tabela.
Cut envia para rea de transferncia e elimina todas as definies do campo selecionado.
Copy copia para a rea de transferncia todas as definies do campo selecionado.
Paste recebe da rea de transferncia todas as definies do campo selecionado criando-o.
Delete exclui quaisquer definio para os campos.
Select all seleciona todas as definies dos campos.
Retrieve Attributes atualiza os atributos do campo selecionado com os campos do dicionrio de dados.
Save attributes salva os atributos do campo selecionado para o dicionrio de dados.
Save attributes as... salva os atributos do campo selecionado para o dicionrio de dados permitindo a renomeao
do campo.
Associate attributes... faz a associao dos atributos do campo selecionado com determinado campo do dicionrio
de dados.
24
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Unassociate attributes remove a associao dos atributos do campo selecionado com determinado campo do
dicionrio de dados.
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.
25
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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.
26
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 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:
27
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
28
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
29
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Monitor SQL
Um monitor SQL um ferramenta para testes, depurao e execuo de consultas SQL em
aplicaes Client / Server. Isto resulta em um aumento da produtividade de desenvolvimento e melhor
performance da aplicao.
O monitor SQL, intercepta as chamadas entre as mquinas client e o servidor. Esta informao
auxilia ao desenvolvedor em problemas relacionados as declaraes SQL e otimiza este tipo de transao.
Uma srie de caminhos de interceptaes podem ser traados, dependendo da necessidade do
desenvolvedor, para que as informaes a serem colocadas em um relatrio on-line sejam as mais
imprescindveis o possvel. possvel inclusive salvar e imprimir o relatrio gerado para consultas ou
testes posteriores.
30
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
SQL Explorer
A ferramenta SQL Explorer providencia uma informao centralizada do gerenciamento das
demandas da base de dados; tais como, suporte a modificao e criao de tabelas, sinnimos,
procedimentos de gravao, triggers (gatilhos disparados pelo banco) e execuo das regras de negcio
interativas do SQL. Uma ferramenta grfica que proporciona um esquema de integridade da base da dados
e contm as ferramentas essenciais para os administradores de bancos de dados.
O SQL Explorer, unicamente para o Delphi, administra de forma intuitiva e fcil o banco de
dados. A simplicidade de uso da interface grfica um perfeito caminho para representar o complexo
relacionamento que existe no banco de dados do servidor. Apresenta um esquema para informaes em
bancos como Oracle, Sybase, InterBase, Informix, DB2 e outros. O desenvolvedor poder trilhar
campos, tabelas e procedimentos do banco dentro da construo da aplicao Delphi rapidamente,
podendo ser direcionado para mltiplos servidores e mltiplos bancos.
31
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
O SQL Explorer, tambm administra o Dicionrio de Dados. Sua interface de uso simplicado
permite facilmente definir novos domnios para os atributos dos campos e associao entre tabelas.
O InterBase um banco de dados de alta performance produzido pela Borland, como plataforma
para SQL Server. Est disponvel em mais de 15 sistemas operacionais incluindo: DOS e Windows 3.1,
Windows 95, Windows NT, NetWare, SCO, Sun OS, Sun Solaris, HP-UX, IBM AIX, SGI
IRIX, etc.
O InterBase um banco a nvel ANSI SQL 92, suportando eventos programados e excees
ocorridas no modelo por acesso de mltiplos usurios. Oferece chaves de controle a nvel de registros para
arquiteturas Multi-Gerenciais causando um performance muito superior a uma leitura das operaes de
banco, em contrrio das leituras de blocagem de operaes escritas realizadas por outros bancos.
A verso local do InterBase, disponvel apenas com a cpia Client / Server Suite 2.0, providencia
aos desenvolvedores um caminho rpido para o desenvolvimento de prottipos e de sistemas com um
banco de padro ANSI 92 SQL. Esta verso propicia as mesmas funcionalidades da verso multi-usurio
para NT e Unix, incluindo controles de transaes, procedimentos de gravao (stored procedures), uso de
triggers (gatilhos disparados do banco), ou eventos de 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.
32
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
bancos nativo 32 bits, total interatividade com ferramentas SQL, e uma completa documentao em
formato de Help do Windows (arquivos .HLP).
Captulo III
Projeto Piloto
bvio que fica mais simples o aprendizado de uma nova ferramenta quando se faz algum tipo de
aplicativo, principalmente um que seja til, ento ao longo deste estudo, iremos desenvolver um aplicativo
destinado ao Cadastro de Compact Disc (CDs). Todas as pessoas hoje em dia tem montes de CDs, virou
uma espcie de febre, ento, porque no fazer um sistema para cadastr-los e control-los, quanto tempo
voc j perdeu pensando em qual deles est aquela msica que voc quer ouvir? Ou uma capa que seu
filho rasgou, que tal imprimi-la novamente? E no captulo multimdia aprenderemos um mtodo para tocar
o CD.
Para darmos partida ao nosso primeiro aplicativo (Projeto Piloto), definiremos inicialmente as
nossas necessidades:
1. Permitir o cadastro completo e a consulta aos CDs;
2. Ser possvel separar os CDs em categorias, facilitando deste modo a busca e o
armazenamento;
3. Quanto as msicas deve ser permitido o cadastro do autor e o tempo de durao;
4. Permitir a incluso da foto da capa do CD; e
5. Comportar relatrios de conferncia e reimpresso da capa.
O acesso Delphi a arquivos pode ser feito atravs de duas maneiras local ou remoto, sendo a
segunda apenas possvel pela cpia CLIENT-SERVER voltadas a bases de dados mais complexas como
ORACLE ou SYBASE , inicialmente, restringiremos o nosso estudo a base de dados locais conseguida
atravs da verso Desktop. Lembre-se que verso Desktop contm acesso a criao e a definio de
bases dBase e Paradox, alm de outras conseguidas atravs de ODBC.
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.
33
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Vamos agora visualizar um modelo que demonstrar como as tabelas devero se relacionar no
sistema, este modelo tambm facilitar as relaes e a integrao dos formulrios do sistema quando
construiremos nossas consultas e relatrios.
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.
34
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Criando o Alias
O ALIAS simplesmente um apelido (sinnimo) a ser dado para o banco de dados, este apelido
permitir que no lugar de falarmos para ao Delphi que a nossa base se encontra em C:\SISTEMA\... ou
D:\DESENV\SISTEMA\..., simplesmente digamos se encontra em AliasX ou AliasY, isto facilitar o seu
trabalho quando voc por exemplo quiser modificar o diretrio do sistema, basta mudar o endereo do
ALIAS e no sair modificando vrios formulrios.
Outra vantagem em se criar um Alias est na mudana da base, basta reapontarmos o Alias
para outra base que o sistema automaticamente ver estas novas informaes. Lembre-se que para isto ser
possvel necessrio que o nome das tabelas e dos campos sejam necessariamente os mesmos, incluindo o
tamanho e o tipo (no apndice B encontrado uma tabela para a converso das diversas bases de dados).
Para trabalhar com ALIAS o caminho mais interessante e com o Database Engine Configuration,
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.
35
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Lembre-se de apagar as tabelas antes de cri-las novamente. Seno no ser possvel executar
uma nica declarao SQL.
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.
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
36
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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:
37
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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>.
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)
38
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
TMP_MUSICA Char(4),
Primary Key(COD_DISCO, NUM_FAIXA)
);
O SQL para o Paradox no consegue executar a criao de indices referenciais (ou Constraints)
ento para criar este tipo de ndice crie-o atravs da janela de estrutura conforme mostrado anteriormente.
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);
O comando correto para este ndice deveria ser Create Unique Index PK_Unica on Basico
(COD_DISCO); mas isto provoca um erro colocando que no possvel esta declarao, ento coloque
a clusula UNIQUE atravs da janela de estrutura.
Se voc esqueceu de ativar o Select Alias coloque Create Index Cod_Disco on Basico.dbf
(COD_DISCO);
O comando correto para a criao da chave dupla da tabela MUSICA seria Create Index
Chv_Unica on Musica (COD_DISCO, NUM_FAIXA); mas novamente provocado um erro
mostrando a impossibilidade de execuo do comando, ento crie este ndice atravs da janela de
estrutura.
facilmente percebido que o DataBase DeskTop at que tenta colocar todas as bases de dados
compatveis com a linguagem SQL, mas infelizmente ainda no foi nesta verso.
Para as tabelas do tipo ORACLE, INTERBASE, SYBASE e MS SQL Server a criao das
tabelas podem ser feitas tanto pelo modo de estrutura quanto pelas declaraes SQL mas lembre-se que a
alterao das mesmas s poder realizar-se atravs do modo de declaraes SQL. Aqui vo alguns
exemplos destas declaraes:
Create Table MUSICA Criando a tabela MUSICA
(
COD_DISCO Numeric(4,0),
NUM_FAIXA Numeric(2,0),
NOM_MUSICA VarChar(60),
TMP_MUSICA Char(4),
Constraint PK_Unica Primary Key(COD_DISCO, NUM_FAIXA),
Constraint FK_CodDisco_Musica Foreign Key (Cod_Disco)
39
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Ao iniciar o Delphi, foi criado automaticamente um novo projeto, vamos descart-lo e iniciar um
novo. Para tanto:
1. Lembre-se: no captulo anterior criamos o diretrio que abrigar o sistema a ser desenvolvido
- C:\SISTEMA\CADDISCO - aprendemos o que o Alias e estruturamos as nossas tabelas,
se algum destes conceitos ficaram dispersos eu lhe aconselho que retorne ao captulo anterior
2. Crie um novo projeto digitando File e New Application. (Responda negativamente quaisquer
mensagem para gravar o projeto atual).
40
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Foi criado neste momento o objeto MainMenu1 derivado da classe de objeto TMainMenu, a partir
deste objeto vamos criar nosso menu:
2. D um duplo clique em cima do objeto, ou clique na propriedade Items da Object Inspector
aparecer o boto . Clique neste boto.
Observe a tela de propriedades do Object Inspector, neste momento vou me conter em falar das
mais significativas, mas futuramente retomaremos o assunto:
Caption - Define o nome do item de menu, quaisquer nomes so vlidos, incluindo acentos, o
caractere especial & deve ser colocado uma nica vez, ele causa o sublinhado da letra,
tornando-a uma letra (em conjunto com a tecla Alt) de acesso a opo.
Enabled - Define se o item est disponvel ou no para o usurio.
Name - Nome interno do item (colocado automaticamente na escolha do Caption).
ShortCut - Combinao de teclas, para um rpido acesso ao item (alm da letra escolhida
com &).
Inserindo os itens iniciais:
1. Digite &Arquivo na propriedade Caption, em seguida pressione a tecla Enter.
2. Clique no novo espao aberto, criado lateralmente, e digite &Consulta na propriedade
Caption, em seguida pressione a tecla Enter.
3. Proceda da mesma forma criando as opes: &Relatrio e Au&xlio.
4. Clique na opo Arquivo, aparecer um espao vazio abaixo, clique neste espao e digite
&Tabela na propriedade Caption. Ao ser dado Enter o Delphi criar mais um espao
abaixo, digite &Cadastro na propriedade Caption.
5. Abaixo do Cadastro, digite - (sinal de menos) na propriedade Caption (o Delphi criar
uma barra de separao) e altere a propriedade Enabled para False.
6. No novo espao criado, aps a barra, digite &Sair na propriedade Caption e altere a
propriedade ShortCut para Ctrl+X.
7. Clique na opo Tabela, clique com o boto direito do mouse, aparecer um menu pulldown,
clique na opo Create Submenu.
8. Digite &Categoria na propriedade Caption.
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.
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.
41
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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
42
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para o Code Editor.
Abaixo da declarao: Private insira os cdigos:
private Procedures ou Funes Locais.
{ Private declarations }
procedure ShowHint (Sender: TObject); Cabealho de uma procedure Local.
public Procedures ou Funes Pblicas.
{ Public declarations }
end; Final da seo de declarao.
Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para o Form clique no
objeto F_Menu e na pgina Events da Object Inspector, d um duplo clique no evento OnCreate.
1. O Delphi criou a procedure FormCreate a ser iniciada quando o objeto F_Menu for criado.
2. Digite o seguinte comando abaixo do comando begin:
procedure TF_Menu.FormCreate (Sender: TObject);
begin
Application.OnHint := ShowHint; Atribui o valor da procedure ShowHint ao OnHint da
end; aplicao.
Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para o Form clique no
objeto MainMenu1 e entre no Menu Designer, e para cada opo de Menu altere as propriedades
hint e name do seguinte modo:
43
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Rode o projeto, clicando no boto da SpeedBar, ou no menu principal a opo Run e Run,
ou ainda, digite F9.
Teste as opes do menu, veja na linha de Status os hints informados, saia com Alt+F4.
Caso voc esteje usando o Delphi 1.0 troque a procedure ShowHint para:
procedure TF_Menu.ShowHint (Sender: TObject);
begin
LinhaStatus.Caption := Application.hint; Atribui o valor do hint da aplicaco a Propriedade end;
Caption do objeto LinhaStatus.
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.
44
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Caso o F1 no ative o auxlio On-Line, provavelmente o seu menu est com a propriedade
FormStyle em modo fsMDIForm, coloque-a no modo fsNormal. Se mesmo assim ainda no funcionou,
mude a propriedade HelpContext do formulrio para 1.
45
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
HELP_MULTIKEY Ponteiro longo para uma estrutura Mostra o tpico indentificado pela palavra chave
de TMULTIKEYHELP. Esta ou uma chave da tabela alternada.
estrutura especfica de caracteres e
palavras chaves.
HELP_COMMAND Ponteiro longo, contendo a macro Executa um macro help.
para a execuo
HELP_SETWINPOS Ponteiro longo para uma estrutura Mostra um help do windows com um mnimo de
de TMULTIKEYHELP. Esta memria, variando o tamanho e a posio de
estrutura especfica contm o acordo com o dado passado.
tamanho e a posio da janela do
help primrio ou a janela secundria
para ser mostrado.
HELP_FORCEFILE Ignorado. Normalmente passado 0. Executa o WinHelp mostrando o arquivo de
auxlio corrijido.
HELP_HELPONHELP Ignorado. Normalmente passado 0. Mostra o auxlio de como usar o auxlio.
HELP_QUIT Ignorado. Normalmente passado 0. Solicita o fechamento do auxlio ativo.
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:
46
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Elimine o objeto OKButton (boto de OK), clique sobre ele e pressione Delete, clique no objeto
D uma organizada geral quanto a posio dos objetos para voc poder ter uma idia compare o
desenho do seu formulrio para ver se no ficou faltando nada:
Salve o formulrio nas opes de menu File e Save (ou pressione Ctrl+S), o Delphi questionar o
nome e o diretrio, o diretrio o C:\SISTEMA\CADDISCO e para o nome digite fSobre (note
que novamente o nome externo e o mesmo do nome interno diferenciado por _).
47
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
{$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.
48
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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.
49
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Voc pode mover o comando SplashScreen.Free; para o evento OnShow do form F_Menu.
Isto far com que a janela Splash s desaparea quando o menu for ativado.
Infelizmente para os usurios do Delphi 1.0 esta caracterstica de herana no havia sido
implementada ento, faz-se necessrio a construo da tela fSplash atravs de uma cpia da tela fSobre
com a utilizao do comando Save As....
No captulo a respeito das tabelas tambm vimos a impossibilidade de algumas aes produzidas
por clusulas SQL no serem bem vindas em base de dados no totalmente compatveis com a estrutura
do SQL, ento se faz necessrio identificar uma base padro de uma base SQL.
Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para a Code Editor e
localize o procedimento FormCreate associado ao evento OnCreate:
procedure TF_Menu.FormCreate(Sender: TObject);
begin
Application.OnHint := ShowHint;
DBDisco.Connected := True; Inicia o Banco de Dados
end;
A partir do prximo captulo entraremos realmente no que o Delphi capaz com tabelas, mas
antes, necessrio que os conceitos ensinados anteriormente estejam bem fixados, se alguma coisa deu
errada, releia o captulo, ou ento confira o cdigo do F_Menu:
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;
50
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
51
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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?
Captulo V
Tabelas primrias de informao requerem entradas de dados simples, no nosso caso temos a
tabela de categoria, a criao de janelas para a sua manipulao de seus dados no um bicho de sete
cabeas como voc ver a seguir.
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:
52
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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.
53
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
54
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
55
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
begin
if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL
begin
F_Menu.DBDisco.Commit; Gravando as alteraes da tabela
F_Menu.DBDisco.StartTransaction; Reinicia o modo de transaes
end;
end;
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.
56
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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 }
57
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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).
Antes de fazermos quaisquer modificao vamos inicialmente alterar o nome da janela, para tanto
pressione a tecla F11 (aparecer a Object Inspector para o objeto Form2) altere a propriedade Name para
F_Categ.
uses
DMModelo; { Referencia ao DataModule }
58
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Para selecionar simultaneamente vrios objetos, marque o primeiro objeto, segure a tecla
SHIFT e marque os demais.
Qualquer problema para dimensionar o tamanho de objetos use a tecla SHIFT + Setas.
Qualquer problema para acertar a posio de objetos use a tecla CTRL + Setas.
Uma propriedade interessante a FocusControl ela indicar um controle para a posio do
cursor. Ex.: Caso seja digitado ALT+S o cursor se posicionar no objeto EditSig_Categ ou Caso seja
digitado ALT+D o cursor se posicionar no objeto EditDes_Categ.
Objeto DBNavigator
Apresentada pelos botes: nbFirst (primeiro), nbPrior (anterior), nbNext (prximo), nbLast
(ltimo), ndInsert (inserir), ndDelete (excluir), nbEdit (editar), nbPost (confirmar), nbCancel (cancelar) e
nbRefresh (atualizar dados).
59
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Arrume a barra de navegao de modo que no cubra a descrio, se for o caso aumente o
tamanho da janela.
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.
60
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Os botes que criaremos faro duas funes: 1.Sair da janela e 2.Localizao rpida de um
determinado registro.
61
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
62
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Altere agora a instruo do formulrio F_Menu, evento OnClick para o objeto ItemAuxilio1,
para criarmos o objeto F_Sobre e aps a sua chamada destru-lo da rea de memria:
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
with TF_Sobre.Create(Self) do Cria o formulrio em memria
begin
ShowModal; Chama o formulrio atravs da rea aberta
Free; Libera a rea aberta
end;
end;
Cdigo para ativar a Base de dados e as tabelas quando no DataModule, retorne ao formulrio
F_Categ:
1. Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para o Code Editor.
var
F_Categ: TF_Categ;
63
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
implementation
{$R *.DFM}
uses
FMenu, { Menu Principal do Sistema }
DMModelo; { Referencia ao DataModule }
A propriedade cursor no exemplo foi atribuda a unidade Screen que atribui ao sistema o
modelo do cursor, mas possvel tambm atribuir um determinado cursor a um objeto especfico, a
propriedade pode ser alterada para os diversos tipos de cursores default do windows com as figuras que se
seguem:
No necessrio colocar o comando Close para o objeto butFechar pois a propriedade Kind far
isto automtico.
Cdigo para encerrar as tabelas do DataModule quando for dada sada no formulrio, observe que
o usurio no deve poder estar inserindo ou editando registros:
1. No objeto F_Categ, localize-o atravs da Object Inspector, d um duplo click sobre o evento
OnClose:
procedure TF_Categ.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DM_Modelo.DSCategor.State in [dsEdit, dsInsert] then Verifica se o estado do objeto
begin DataSource Edio ou insero
MessageDlg('Cancele a edio (ou insero) da Categoria antes de fechar!', mostra mensagem
mtInformation, [mbOK], 0); de informao
Action := caNone; Cancela a sada da janela
Exit; Sai da procedure
end;
Screen.Cursor := crHourGlass; Faz o cursor virar uma ampulheta
TabCategor.Close; Fecha a tabela
if F_Menu.DBDisco.IsSQLbased then Se a base de dados padro SQL
64
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
65
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
66
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
...
...
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;
67
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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;
68
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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.
69
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
70
Captulo VI
Se voc at agora no sentiu dificuldade em criar e entender o trabalho com tabelas livres, no
sentir tambm dificuldade em criar o formulrio para receber este caso, ao contrrio, aconselho que voc
releia e refaa o captulo anterior.
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.
71
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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
72
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 objeto
73
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
74
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Controlando o DataModule
Agora falta o cdigo, note que a maior parte uma repetio daquilo que j vimos anteriormente:
75
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Lembre-se da utilizao do objeto F_Menu, ento preciso declarar a unidade a qual ele
pertence com o comando USES (abaixo da diretiva de compilao):
{$R *.DFM}
uses
fMenu; { Menu Principal }
Repare que no incio desta Unit tambm existe uma outra declarao Uses, aps a sesso
interface, ento por que no colocar todas essas declaraes em um lugar s? 1 o) O Delphi controlar
(colocando ou removendo) as Units ali colocadas (dependendo dos objetos utilizados) e 2 o) 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:
76
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 }
O comando with utilizado como mtodo de taquigrafia, para no escrevermos vrias vezes o
mesmo nome de um determinado objeto.
Porque no colocarmos todo o cdigo no evento onNewRecord ? Por causa do controle multi-
usurio, imagine, um indivduo A inicia a incluso de um CD, e um indivduo B tambm inicia outra
incluso, como o cdigo do indivduo A ainda no foi gravado no banco, ser dado o mesmo cdigo para
o indivduo B, isto no acontecer se o cdigo for calculado momentos antes de ser gravado o registro,
com o caso do evento BeforePost.
Para confirmarmos as alteraes para a base SQL, pressione novamente a tecla F11 e na pgina
Events, d um duplo click sobre o evento AfterPost:
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:
77
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Com o DataModule o nosso trabalho j est concludo, salve o objeto e confirme o cdigo:
unit DMBasico;
interface
uses
SysUtils, Windows, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables;
type
TDM_Basico = class(TDataModule)
TabMusicaCod_Disco: TFloatField;
TabMusicaNum_Faixa: TFloatField;
TabMusicaNom_Musica: TStringField;
DSBasico: TDataSource;
TabBasico: TTable;
TabMusica: TTable;
DSMusica: TDataSource;
TabBasicoConf: TTable;
TabCategor: TTable;
TabCategorConf: TTable;
DSCategor: TDataSource;
TabBasicoCod_Disco: TFloatField;
TabBasicoNom_Disco: TStringField;
TabBasicoTip_Disco: TStringField;
TabBasicoFot_Capa: TBlobField;
TabBasicoSig_Categ: TStringField;
QryContador: TQuery;
QryContadorMAXOFCOD_DISCO: TFloatField;
procedure DM_BasicoCreate(Sender: TObject);
procedure DM_BasicoDestroy(Sender: TObject);
procedure TabBasicoNewRecord(DataSet: TDataSet);
procedure TabBasicoBeforePost(DataSet: TDataSet);
procedure TabBasicoAfterPost(DataSet: TDataSet);
78
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
var
DM_Basico: TDM_Basico;
implementation
{$R *.DFM}
uses
fBasico, { Cadastro do Bsico }
fMenu; { Menu Principal }
79
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
begin
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
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 }
80
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Crie um quarto objeto Panel para colocar os botes, conforme as instrues do captulo
anterior, para facilitar o trabalho chame o objeto F_Categ, atravs do Project Manaager, clique sobre o
objeto Panel3 e pressione Ctrl+C chame novamente o objeto Form2 e pressione Ctrl+V, crie um terceiro
boto e altere as seguintes propriedades:
Propriedade Valor Descrio
Caption &Msicas Label do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Glyph [DiretrioDelphi]\IMAGES\BUTTON Imagem a ser mostrada no objeto
S\CDDRIVE.BMP
Height 25 Altura do objeto
Hint Cadastro e manuteno das msicas Ajuda on-line para o objeto especfico
Name ButMusica Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a
forma de uma caixa de ajuda on-line
Width 89 Tamanho do objeto
Organizando os Panels
Vamos organizar cada objeto Panel por partes:
81
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Objeto Panel1
Objeto Panel2
Aumente o objeto Panel2 de forma a caber os outros objetos, organize os objetos da seguinte
forma: Nome, Tipo, Categoria e Msicas, ao lado coloque a foto. Deixe o espao de um campo
entre Categoria e Msicas.
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.
Mude a propriedade Caption para Cadastro.
82
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Altere a propriedade Align do objeto Panel2 para alClient e acerte as posies no formulrio.
Salve o formulrio e salve o projeto.
No espao deixado entre os labels de Categoria e Msica, crie o objeto DBText , encontrado
na Component Palette pgina Data Controls, que servir para mostrar o nome da categoria
selecionada, altere as seguintes propriedades:
Propriedade Valor Descrio
DataSource DM_Basico.DSCategor DataSource vinculado
DataField DES_CATEG Campo de tabela
Font MS Sans Serif, Normal, 8, Castanho Tipo de letra a ser mostrada no objeto
Crie agora trs objetos SpeedButton , encontrado na Component Palette pgina Additional:
A funo de cada boto est explicada na propriedade hint, para os objetos ButLocCateg e
ButInsCateg iremos nos aproveitar dos formulrios j construdos anteriormente.
83
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Por enquanto vou me deter a falar do objeto DBGrid, mais tarde voltaremos a falar dos outros,
este objeto DBGrid vinculado, ao DataSource, apresenta as seguintes propriedades (mais importantes,
algumas ainda no mencionadas):
DataSource: Nome do objeto DataSource vinculado;
Font: Tipo da letra a ser mostrada no contedo do objeto;
Options: srie de opes de controle (se a opo True for selecionada):
dgEditing: permite a edio e adio dos dados;
dgAlwaysShowEditor: O grid entra automaticamente em modo de edio, no havendo a
necessidade de pressionar Enter ou F2 (depende que a propriedade dgEditing = True);
dgTitles: Viabiliza o uso do ttulo de cada campo;
dgIndicator: Habilita o ponteiro de indicao da coluna;
dgColumnResize: A coluna pode ser redimensionada;
dgColLines: Habilita a separao das colunas;
dgRowLines: Habilita a separao das linhas;
dgTabs: Use o pressionamento das teclas Tab e Shif+Tab para se mover dentro das colunas;
dgRowSelect: Seleciona, com uma tarja azul, todas as colunas de uma linha;
dgAlwawsShowSelection: As clulas do grid so mostradas constantemente selecionadas,
mesmo que este no detenha o foco.
dgConfirmDelete: Use as teclas Ctrl+Del, para excluir dados;
84
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
dgCancelOnExit: Se qualquer incluso estiver pendente e for dado sada no grid sem a
validao dos dados, a incluso cancelada. Previne a incluso de registros invlidos ou em
branco.
TitleFont: Tipo da letra a ser mostrada nos ttulos do objeto.
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:
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:
85
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
1. Clique no boto (Toggle Form/Unit) da SpeedBar, at voc alternar para o Code Editor.
public
procedure inicio; Criando a chamada para um procedimento pblico.
end;
var
F_Basico: TF_Basico;
implementation
{$R *.DFM}
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:
86
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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}
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
87
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
end;
uses
DMBasico, { Referncia ao DataModule }
fMenu, { Menu Principal do Sistema }
Dialogs, { Gerente de Mensagens }
fCateg; { Cadastro de Categorias }
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;
88
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Outro objeto interessante o objeto SaveDialog, veja outras utilizaes sobre eles no apndice
F
No esquea de alterar o programa do DataModule para abrir e fechar a nova tabela e coloque a
crtica para a tabela de msica, evento OnValidate do objeto TabMusicaNum_Faixa:
procedure TDM_Basico.TabMusicaNum_FaixaValidate(Sender: TField);
begin
if DSMusica.State in [dsEdit, dsInsert] then
begin
TabMusicaConf.EditKey;
TabMusicaConf.FieldByName('COD_DISCO').AsFloat := TabMusicaCod_Disco.Value;
TabMusicaConf.FieldByName('NUM_FAIXA').AsFloat := TabMusicaNum_Faixa.Value;
if TabMusicaConf.GotoKey then
begin
F_Musica.EditNum_Faixa.SetFocus;
raise Exception.Create('Faixa do CD duplicada');
end;
end;
end;
Repare no uso do comando GotoKey ao invs do comando FindKey, ele foi utilizado por se
tratar de uma chave composta.
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:
89
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
begin
F_Menu.DBDisco.Commit; Gravando as alteraes da tabela
F_Menu.DBDisco.StartTransaction; Reinicia o modo de transaes
end;
end;
Deixe apenas o boto Fechar;
Remova o Label e o DBEdit do campo COD_DISCO; e
Mude a propriedade do BorderStyle para bsDialog.
Observe e compare com o desenho do formulrio abaixo:
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;
ButFechar: TBitBtn;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
90
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
{ 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
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;
91
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
end
else Seno
begin
if DBDisco.IsSQLbased then Faz a segunda parte
DBDisco.StartTransaction;
Screen.Cursor := crDefault;
end;
end;
92
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
...
F_Menu.Prepara(True); Aqui
with TF_Categ.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False); Aqui
end;
Um segundo procedimento global pode ser criado verificando os eventos AfterPost dos
DataModules Dm_Categ e DM_Basico (este segundo em dois lugares); observamos o mesmo
procedimento:
if F_Menu.DBDisco.IsSQLbased then
begin
F_Menu.DBDisco.Commit;
F_Menu.DBDisco.StartTransaction;
end;
var
...
...
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;
93
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 }
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;
94
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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;
95
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
begin
if F_Menu.CriticaEdicao(DM_Basico.DSBasico, 'CD', 'Localizar') then
Exit;
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;
F_Menu.Prepara(True);
with TF_Musica.Create(Self) do
begin
Inicio;
Free;
end;
F_Menu.Prepara(False);
end;
end.
96
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
97
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.
Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsDialog Estilo da borda do formulrio
Caption Pesquisa Categoria Label do objeto (Tarja azul do formulrio)
Name F_SelCate Nome do objeto
Position poScreenCenter Posio da janela (centralizado)
Crie para esta nova janela uma relao com o DataModule DM_Modelo colocando-o na clusula
Uses, abaixo da diretiva de compilao:
{$R *.DFM}
uses
DMModelo; { Referncia ao DataModule }
Crie para esta nova janela os seguintes objetos:
DBNavigator (encontrado na pgina Data Controls), altere as seguintes propriedades:
Propriedade Valor Descrio
DataSource DM_Modelo.DSCategor DataSource vinculado (caso esta opo no esteja
disponvel abra o DataModule DM_Modelo)
98
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Hints Um em cada linha: Primeiro, Tpicos para ajuda on-line do objeto especfico
Anterior, Prximo e ltimo
Left 8 Posio a esquerda
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
VisibleButtons [nbFirst, nbPrior, nbNext, nbLast] Botes visveis
Top 8 Distncia do topo
Width 113 Largura do objeto
99
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
100
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Programando no formulrio
O cdigo para este objeto no chega a ser um troo estranho, medonho e esquisito, na verdade
at bem simples, basta apenas compreendermos o seu funcionamento, o objeto DBGrid far todo o
trabalho, mostrando ao usurio os registros cadastrados em uma tabela, a parte que nos resta e programar o
objeto butPesquisa de maneira quase idntica ao nosso antigo boto de pesquisa:
O comando Try foi utilizado para prevermos qualquer possibilidade de erro durante a execuo
da pesquisa.
No nosso antigo boto Localizar, enviamos para a funo InputQuery o cdigo da categoria
corrente e a funo nos devolve o cdigo digitado, porque no fazermos o mesmo:
101
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
O comando Property declara uma varivel da seguinte maneira, a sub-opo Read envia um
string atravs da funo GetTrecho, e a sub-opo Write recebe o valor enviado atravs da varivel para o
procedimento SetTrecho.
2. Declarando o procedimento e a funo:
function TF_SelCate.GetTrecho: String; Incio da funo
begin
if vCria then Verifica se o DataModule no existia
begin
Result := DM_Modelo.TabCategorSIG_CATEG.Value; Atribui ao resultado da funo o valor
do campo SIG_CATEG
DM_Modelo.Free;
end;
end;
Chame o formulrio F_Categ atravs do objeto Project Manager, clique no objeto butLocalizar:
1. D um duplo clique no objeto:
procedure TF_Categ.ButLocalizarClick(Sender: TObject); Aqui permanece o mesmo
var
MarcaReg: TBookmark; Cria uma varivel de marca
begin
if F_Menu.CriticaEdicao(DM_Modelo.DSCategor, 'Categoria', 'localizar' ) then
Exit;
with DM_Modelo.TabCateg do
begin
MarcaReg := GetBookMark; 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
102
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Os comandos de BookMark so todos aplicados a tabela por isso foi utilizado em conjunto
com um comando with para a simplificao do cdigo.
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 }
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
103
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
end;
var
F_SelCate: TF_SelCate;
implementation
{$R *.DFM}
uses
DMCateg; { Referncia ao DataModule }
104
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
end;
end;
try
DM_Modelo.TabCategor.FindNearest([EdtTrecho.Text]);
except
on exception do MessageDlg('Sigla especificada est invlida!',mtError, [mbOK], 0);
end;
end;
end.
Consultas SQL
O objeto Query , utilizado anteriormente para trabalhar como um contador, mais poderoso
do que se imagina, utilizando-o bem nos podemos dar poderes ao nosso usurio que ele jamais imaginou
que fosse possvel, e voc ver que trabalhar com filtros pode-se transformar em uma agradvel surpresa.
105
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Vamos criar um formulrio idntico a este que servir para a montagem dos filtros:
Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsDialog Estilo da borda do objeto
Caption Define Filtros Label do objeto
Name F_Filtro Nome do objeto
Position poScreenCenter Posio do objeto
106
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Edit (encontrado na pgina Standard) - que armazenar o contedo a ser comparado, altere as
seguintes propriedades:
Propriedade Valor Descrio
Name EditCompara Nome do objeto
Font MS Sans Serif, Normal, 8, Azul Tipo de letra a ser mostrada no objeto
Marinho
Text Texto a ser mostrado para o campo
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)
107
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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
108
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Kind bkOK Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Name ButOK Nome do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Hint Confirma o filtro editado Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Caption &OK Label do Objeto
Enabled False Habilitao para o uso
BitBtn (encontrado na pgina Additional) - boto que servir para abandonar o filtro, altere as
seguintes propriedades:
Propriedade Valor Descrio
Kind bkCANCEL Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
Name ButCancela Nome do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Hint Cancela o filtro editado Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
Caption &Cancelar Label do Objeto
Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fFiltro.
O cdigo para este objeto simples requer apenas que voc compreenda que o formulrio deve
fazer. Este formulrio servir de base para a montagem de um filtro que ser mostrado por um dbGrid
construdo no segundo formulrio, devemos devolver o cdigo que completar a execuo de um objeto
Query colocado no segundo. Ex.: SELECT * FROM BASICO WHERE [condio criada no formulrio] :
109
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 ';
110
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
111
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Necessitamos agora criar uma varivel comum que devolver o cdigo SQL para a tela
secundria:
var
F_Filtro: TF_Filtro;
implementation
{$R *.DFM}
unit Ffiltro;
interface
112
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
{$R *.DFM}
uses
fSelCate;
if (cbCriterio.ItemIndex = 6) then
113
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
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;
114
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
cbCampo.Enabled := True;
cbCriterio.Enabled := True;
EditCompara.Enabled := True;
ButE.Enabled := False;
ButOu.Enabled := False;
ButOk.Enabled := False;
ButLimpa.Enabled := False;
end;
end.
115
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Vamos criar um formulrio idntico a este que servir para o gerenciamento do filtro:
Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsDialog Estilo da borda do objeto
Caption Consulta aos Discos Label do objeto
Name F_ConDisc Nome do objeto
Position poScreenCenter Posio do objeto
Query (encontrado na pgina Data Access) - Query que se alternar com a tabela, altere as
seguintes propriedades:
Propriedade Valor Descrio
DatabaseName AliasDisco Nome do Alias ou a localizao do diretrio das
tabelas
SQL SELECT * FROM BASICO Comando SQL para consulta
Name QryBasico Nome do objeto
116
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
DBNavigator (encontrado na pgina Data Controls) - Barra de navegao que servir para
andar sobre os registro, lembre-se no deve ser permitida manuteno nos mesmos:
Propriedade Valor Descrio
DataSource DSBasico DataSource associado
VisibleButtons [nbFirst, nbPrior, nbNext, nbLast] Botes visveis
Hints Primeiro; Anterior; Prximo; Ajuda on-line que ser mostrado sobre cada boto
ltimo (coloque um em cada linha)
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
SpeedButton (encontrado na pgina Additional) - boto que servir para ativar ou desativar o
filtro, altere as seguintes propriedades:
Propriedade Valor Descrio
Name ButAtivaDesativa Nome do objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\LOCKOPEN.BMP
Hint Ativa/Desativa o filtro Ajuda on-line para o objeto especfico
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
GroupIndex 1 Pertence a um grupo de botes, esta propriedade faz
com que o boto permanea em estado de
pressionamento.
AllowAllUp True Permite que um grupo de botes no tenha nenhum
boto em estado de pressionamento.
BitBtn (encontrado na pgina Additional) - boto que servir para montagem do filtro, altere
as seguintes propriedades:
Propriedade Valor Descrio
Caption Fil&trar Label do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\FIND.BMP
Hint Montagem do Filtro Ajuda on-line para o objeto especfico
Name ButFiltrar Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
BitBtn (encontrado na pgina Additional) - boto que servir para editar o campo selecionado
no grid, altere as seguintes propriedades:
Propriedade Valor Descrio
Caption &Editar Label do objeto
Font MS Sans Serif, Normal, 8, Preto Tipo de letra a ser mostrada no objeto
Glyph [DiretrioDelphi]\IMAGES\BUTT Imagem a ser mostrada no objeto
ONS\FOLDRDOC.BMP
Hint Edita campo selecionado Ajuda on-line para o objeto especfico
Name ButEditar Nome do objeto
ShowHint True Mostrar o contedo da propriedade hint sob a forma de
uma caixa de ajuda on-line
BitBtn (encontrado na pgina Additional) - boto que servir para editar o filtro, altere as
seguintes propriedades:
Propriedade Valor Descrio
Kind bkClose Determina a classe a ser utilizada pelo objeto,
automaticamente sero alteradas as propriedades:
Caption, Glyph e ModalResult
117
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
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
118
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
119
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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 }
120
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
public
procedure Inicio;
end;
var
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.
121
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Captulo VIII
Relatrios
A parte impressa do Delphi fica a critrio de trs mtodos: utilizar a ferramenta ReportSmith,
com a unit Printer ou com a utilizao da ferramenta QuickReport (disponvel no Delphi 1.0 a partir de
compra de terceiro, mas disponvel gratuitamente com o Delphi 2.0). O Delphi oferece um gerador de
relatrios bastante poderoso, chamado ReportSmith. Com este utilitrio, voc pode criar relatrios
associados aos diversos bancos que o Delphi se comunica.
122
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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:
123
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
12. Confirme o relatrio pressionando o boto Done. Informe os dados iniciais e finais e aguarde
a gerao do relatrio.
124
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Criaremos agora uma janela simples de dilogo, onde selecionaremos um cdigo inicial e final
para os cdigos do CD.
Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsDialog Estilo da borda do objeto
Caption Imprime Cadastro Geral Label do objeto
Name F_DgGeral Nome do objeto
Position poScreenCenter Posio do objeto
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,
125
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
Programando o formulrio
Antes de prosseguirmos salve o formulrio com o nome de fDgGeral.
Para selecionarmos os cdigos inicial e final, precisamos fazer uma pequena programao no
formulrio:
Cdigo para criar os dois campos que enviaro os cdigos (lembra-se do captulo VII - Referente
a Consultas):
1. Alterne para o CodeEditor e insira o seguinte cdigo abaixo:
private
function GetCodInicial: String; 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}
126
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
begin
Result := Edit2.Text; Envia como resultado o contedo do
end; objeto Edit2
Por incrvel que parea isto tudo, agora chame o objeto fMenu, insira o objeto Report ,
encontrado na Component Palette pgina Data Access, este objeto realiza o trabalho de configurao da
impresso.
1. Clique na opo Relatrio | Geral chamando o evento onClick;
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;
Caso voc queira que o ReportSmith no execute imediatamente o relatrio mostrando antes
uma prvia na tela modifique a propriedade do objeto Report1 - Preview para True.
Voc descobrir que o ReportSmith uma poderosa e simples ferramenta para a concepo de
relatrios, o nico problema seria com relatrios que se precise imprimir uma nica ou poucas folhas,
como um recibo ou um formulrio pr-impresso, voc descobrir que ele lento para estas tarefas,
existem duas solues para este caso usar a biblioteca Printers ou usar a impresso livre do formulrio
como veremos a seguir.
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
127
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere as seguintes propriedades:
Propriedade Valor Descrio
BorderStyle bsNone Estilo da borda do formulrio
Caption Label do objeto (Tarja azul do formulrio)
Name F_Capa Nome do objeto
Position poScreenCenter Posio da janela (centralizado)
BorderIcons [] Elimine todos os botes da janela
Color clWhite Cor de fundo
128
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
TabBasico.Close;
129
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Close;
end;
O cdigo para este evento novamente bem simples: abre a tabela e pesquisa a existncia do
cdigo enviado, caso encontre mostra a capa do CD e solicita a confirmao do relatrio, e imprime ao
final fecha a tabela e o formulrio.
No se esquea de declarar o procedimento nas declaraes Public. (procedure
Inicio(Numero: String);)
QuickReport
QRBand
Uma banda uma simples diviso do relatrio. um relatrio ser dividido em diferentes
partes para a impresso, tais como: Detalhe, Cabealho de Pgina, Rodap, Grupos, etc. Alguns tipos de
bandas so impressas automaticamente, enquanto que outros tipos necessitam dos objetos QRGroup ou
QRDetailLink para seu controle. possvel tambm utilizar-se de mltiplas bandas de um mesmo tipo.
QRGroup
Os grupos podem ser formados com o auxlio deste componente, se utiliza de cabealho e
rodap para o controle do grupo. possvel criar no mximo 10 nveis (a proprieade Level varia de 0 a 9)
sendo que os nveis mais baixos dominam a impresso dos mais altos.
QRDetailLink
QRLabel
130
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Textos esttico no relatrio so formados pelo componente QRLabel bastando para isso
modificar a propriedade Caption. possvel tambm modificar a propriedade Caption durante a gerao
do relatrio
QRMemo
QRDBText
QRDBCalc
QRSysData
Imprime vrias informaes sobre o sistema tais como: nmero da pgina, data, hora ou
ttulo do relatrio.
QRShape
QRPreview
Vamos agora realizar um exemplo simples e prtico com o Quick, criando o mesmo relatrio
proposto com o Report Smith, deste modo acredito, que voc pode comparar a facilidade de ambos os
geradores.
1. Inicialmente Clique no boto (New Form) na Speed Bar, ou no menu principal a Clique no
menu principal a opo File e New..., em New Items, na pgina New e clique no objeto entitulado
Form e altere a propriedade name para F_Relato e salve o formulrio como fRelato.
2. Coloque os seguintes objetos e faa as seguintes alteraes:
Query (Localizado na pgina Data Access) , altere as seguintes propriedades:
Propriedade Valor Descrio
DatabaseName BaseDisco Nome do Alias ou a localizao do
diretrio das tabelas
SQL Select B.Cod_Disco, B.Nom_Disco, B.Tip_Disco, Clusula de consulta
C.Des_Categ from Basico as B left join Categor as
C on (B.Sig_Categ = C.Sig_Categ) where
B.Cod_Disco Between :Cod01 and :Cod02 order
by B.Cod_Disco
Params Acerte ambos os campos para DataType como Parmetro da consulta
AsFloat
Name QryBasico Nome do objeto
131
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Para o Objeto QrSysData (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabecalho
Propriedade Valor Descrio
AlignToBand True Alinha considerando a banda
AutoSize True Dimensiona automaticamente o tamanho
Data qrsReportTitle Tipo do dado a ser mostrado
Font Arial, 14, Negrito, Branco Fonte do objeto
Alignment taCenter Alinhamento do objeto
Para o Objeto QrSysData (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabecalho
Propriedade Valor Descrio
AlignToBand True Alinha considerando a banda
AutoSize True Dimensiona automaticamente o tamanho
Data qrsDateTime Tipo do dado a ser mostrado
Font Arial, 8, Normal, Branco Fonte do objeto
Alignment taRightJustify Alinhamento do objeto
Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabColuna
Propriedade Valor Descrio
Caption Cdigo Label do objeto
Font Arial, 12, Negrito, Branco Fonte do objeto
Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabColuna
Propriedade Valor Descrio
Caption Nome Label do objeto
Font Arial, 12, Negrito, Branco Fonte do objeto
132
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabColuna
Propriedade Valor Descrio
Caption Tipo Label do objeto
Font Arial, 12, Negrito, Branco Fonte do objeto
Para o Objeto QrLabel (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdCabColuna
Propriedade Valor Descrio
Caption Categoria Label do objeto
Font Arial, 12, Negrito, Branco Fonte do objeto
Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdDetalhe
Propriedade Valor Descrio
AutoSize True Dimensiona automaticamente o tamanho
DataSource DsBasico DataSource vinculado
DataField Cod_Disco Campo vinculado
Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdDetalhe
Propriedade Valor Descrio
AutoSize True Dimensiona automaticamente o tamanho
DataSource DsBasico DataSource vinculado
DataField Nom_Disco Campo vinculado
Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdDetalhe
Propriedade Valor Descrio
AutoSize True Dimensiona automaticamente o tamanho
DataSource DsBasico DataSource vinculado
DataField Tip_Disco Campo vinculado
Para o Objeto QrDbText (Localizado na pgina QReport), crie-o clicando dentro do objeto
bdDetalhe
Propriedade Valor Descrio
AutoSize True Dimensiona automaticamente o tamanho
DataSource DsBasico DataSource vinculado
DataField Des_Categ Campo vinculado
Criaremos um relatrio simples com cabealho (BdCabecalho), Impresso das linhas detalhe
(bdDetalhe) e rodap (bdRodape), a ordem de disposio das bandas no importa, o objeto QuickReport
responsvel por este controle.
133
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
4. Insira o comando
procedure TF_Menu.Geral1Click(Sender: TObject);
begin
if F_DgGeral.ShowModal = mrOK then Chama e verifica se a DgGeral retornou OK
with F_Relato do Para o objeto F_Relato
begin
QryBasico.Params[0].AsFloat := StrToFloat(F_DgGeral.CampInicial); Envia os parmetros
QryBasico.Params[0].AsFloat := StrToFloat(F_DgGeral.CampFinal);
QryBasico.Open; Abre a Query
QrConfere.Preview; Chama o relatrio em tela
QryBasico.Close; Fecha a Query
end;
end;
Poderiamos ficar criando n tipos de relatrios diferentes mas o melhor mtodo que voc d
uma olhada no diretrio [Diretrio de Instalao do Delphi]\Demos\QuickRpt e execute o projeto
Qrdemo.dpr. Qualquer outra referncia pode ser encontrada no documento Word que acompanha o
produto, o arquivo QrManual.doc.
O usurio do Delphi 1.0 pode ficar se perguntando porque adquirir ou aprender a utilizar um
outro gerador de relatrio quando o Delphi j traz gratuitamente o ReportSmith? O problema que
acontece se restringe a distribuio de um sistema em Delphi que utilize relatrios gerados com o
ReportSmith este exige um run-time para executar (distribudo gratuitamente tanto na verso 1.0 quanto
na verso 2.0) ocupando mais espao na mquina cliente.
134
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
2. tipo MID - arquivos para a produo de msica utilizando a interface de Instrumentos
Musicais Digitalizados, ou formato MIDI.
3. tipo WAV - mais comuns, inclui o registro de sons utilizando a tecnologia Microsoft's WAVE..
O problema principal que ocorre quanto a aplicaes multimdia o espao fsico ocupado, por
exemplo, arquivos do tipo AVI, comparando um filme de apenas um minuto ou menos pode ocupar cerca
de 5Mb ou at mesmo 10Mb de espao em disco.
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:
135
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
Podemos tambm alterar o arquivo a qual queremos ouvir, para isto insira o objeto OpenDialog
, encontrado na Component Palette na pgina Dialogs, e um objeto BitBtn conforme a figura abaixo:
Um ajuste pode ser feito para permitir que o objeto seleo tenha acesso apenas as extenses AVI ,
WAV, or MID. Podendo ser colocado de duas maneiras diferentes, na propriedade Filter do objeto
OpenDialog1:
1. Arquivos Multimdia (*.avi; *wav; *.mid) | *.avi;*.wav;*.mid
2. Arquivo AVI (*.avi) | *.avi
Arquivo WAVE (*.wav) | *.wav
Arquivo MIDI (*.MID) | *.mid
136
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Antes de iniciarmos vamos fazer uma pequena observao, principalmente relativo a dois pontos:
Para alguns programadores que procuram coisas teis, as informaes aqui presentes contm o
essencial para transform-los em programadores multimdia.
Outra observao seria a respeito de alguns controles a arquivos multimdia. D uma olhada no
arquivo [DiretrioDelphi]\SOURCE\RTL\WIN\MMSYSTEM.PAS, uma biblioteca de funes que
contm todas as chamada de acesso a baixo nvel de comandos Windows para aplicaes multimdia. As
tcnicas de acessos esto contidas no prprio documento.
Com estes dois pontos frescos em nossa mente, podemos iniciar o nosso estudo sobre os aspectos
do objeto TMediaPlayer.
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:
btPlay: Quando pressionado o boto verde, Iniciar.
btPause: Quando pressionado o boto amarelo, Pausa.
btStop: Quando pressionado o boto vermelho, Parar.
btBack: Quando pressionado o boto azul, Avana a imagem.
btStep: Quando pressionado o boto azul, Retorna a imagem.
btNext: Quando pressionado o boto azul, Avano rpido.
btPrev: Quando pressionado o boto azul, Retorno rpido.
137
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Para encontrar o que aconteceu com o processo, necessitamos do evento OnNotify. Aqui esto as
mensagens enviadas pelo sistema operacional:
mci_Notify_Successful: Comando completado com xito
mci_Notify_Superseded: Comando suspenso por outra funo
mci_Notify_Aborted: Funo corrente foi interrompida
mci_Notify_Failure: Algum erro ocorreu.
O Delphi no reconhece estas diretivas de mensagem, mas ele converte para constantes do tipo:
nvSuccessful indicando o xito.
nvSuperseded indicando que est suspenso, provavelmente por causa de uma pausa.
nvAborted messages indicando que foi pressionado o boto parar, ou causa devido ao fechamento
do arquivo.
138
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Estes eventos verificam os acontecimentos mais significativos que ocorreram com o dispositivo
MCI. O modo corrente com que o dispositivo MCI especificado tambm pode ser utilizado pelo objeto
TMediaPlayer. Aqui uma listagem dos valores mais comuns designados:
mci_Mode_Not_Ready
mci_Mode_Stop
mci_Mode_Play
mci_Mode_Record
mci_Mode_Seek
mci_Mode_Pause
mci_Mode_Open
Estes valores so auto-explicativos. Por exemplo, o modo do campo fixado em mci_Mode_Stop,
o dispositivo est parado. Se fixado em mci_Mode_Play, o dispositivo est tocando.
Crie uma nova procedure Private chamada SetMode, e insira o seguinte cdigo:
procedure TForm1.SetMode;
begin
Edit4.Text := MediaPlayer1.FileName;
case MediaPlayer1.Mode of
mpNotReady: Edit3.Text := 'mci_Mode_Not_Ready';
mpStopped: Edit3.Text := 'mci_Mode_Stop';
mpPlaying: Edit3.Text := 'mci_Mode_Play';
mpRecording: Edit3.Text := 'mci_Mode_Record';
mpSeeking: Edit3.Text := 'mci_Mode_Seek';
mpPaused: Edit3.Text := 'mci_Mode_Pause';
mpOpen: Edit3.Text := 'mci_Mode_Open';
else
begin
Edit1.Text := 'Dispositivo Inativo';
Edit2.Text := 'Sem messagens';
Edit3.Text := 'No identificado';
Edit4.Text := 'No h arquivo selecionado';
end;
end;
end;
Para a chamada desta rotina click no objeto Ttimer e chame o evento OnTimer e insira o seguinte
cdigo:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
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.
139
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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)
TTimer , encontrado na Component Pallety na pgina System, servir para controlar o tempo
das msicas.
140
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
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);
141
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
public
{ Public declarations }
end;
var
F_Player: TF_Player;
implementation
{$R *.DFM}
const
ModeStr: array[TmpModes] of string[10] = ('No Lido', 'Parado', 'Tocando',
'Gravando', 'Pesquisando', 'Pausado', 'Aberto');
{ Para o CD Player }
CD.Stop;
142
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
CDPlaying := False;
CDPaused := False;
end;
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;
143
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
end.
144
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Salve o formulrio com o nome de FPlayer e faa a chamada a partir do menu principal do seu
sistema, bom divertimento.
Captulo X
Novos Componentes
Uma das maiores vantagens do Delphi sobre os demais concorrentes o fato da gerao de novos
componentes (de novos objetos).
O exemplo a seguir pretende colocar uma luz sobre o assunto mostrando os passos bsicos para o
desenvolvimento de componentes, estes passos so:
Criando propriedades e mtodos;
Controle ao acesso as propriedades;
Propriedades de leitura e escrita;
Enviando e recebendo mensagens atravs dos componentes.
Criando Componentes
Componentes so como blocos de construo para as aplicaes Delphi. Voc poder construir
uma aplicao simplesmente adicionando estes blocos e modificando os eventos, propriedades ou
mtodos. Todos os componentes possuem duas propriedades em comum: Name e Tag. Alguns
componentes esto distribudos na Component Pallete. Mas alguns componentes (TApplication, TMenu,
TMenuItem, e TScreen) so disponveis apenas atravs de seu cdigo.
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.
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,
145
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Custom', [CustComp1]);
end;
end.
146
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Salve o componente como Cust, selecionando File | Save, dentro do diretrio de instalao do
Delphi na pasta Lib. Para instalar o componente selecione Component | Install... aparecer a seguinte
janela dilogo:
Clique no boto Add... e ser mostrada a janela dilogo Add Module. Use o boto Browse para
localizar o arquivo Cust.PAS, note que ele ser remetido a ListBox Installed units: e caminho do
componente (se voc salvou-o em outro diretrio) ser colocado no Search Path.
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.
147
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Criando Propriedades
Para o nosso componente vamos adicionar uma propriedade que armazenar um valor inteiro,
para isto chame novamente a unit do componente e insira os cdigos abaixo da declarao private:
type
CustComp1 = class(TComponent)
private
fDemoProp:Integer;
Agora criaremos uma propriedade aonde o valor ser lido e escrito atravs desta varivel para
tanto insira os cdigos abaixo da declarao published:
published
property DemoProp: Integer read fDemoProp write fDemoProp;
end;
A seo Public (pblica) abriga as variveis, procedimentos ou funes que podem ser lidos e
executados por quaisquer outras units que utilizem (atravs clusula Uses) a unit em questo j a seo
Published (Publicado) utilizada para inserir propriedades ou eventos aos componentes.
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).
148
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Na seo private crie uma nova varivel com base no tipo definido:
private
fDemoProp:Integer;
fNovaProp:TDirecao;
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:
149
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
diversos aplicativos. }
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, fSobre;
type
TSobreDlg = class(TComponent)
private
FProductName, FVersion, FCopyright, FComments: string;
public
function Execute: Boolean;
published
property NomeProduto: string read FProductName write FProductName;
property Versao: string read FVersion write FVersion;
property Direitos: string read FCopyright write FCopyright;
property Comentario: string read FComments write FComments;
end;
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
150
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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';
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
151
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
ProgramIcon.Picture.Graphic := Application.Icon;
Result := (ShowModal = IDOK);
end;
finally
F_Sobre.Free;
end;
end;
end.
Para esta primeira etapa do nosso objeto note que tudo gira em torno do procedimento Execute (o
nome se deve apenas a uma questo de padronizao com os outros objetos da palheta Dialogs), atravs
deste procedimento todos as outras variveis so iniciadas, resta-nos agora a criao do formulrio, crie
um novo formulrio, ATENO: No aproveite o formulrio F_Sobre j criado pois este uma herana
do formulrio F_Splash, crie-o conforme o desenho abaixo:
Para os objetos dentro do painel: altere a propriedade Caption: Nome do Produto, Verso,
Direitos Resevados e Comentrio e a propriedade Name: ProductName, Version, Copyright, Comments.
Para os objetos fora do painel: altere os objetos Labels da esquerda a propriedade Caption
(Ex: Usurio, Companhia) e os da direita a propriedade Name (Ex: UserName, CompanyName)
A propriedade Name para todos os componentes, na ordem que eles aparecem so:
Objeto Tipo Objeto Tipo Objeto Tipo Objeto Tipo
ProgramIcon TImage ProductName TLabel Version TLabel Copyright TLabel
Comments TLabel Label1 TLabel UserName TLabel Label2 TLabel
CompanyName TLabel Label3 TLabel WinVersion TLabel Label4 TLabel
DosVersion TLabel Label5 TLabel CPU TLabel Label6 TLabel
FreeMemory TLabel Label7 TLabel FreeDisk TLabel FreeResources TLabel
F_Sobre TForm Panel1 TPanel
152
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Salve a janela com o nome de FSobre e o componente como SobreDlg e compile a biblioteca e
instale o componente: SobreDlg.PAS, teste o componente da seguinte forma:
1. Remova do projeto o formulrio F_Sobre e retire sua chamada da clusula Uses;
2. Coloque o componente no formulrio F_Menu e acerte as suas propriedades;
3. Insira a chamada ao componente na opo de Sobre o Sistema:
procedure TF_Menu.ItemAuxilio1Click(Sender: TObject);
begin
SobreDlg.Execute;
end;
4. Compile e rode o sistema.
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.
153
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:
154
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.
155
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
156
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 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
157
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
OnDataChange do objeto DataSource. Lembre-se que este evento chamado sempre que o registro
corrente alterado.
Repare no cdigo SQL na varivel :CustNo, v para a propriedade Params do objeto tQuery e
coloque para a varivel CustNo criada o Data type como Float, est varivel ser passada para o SQL
atravs do evento OnDataChange do objeto DataSource, insira o seguinte cdigo:
procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
begin
Query1.Close;
Query1.Params[0].AsFloat := Table1CustNo.Value;
Query1.Open;
end;
O objeto DataSource necessrio, pois os objetos de campo no podem ligar-se diretamente aos
objetos do DataSet, mas apenas atravs de um objeto DataSource.
Por conseguinte, para cada objeto DataSet tambm colocado no formulrio um objeto
DataSource. Finalmente, so adicionados objetos de caixa de edio de texto, um objeto Grid para as
linhas da encomenda e um objeto dbNavigator ligado a tabela de Customer, rode o projeto.
objeto Grid est ligado ao objeto tQuery (atravs do objeto DataSource), ento este se
atualiza automaticamente com os novos resultados das consultas.
158
Apndice D
Imprimindo um Formulrio
Para imprimir um formulrio no tem nenhum segredo, existe o comando PRINT relacionado a
formulrios, o problema se inicia quando o formulrio ultrapassa as dimenses da tela do seu monitor, ou
seja, a largura e altura dele maior que a tela. Digamos um formulrio qualquer que tenha a propriedade
HorzScrollBar.Range = 768 e VertScrollBar.Range = 1008 (isto corresponde a uma folha de papel
tamanho A4).
O programa abaixo resolve exatamente este problema, imprimindo somente objetos: Tlabel,
TEdit, TMemo, TDBText, TDBEdit e TDBMemo, utiliza a biblioteca Printers para fazer o servio,
coloque um boto qualquer no formulrio que deseje imprimir e para o evento onClick, digite os seguintes
comandos:
159
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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
160
Apndice E
Trabalhando com Mscaras
Abriremos aqui este apndice para esclarecermos a respeito de campos mascarados no Delphi,
alguns campos podem possuir uma mascara para edio atravs da propriedade MaskEdit, encontrada para
os objetos TDateField, TDateTimeField, TStringField, TTimeField e o objeto.
Para montar uma mscara, utiliza-se a propriedade EditMask observando o limite de dados que o
campo poder armazenar. utilizada basicamente para a validao ou a formatao da entrada de um
determinado campo.
A mscara para os campos pode restringir o uso de determinados caracteres ou formatos vlidos,
mostrando automaticamente uma janela de no aceitao da mscara. A validao ocorre caracter a
caracter. Use o evento OnValidate para validar uma entrada completa.
A mscara basicamente consiste de trs campos, separados por ponto e vrgula. A primeira parte e
a mscara propriamente dita. A segunda parte determina se os caracteres fixos devem ser ou no salvos
com a mscara (ex: /, -, (, ...). A terceira parte da mscara representa o caracter em branco, podendo ser
substitudo por outro (ex: _, @, ...).
0 Requer somente caracteres numricos obrigatrios para a posio, do tipo 0-9. Ex: 000;1;_
9 Permite somente caracteres numricos para a posio, no-obrigatrios, do tipo 0-9. Ex: 999;1;_
# Permite somente caracteres numricos para a posio e o uso dos sinais de - ou +, no-obrigatrios. Ex: ###;1;_
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
161
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:
162
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
with Table1 do
begin
Open;
First;
if not EOF then
begin
AssignFile(Arq, SaveDialog1.FileName);
ReWrite(Arq);
repeat
WriteLn(Arq,FieldByName('EmpNo').AsString + '|' +
FieldByName('LastName').AsString + '|' +
FieldByName('FirstName').AsString + '|' +
FieldByName('PhoneExt').AsString + '|' +
FieldByName('HireDate').AsString + '|' +
FieldByName('Salary').AsString + '*');
next;
until EOF;
CloseFile(Arq);
end;
close;
end;
Screen.Cursor := crDefault;
end;
end;
Inicialmente vamos exportar o arquivo (no caso Employee), o funo do comando AssignFile e
iniciar um objeto de arquivo texto (determinada pelo tipo de varivel TextFile) e o comando ReWrite
prepara o objeto iniciado para a gravao. Lembre-se que um arquivo texto s pode receber logicamente
texto definido pelos comandos Write (insere um texto em determinado arquivo e o cursor de gravao
permanece na posio) e WriteLn (insere um texto em determinado arquivo e o cursor de gravao inicia
uma nova linha) ento o nico trabalho ser de percorrer o nosso arquivo com o comando Repeat.
begin
if OpenDialog1.Execute then
begin
Screen.Cursor := crHourGlass;
Table1.Open;
163
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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.
164
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
Apndice G
Doze melhores dicas para o Delphi
Neste ltimo apndice do trabalho reservei uma coisa especial, pesquisei em todos os documentos
tipo Tips & Tricks (Dicas e Truques) e encontrei um documento que falava sobre as onze melhores dicas
para o Delphi.
165
Borland Delphi e Delphi Client/Server Desvendando o Caminho das Pedras
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;
166