Sei sulla pagina 1di 41

DataLine Onde seu futuro acontece Apostila de

Programao: Deplhi7
Sumrio
1. Introduo......................................................................................................................................................................2
2. Conceitos gerais de POO.............................................................................................................................................2
2.1. Orientao a Objetos.....................................................................................................................................................2
2.1.1. Objeto......................................................................................................................................................................2
2.1.2. Atributos..................................................................................................................................................................2
2.1.3. Encapsuao.........................................................................................................................................................2
2.1.!. Ao.........................................................................................................................................................................2
2.1.". #erana....................................................................................................................................................................2
2.1.$. Poimor%ismo...........................................................................................................................................................2
2.1.&. 'igao....................................................................................................................................................................2
2.1.(. Embutimento...........................................................................................................................................................2
3. Object Pasca................................................................................................................................................................3
3.1. S)mboos Especiais........................................................................................................................................................3
3.2. paa*ras reser*adas.......................................................................................................................................................3
3.3. +,meros..........................................................................................................................................................................!
3.!. Constantes......................................................................................................................................................................"
3.". E-press.es ....................................................................................................................................................................&
3.$. identi%icadores................................................................................................................................................................"
3.$.1. /it0 do....................................................................................................................................................................."
3.$.2. i% t0en ese..............................................................................................................................................................."
3.$.3. %or to 1do/n to2 do..................................................................................................................................................&
3.&. 3ocos de Procedimentos e %un.es...........................................................................................................................&
3.&.1. Procedure................................................................................................................................................................(
3.&.2. 4unction...................................................................................................................................................................(
!. Programando em 5ep0i..............................................................................................................................................6
!.1. 7antagens da Organi8ao da Apicao por camadas ..........................................................................................19
!.2. Estrutura de uma apicao........................................................................................................................................13
!.2.1. Componentes 7isuais..........................................................................................................................................13
!.2.2. Componentes de Acesso : base de 5ados.......................................................................................................13
!.2.3. Componente de 'igao......................................................................................................................................1!
!.2.!. ;tii8ando 5atamodue.........................................................................................................................................1!
!.2.". Componente <database.......................................................................................................................................1!
". =erenciamento de dados...........................................................................................................................................1!
".1. 7antagens da organi8ao da apicao em Camadas............................................................................................13
".2. Estrutura de uma apicao 5ep0i............................................................................................................................13
".2.1. Componentes 7isuais............................................................................................................................................(
".2.2. Componentes 7isuais..........................................................................................................................................13
".2.3. componente de igao.......................................................................................................................................1!
".2.!. utii8ando datamodue.........................................................................................................................................13
".2.". Componente <database.......................................................................................................................................13
Professor: Daniel Moreland Pgina 1 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Introduo ao Borland Delphi
Delphi uma poderosa ferramenta de desenvolvimento em RAD(Rapid Application Development)
criada pela Borland nprise! atualmente se encontra na vers"o #$$% &ue a'orda muitas reas de
desenvolvimento! a'rangendo ()B! aplicativos client*+erver! intranet e etc,
1. Conceitos gerais a POO 1Programao Orientada a
Objeto2
Para compreendermos melhor a novo am'iente de desenvolvimento da Borland o Delphi
necessrio &ue voc-! aprenda e! tenha em mente os conceitos de P.. (Programa/"o .rientada a
.'0etos)! n"o confunda os conceitos com P.) (Programa/"o .rientada a )ventos) muito difundido
com o Access 2.0
1
(um am'iente 'aseado em .'0etos)! mas ao longo deste cap2tulo voc- vai notar
as sens2veis diferen/as &ue e3istem entre esses dois conceitos,
A P.. e a P.) s"o facilmente confundidas! mas lem're4se a P.. contm a P.) mas a
P.) n"o contm a P..! um o'0eto pode e3istir mesmo &ue n"o e3ista nenhum evento associado a
ele! mas um evento n"o pode e3istir se n"o houver um o'0eto a ele associado, .utra caracter2stica
&ue pode causar confus"o s"o am'ientes .rientados a .'0etos e am'ientes Baseados em .'0etos,
)m am'iente .rientado a .'0etos consegue4se criar e manipular o'0etos en&uanto &ue o Baseado
em .'0etos n"o poss2vel a cria/"o de o'0etos apenas a sua manipula/"o,
A P.. um conceito desenvolvido para facilitar o uso de c5digos de desenvolvimento em
interfaces grficas, +endo a Borland! uma das primeiras a entrar neste novo conceito! possui suas
principais linguagens de programa/"o (tais como Object Pascal e C++)! totalmente voltadas para este
tipo de programa/"o, A P.. atraiu muitos adeptos principalmente pelo pouco uso de c5digo &ue o
pro0eto (diferente de sistema) carrega no programa fonte! ao contrrio das linguagens mais antigas
como o Clipper87
1
muito utili6ado no final da dcada de 7$ e in2cio da dcada de 7$, . resultado
desta 8limpe6a9 no c5digo resulta &ue a manuten/"o do pro0eto torna4se muito mais simples,
1.1. Orientao a Objeto
Antes de come/armos a falar realmente de linguagem orientada a o'0etos e necessrio &ue
voc- possua os conceitos 'sicos da orienta/"o a o'0etos! s"o eles:

1.1.1. Objeto 4 &ual&uer estrutura modular &ue fa6 parte de um produto, :ma
0anela por e3emplo! um o'0eto de uma casa! de um carro ou de um soft;are com
interface grfica para o usurio,
1.1.2. Atributos 4 +"o as caracter2sticas do o'0eto! como cor e tamanho! a 0anela!
por e3emplo! tem atri'utos como o modelo! tamanho! a'ertura simples ou dupla! entre
outros,
1.1.3. Encapsuao 4 um mecanismo interno do o'0eto 8escondido9 do usurio,
:ma pessoa pode a'rir uma 0anela girando a tranca sem precisar sa'er o &ue h dentro
dela,
1.1.4. Ao 4 a opera/"o efetuada pelo o'0eto, <odas as 0anelas! por e3emplo!
controlam a ilumina/"o e temperatura am'iente! dependendo do seu design,
1.1.5. #erana 4 um o'0eto novo nem sempre criado do 6ero, )le pode 8herdar9
atri'utos e a/=es de outros 0 e3istentes, :m 'asculante herda atri'utos das 0anelas e
das persianas,
1.1.6. Poimor%ismo 4 a capacidade de o'0etos diferentes reagirem segundo a sua
fun/"o a uma ordem padr"o, . comando 8a're9! por e3emplo! fa6 um o'0eto entrar em
a/"o! se0a ele uma 0anela! uma porta ou uma tampa de garrafa,
Professor: Daniel Moreland Pgina # de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
1.1.7. 'igao 4 &uando um o'0eto conecta a sua a/"o a outro, :m sensor de
claridade! por e3emplo! ativa o acendimento automtico da ilumina/"o de rua,
1.1.8. Embutimento 4 Permite a um o'0eto incorporar fun/=es de outros! como um
li&>idificador &ue m5i carne com a mudan/a do tipo da l?mina,
2. Object Pasca
Object Pascal uma linguagem .rientada a .'0etos n"o pura mas h2'rida por possuir
caracter2sticas de programa/"o n"o s5 visual mas tam'm escrita! para os programadores &ue 0
conhecem tcnicas de estruturas de programa/"o! com o C! Basic! Pascal ou 3BASE entre outras
linguagens a Object Pascal provid-ncia uma migra/"o de forma natural oferecendo um produto de
maior comple3i'ilidade, Object Pascal for/a a voc- e3ecutar passos l5gicos isto torna mais fcil o
desenvolvimento no am'iente indo!s
1
de aplica/=es livres ou &ue utili6am 'anco de dados do tipo
Cliente"Ser#idor! tra'alha com o uso de ponteiros para a aloca/"o de mem5ria e todo o poder de um
c5digo totalmente compilvel, Alm disso possi'ilita a cria/"o e reutili6a/"o (vantagem de re4uso t"o
sonhado com a Orientao a Objetos) de o'0etos e 'i'liotecas din?micas (D$na%ic &in' &ibraries 4
D@@),
Object Pascal contm todo o conceito da orienta/"o a o'0etos incluindo encapsulamento!
heran/a e polimorfismo, Algumas e3tens=es foram inclu2das para facilitar o uso tais como conceitos
de propriedades! particulares e pA'licas! e tipos de informa/=es em modo run4time! manuseamento
de e3ce/=es! e refer-ncias de classes, . resultado de toda esta 0un/"o fa6 com &ue Object Pascal
consiga suportar as facilidades de um 'ai3o n2vel de programa/"o! tais como:
1 B Controle e acesso das su'classes do indo!s
1
(AP)D
# B Passar por cima das mensagens de loop do indo!s
1
D
E B Fensagens semelhantes as do indo!s
1
D
4 B C5digo puro da linguagem Asse%bler,
Como deu para perce'er a 'ase de toda a programa/"o Delphi a linguagem Object
Pascal! ent"o neste cap2tulo trataremos e3clusivamente deste tipo de programa/"o,
2.1. S)mboos Especiais
A Object Pascal aceita os seguintes caracteres A+C:
1, GH@etras 4 do Alfa'eto ngl-s: A at > e a at 8,
#, GHD2gitos 4 Decimal: 9 at 6 e Ie3aDecimal: 9 at 6 e A at 4 (ou a at %)
E, GHBrancos 4 )spa/o (ASCII 32) e todos os caracteres de controle ASCII (ASCII 9 at
ASCII 31)! incluindo final de linha e )nter (ASCII 13),
4, GH)speciais 4 Caracteres: ? @ A B C D E F G . H 1 2 I J K L M N O P
%, GH+2m'olos 4 Caracteres: DC EC IC .. 1A A2 1. .2 BB
JH. colchetes es&uerdo ( F ) e e&uivalente ao 1. e o colchetes direito ( G ) e e&uivalente a .2, A
chave es&uerda ( M ) e e&uivalente ao 1A e a chave direita ( N ) e e&uivalente a A2,
2.2. Paa*ras Qeser*adas
A Object Pascal se utili6a das seguintes palavras reservadas! n"o podendo as mesmas
serem utili6adas ou redefinidas:
And )3ports @i'rarK +et ArraK Lile Fod +hl
As LinnalK Mil +hr Asm Lor Mot +tring
Begin Lunction .'0ect <hen Case Noto .f <o
Class f .n <rK Const mplementation .r <Kpe
Professor: Daniel Moreland Pgina E de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Constructor n PacOed :nit Destructor nherited Procedure :ntil
Div nitiali6ation Program :ses Do nline PropertK Par
Do;nto nterface Raise (hile )lse s Record (ith
)nd @a'el Repeat Qor )3cept
:ma outra lista a seguir! apresenta as diretivas &ue s"o utili6adas em conte3tos de
identifica/"o de o'0etos:
A'solute )3port Mame Pu'lished A'stract
)3ternal Mear Read Assem'ler Lar
Modefault Resident At Lor;ard .verride
+tored Cdecl nde3 Private Pirtual
Default nterrupt Protected (rite DKnamic
Fessage Pu'lic
2.3. +,meros
R poss2vel definir variveis e constantes de tipos de (nteiro ou )eal atravs de &ual&uer
decimal ordinrio ( 9 a 6 )! mas a Object Pascal tam'm aceita a nota/"o Ie3adecimal utili6ados
com o prefi3o dollar ( O ) ou a nota/"o cient2fica ( E ),
2.!. Constantes
:ma constante um identificador com valor(es) fi3o(s), :m 'loco de declara/=es constante
possui a seguinte e3press"o:
SDeclara/"o ConstanteT SdentificadorT (U) SconstanteT (D)
A lista a'ai3o apresenta um con0unto de fun/=es &ue podem ser utili6adas para a declara/"o
das constantes:
A' @ength .rd +i6e.f Chr @o Pred +ucc
Ii @o; Ptr +;ap Iigh .dd Round <runc
Alguns e3emplos para a defini/"o de Constantes:
const Rin C 9J
Ra- C 199J
Centro C 1Ra- @ Rin2 di* 2J
3eta C C0r122"2J
+um'etras C Ord1S>S2 @ Ord1SAS2 ? 1J
RensOa C SInstruo in*idaSJ
RensErro C S ErroI S ? RensOa ? S. SJ
PosErr C (9 @ 'engt01RensErro2 di* 2J
'n19 C 2.392"("96266!9!"$(!J
'n19Q C 1 B 'n19J
5ig+umericos C FS9S..S6SGJ
'etrasAp0a C FSAS..S>SH SaS..S8SGJ
Ap0a+um C 'etrasAp0a ? 5ig+umericosJ
2.". E-press.es
As e3press=es em .'0ect Pascal (como em &ual&uer linguagem) formada por operadores e
operandosD os operadores s"o divididos em &uatro categorias 'sicas:
Professor: Daniel Moreland Pgina 4 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Tnicos V! Mot
Rutipicati*os W! *! div! mod! and! shl! shr! as
Adicionais X! 4! or! 3or
Qeacionais U! Y W! Y! W! Y U! W U! in! is
Professor: Daniel Moreland Pgina % de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
As e3press=es o'edecem as regras 'sicas de l5gica para a preced-ncia da e3ecu/"o das
opera/=es,
2.$. Identi%icadores
dentificadores podem ser constantes! tipos! variveis! procedures! fun/=es! unidades!
programas e campos de registros,
M"o e3iste limite de caracteres para o nome de um identificador mas apenas os ZE primeiros
caracteres s"o significantes (n"o podendo ser id-ntico ao nome das palavras reservadas), . nome de
um identificador deve ser iniciado por @etras ou o carcter underscore ( U ), . resto formado por
@etras! D2gitos! carcter underscore (A+C [%L), M"o permitido a utili6a/"o de espa/os
para a forma/"o do nome,
JH)3emplo de identificadores vlidos: Lorm1! +Ks:tils,+tr@en! @a'el1,Caption
2.$.1. /it0... do...J
Delimita um determinado 'loco de declara/=es para um identificador espec2fico evitando a declara/"o
deste identificador, A sinta3e do comando : VI<# Mnome do identi%icadorN 5O McomandosNJ,
)3:
'egin
\ ,,, comandos iniciais ,,, ]
/it0 %orm1 do
'egin
Caption :U ^<este_D **)&uivalente a Lorm1,Caption
Border+tKle :U 's+i6a'leD **)&uivalente a Lorm1,Border+tKle
endD
endD
5ecara.es
Declara/=es descrevem a/=es de um algor2tmo a serem e3ecutadas,
begin... endJ
Prende um con0unto de declara/=es em um 'loco de comandos determinado,
A sinta3e do comando : 3E=I+ McomandosN E+5J, )3:
begin
\ ,,, comandos iniciais ,,, ]
begin
\ ,,, 'loco 1 ,,, ]
endD
begin
\ ,,, 'loco # ,,, ]
endD
\ ,,, comandos finais ,,, ]
endD
2.$.2. i%... t0en... ese...J
)sta e3press"o escolhe entre o resultado de uma condi/"o 'ooleana o caminho verdadeiro (then) ou
falso (else), A sinta3e do comando : I4 McondioN <#E+ Mboco de comandosN E'SE Mboco
de comandosNJ, )3:
'egin
\ ,,, comandos iniciais ,,, ]
i% - E 2 t0en
\ ,,, Bloco verdadeiro ,,, ]
ese
Professor: Daniel Moreland Pgina Z de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
\ ,,, Bloco falso ,,, ]J
endD
case... o%... ese... endJ
Consiste de uma lista de declara/=es &ue sati6fa6 a condi/"o de um seletor de e3press=es!
se nenhuma parte da lista satisfi6er ao seletor e3ecuta os comandos do su'4comando ese, Para o
seletor ser"o vlidos os tipos definidos! tipo nteiros ou @ongnt, A sinta3e do comando : CASE
MseetorN O4 ME-presso 1NI Mcomando da e-presso 1NJ ME-presso 2NI Mcomando da
e-presso 2NJ ME-presso nNI Mcomando da e-presso nN E'SE McomandoNJ endJ
)3:
'egin
\ ,,, comandos iniciais ,,, ]
case - o%
1I \ ,,, Bloco para 3 U 1 ,,, ]
2H 3I \ ,,, Bloco para 3 U # ou Q U E,,, ]
!..$I \ ,,, Bloco para 4 YU 3 YU Z ,,, ]
ese
\ ,,, Bloco para 3 Y 1 ou 3 W Z ,,, ]J
endJ
endD
repeat... untiJ
Repete um determinado 'loco de declara/=es at a condi/"o
'ooleana do su'comando unti ser satisfeita, A sinta3e do comando
: QEPEA< McomandosNJ unti McondioNJ, )3:
'egin
\ ,,, comandos iniciais ,,, ]
3 :U $D
repeat
3 :U 3 X 1
unti 1- C 22J
endD
2.$.3. %or... to 1do/nto2... do...J
ncrementa em 1 uma determinada varivel inteira! repetindo um 'loco de comandos! at &ue
esta atin0a o valor final do intervalo! o su'comando do/nto reali6a o incremento reverso, A sinta3e do
comando : 4OQ M*aria*eN IC M*aor iniciaN to 1do/nto2 M*aor %inaN do Mboco de comandosNJ,
)3:
'egin
\ ,,, comandos iniciais ,,, ]
%or i IC 1 to 19 do GH)3ecuta o Scomandos AT para i U 1!#!E!4!%!Z!`!a!7
e 1$
\ ,,, Comandos A ,,, ]
%or s IC 19 do/nto 1 do GH)3ecuta o Scomandos BT para i U
1$!7!a!`!Z!%!4!E!# e 1
\ ,,, Comandos B,,, ]
endD
/0ie... do...J
Repete um 'loco de comandos en&uanto &ue determinada condi/"o
'ooleana se0a satisfeita, A sinta3e do comando : V#I'E McondioN
5O Mboco de comandosNJ, )3:
'egin
\ ,,, comandos iniciais ,,, ]
/0ie i IC 1 do GHRepete o SBloco de comandosT en&uanto i U 1
\ ,,, Bloco de comandos ,,, ]
endD
Professor: Daniel Moreland Pgina ` de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
2.&. 3ocos de Procedimentos ou 4un.es
As procedures ou funes so declaradas na seo de tipos de
declaraes (abaixo do coando type! pertencendo ao ob"eto ou sere
do tipo public (p#blicas $ executadas por outras unidades! ou private
(particulares $ restritas a unidade local!.
2.&.1. Procedure
procedure Mcabea0oNJ *ar Mdecarao das *ari*eisNJ Mboco de comandosNJ
. ca'e/alho da procedure composto pelo nome do procedimento e variveis &ue ser"o
rece'idas (ou modificadas atravs da declara/"o *arH e3: procedure teste(*ar 3:string)D),
procedure soma(a!': integer)D GH n2cio enviando as variveis A e B do tipo inteiro,
var **Declara/"o de variveis locais,
c: integerD
'egin **Corpo do procedimento,
c :U a X 'D
endD
2.&.2. 4unction
%unction Mcabea0oN I MresutadoNJ *ar Mdecarao das *ari*eisNJ Mboco de comandosNJ
As fun/=es se diferem dos procedimentos pela o'rigatoriedade do retorno de um resultado!
podendo este resultado ser retornado pela declara/"o: Mnome da %unoN IC *aor ou resut IC
*aor,
function soma(a!': integer) : integerD GHn2cio enviando as variveis A e B do tipo inteiro,
'egin GHCorpo do procedimento,
soma :U a X 'D GH ou result :U a X 'D
endD
bunto com o Delphi 7 vem o manual de Object Pasca em formato .#'P! caso a linguagem
se0a novidade para voc- aconselho &ue voc- d- uma 'oa olhada (o Delphi *.0 tra6 o mesmo manual!
mas em formato .P54)! mas n"o se preocupe com o &ue foi e3plicado acima 0 est mais do &ue
suficiente para uma 'oa iniciali6a/"o com o Delphi,
<udo o &ue vimos a cima o &ue normalmente temos em outras linguagens comuns! mas o
caracteri6a realmente a linguagem .rientada em .'0etos o tra'alho e a manipula/"o com os
mesmos,
Professor: Daniel Moreland Pgina a de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
3. Programando com objetos 5ep0i
cuando iniciado o Delphi! criado automaticamente um novo pro0eto e um o'0eto formulrio
(derivado da classe <4orm) para o suporte dos demais o'0etos, )3plorando o )ditor de C5digos
(Code Editor) voc- poder o'servar a declara/"o do novo o'0eto da classe +,or% &ue foi produ6ido
automaticamente com a cria/"o do novo formulrio, )3aminando o conteAdo deste c5digo criado para
o o'0eto! teremos:
unit :nit1D GH A'ertura de uma nova unidade
inter%ace GHPar?metros do o'e0etos
uses
+Ks:tils! (in<Kpes! (inProcs! Fessages! Classes! Nraphics! Controls! GH:so de
outras unidades
Lorms! DialogsD
tWpe
<Lorm1 U cass(<Lorm) GHA declara/"o do o'0eto inicia a&ui
pri*ate
- Pri#ate declarations .
pubic
- P/blic declarations .
endD GHA&ui o final da declara/"o
*ar
Lorm1: <Lorm1D GHAtri'ui a varivel Lorm1 as caracter2sticas do o'0eto <Lorm1
impementation GHn2cio da parte a ser implementada
-0) 1.D,2. GHDiretiva de compila/"o &ue agrega o desenho da tela (em ,DLF) com o
mesmo nome da unidade
end, GHLinal da parte implementada
:m novo tipo de o'0eto +,or%*! declarado derivado da classe +,or%3 &ue tam'm um
outro o'0eto, Relem're um o'0eto um tipo de elemento capa6 de guardar dados e c5digo dentro de
um Anico pacote, At agora! o tipo +,or%* n"o contm campos ou mtodos! isso acontecer com a
adi/"o de alguns componentes neste o'0eto,
.'servando o c5digo! notamos &ue e3iste uma varivel declarada com o nome ,or%* para o
novo tipo de o'0eto +,or%*:
*ar
Lorm1: <Lorm1D
,or%* a chamada de inst?ncia ao tipo +,or%*, )sta varivel refere4se ao formulrio em si!
aonde ser adicionado componentes e desenhado a interface entre o computador e o usurio &ue for
operar o sistema, R sempre notado declara/=es de uma ou mais inst?ncias referidas ao tipo de
o'0eto, Luturamente ser mostrado o poder deste tipo de declara/=es &uando falarmos so're 0anela
FD (2/ltiple Doc/%ent (nter4ace 4 nterface de documento mAltiplos) gerenciando vrias 80anelas
filhas9! n"o permitindo &ue estas 80anelas filhas9 saiam do espa/o criado pela 80anela pai9,
Adicionando alguns componentes ao formulrio! veremos como o Delphi completar a
aplica/"o escrevendo automaticamente o c5digo! e permitindo &ue ao final tornar4se4 poss2vel a
compila/"o (lem'ra4se do Clipper
1
! com .EXE)! e3ecu/"o e distri'ui/"o da aplica/"o,
)m nosso formulrio! colocaremos um 'ot"o &ue! em tempo de e3ecu/"o! ao ser dado um
cli&ue com o mouse so're este o'0eto! o formulrio mude sua cor, Aperte a tecla 412 para retornar a
vis"o do formulrio e na palheta de o'0etos (Co%ponnent Pallete) cli&ue no o'0eto (b/tton locali6ado
na pgina Standard) e cli&ue no formulrio, Ma 0anela da Object (nspector cli&ue na pgina E#ents e
cli&ue duas ve6es so're a a/"o OnClic' e insira o seguinte c5digo:
procedure <Lorm1,Button1ClicO(+ender: <.'0ect)D
begin
Lorm1,Color :U clNreenD
endD
Professor: Daniel Moreland Pgina 7 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Reparando no c5digo completo da aplica/"o! veremos:
unit :nit1D
inter%ace
uses
+Ks:tils! (in<Kpes! (inProcs! Fessages! Classes! Nraphics! Controls!
Lorms! DialogsD
tWpe
<Lorm1 U cass(<Lorm)
Button1: <ButtonD GH:m novo dado foi a&ui inserido

procedure Button1ClicO(+ender: <.'0ect)D GHDeclarado um novo
mtodo
pri*ate
- Pri#ate declarations .
pubic
- P/blic declarations .
endD
*ar
Lorm1: <Lorm1D
impementation
-0) 1.D,2.
procedure <Lorm1,Button1ClicO(+ender: <.'0ect)D GH . c5digo do
novo mtodo
begin
Lorm1,Color :U clNreenD
endD
end,
. novo o'0eto +,or%* agora apresenta um campo B/tton* 4 o 'ot"o &ue voc- adicionou ao
formulrio, +B/tton e o tipo do o'0eto! e B/tton* o o'0eto 'ot"o propriamente dito, Com o tempo
voc- colocar novos componentes ao formulrio,
Rode o pro0eto! clicando no 'ot"o ()/n)! d- um cli&ue no 'ot"o e ve0a o &ue acontece, Pare a
aplica/"o fechando a 0anela com At?4!,
JH+5 por curiosidade! salve este ar&uivo! feche4o e a'ra o ar&uivo 56(+*.D,2 (com a op/"o
4ie d Open 4ie...) notaremos &ue o Delphi criou um ar&uivo com todas as propriedades dos o'0etos
criados e &ue a declara/"o do o'0eto 4orm1 englo'a todos os outros! no/=es de Encapsuamento,
3.1. Estrutura de Aplicaes com o Delphi
:m dos o'0etivos de desenhar aplica/=es do tipo Client " Ser#er para o desenvolvimento a
reutili6a/"o dos o'0etos! das regras de neg5cio e das telas do pro0eto, . Delphi Client " Ser#er S/ite
o Anico &ue implementa uma ar&uitetura incorporando a tecnologia QA5 ()apid Application
De#elop%ent 4 Desenvolvimento Rpido de Aplica/=es) com o desenvolvimento totalmente OO
(Object Orientation 4 .rienta/"o a .'0etos) para a redu/"o do tempo de desenvolvimento e
manuten/=es improvveis, Adicionando! uma ar&uitetura aonde poss2vel a separa/"o da =;I
(7ra4ic 5nit (nter4ace 4 :nidade de nterface Nrfica)! das regras de neg5cio l5gicas e do desenho do
'anco de dados de acordo com o modelo representado a'ai3o:
Professor: Daniel Moreland Pgina 1$ de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
3.1.1.Benefcios!
A separa/"o do desenho da =;I (atravs dos o'0etos 4orms) com a rea de liga/"o
l5gica de dados (atravs dos o'0etos 5ata Rodues) permite &ue se cause um menor
impacto so're am'as as reas, As mudan/as podem ser e3ecutadas nas telas de entrada
ou nas liga/=es! independentemente! de acordo com os re&uerimentos do usurio,
A separa/"o do desenho da =;I com a rea de liga/"o l5gica de dados reali6ada com
uma certa ha'ilidade aos eventos envolvidos! poder n"o necessariamente dever ser
controlada por um ha'ilidoso 53A (Database Ad%inistrator 4 Administrador de Banco de
Dados)! com suas fantsticas regras de neg5cio! podendo inclusive ser mantida por um
8analista de informa/=es9,
. desenho do 'anco de dados! a constru/"o das metodologias de neg5cio e o desenho e
a cria/"o das 0anelas de entrada s"o efetivados dentro da aplica/"o, . desenvolvimento!
ent"o paralelamente! resultar em uma maior rapide6,
Ierdando as 0anelas de entrada! em n2veis de utili6a/"o! redu64se drasticamente o
processo de codifica/"o! e em conse&>-ncia! o processo futuro de manuten/"o, As
mudan/as l5gicas das regras de neg5cio ou a incorpora/"o de novos padr=es! s"o feitas
automaticamente para todos os o'0etos herdados,
. reposit5rio de o'0etos! os formulrios reusveis e a utili6a/"o dos o'0etos 5ata
Rodues! envolve em elimina/"o da duplica/"o de c5digos e de tra'alhos com desenhos
de 0anelas! e em conse&>-ncia na redu/"o da e&uipe de desenvolvimento,
3.". Estrutura de uma Aplicao
Como foi visto! o am'iente cliente servidor permite &ue a aplica/"o se0a distri'u2da entre dois
componentes f2sicos: a esta/"o cliente e o servidor de 'anco de dados, )ntretanto! logicamente
podemos identificar tr-s camadas distintas dentro de uma aplica/"o,
Apresentao
Professor: Daniel Moreland Pgina 11 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Composta por componentes responsveis pela intera/"o da aplica/"o com o usurio final, R
responsa'ilidade dessa camada rece'er os dados e comandos do usurio e devolver4lhe informa/=es
atravs de elementos visuais como consultas! grficos! relat5rios e etcD
'Ygica do +egYcio
Parte da aplica/"o responsvel por manter as regras de neg5cio da empresa, )ssa camada
rece'e os dados da camada de interface e e3ecuta as opera/=es e valida/=es necessrias para
envi4los ao 'anco de dados, Da mesma forma! e3trai os dados do 'anco de dados de acordo com as
regras de neg5cio da aplica/"o e os envia para elementos da interface para &ue se0am e3i'idos,
Portanto! essa camada responsvel em interligar a interface visual com o 'anco de dados
atravs da e3ecu/"o de transa/=es! consist-ncia dos dados e regras de neg5cio! ou se0a! a parte
funcional da aplica/"o,
!. =erenciamento de 5ados
Parte da aplica/"o responsvel pelo acesso e a manipula/"o dos dados no servidor, Como 0
foi visto anteriormente! grande parte dessa camada implementada pelo pr5prio servidor de 'anco
de dados,
Mormalmente o acesso aos servi/os feito atravs da linguagem +c@, Porm! tam'm
necessrio um con0unto de comandos para enviar as senten/as +c@s e gerenciar a comunica/"o
entre a aplica/"o e o servidor, )sses comandos se encontram em 'i'liotecas disponi'ili6adas pelos
pr5prios fornecedores de 'anco de dados &ue s"o instaladas em cada esta/"o de tra'alho, Alm
disso cada fa'ricante de ferramentas de desenvolvimento fornece tam'm mtodos e componentes
capa6es de simplificar e tornar mais transparente o acesso aos diversos +NDBs,
4ig $.1I Camadas 4)sicas e 'Ygicas de uma Apicao.
#.1. $anta%ens da Or%ani&ao da Aplicao em 'amadas
A divis"o da aplica/"o nessas tr-s camadas l5gicas possi'ilita a organi6a/"o e padroni6a/"o
da codifica/"o e constru/"o da aplica/"o! alm de proporcionar uma maior facilidade de manuten/"o
e evolu/"o para novas fases da ar&uitetura Cliente*+ervidor, Como 0 foi visto! a tend-ncia da
ar&uitetura Cliente*+ervidor retirar cada ve6 mais parte do processamento da aplica/"o reali6ado
pelas esta/=es de tra'alho clientes e centrali64lo em servidores! provendo um melhor gerenciamento
do processo e facilitando a evolu/"o da funcionalidade &ue foi distri'u2da,
Professor: Daniel Moreland Pgina 1# de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
A distri'ui/"o da aplica/"o em camadas l5gicas possi'ilita tam'm &ue cada camada possa
evoluir independente das outras desde &ue se mantenha a interface entre elas, Por e3emplo! pode4se
alterar as regras de neg5cio para atender as necessidades do mercado sem necessariamente ter &ue
modificar a camada de interface ou a camada de gerenciamento de dados, Por outro lado! pode4se
evoluir a apresenta/"o para novas tecnologias como multim2dia! sem precisar alterar as regras de
neg5cio, )volu/=es tecnol5gicas! como a distri'ui/"o da 'ase de dados na camada de
gerenciamento de dados pode ser feita de forma transparente das demais camadas, Portanto! esses
tipos de distri'ui/"o tornam as aplica/=es mais escalveis para suportar futuras implementa/=es
possi'ilitando um tempo de vida muito mais longo,
#.". Estrutura de uma Aplicao Delphi
A ferramenta de desenvolvimento Delphi! desde sua primeira vers"o 0 se mostrou
preocupada em distri'uir a aplica/"o nas tr-s camadas l5gicas, )sse esfor/o inicial tem 'eneficiado a
Borland a evoluir a ferramenta para as novas gera/=es da ar&uitetura Cliente*+ervidor, Fuitas outras
ferramentas &ue n"o possu2am essa filosofia de tra'alho est"o enfrentando srios pro'lemas para
sensi'ili6ar seus clientes a necessidade de tra'alhar dessa forma para conseguirem migrar e rece'er
os 'enef2cios da nova gera/"o Cliente*+ervidor,
Para implementar essa filosofia de tra'alho no Delphi! a Borland esta'eleceu tr-s categorias
de componentes: componentes visuais! componentes de acesso e 'ase de dados e componentes de
liga/"o,
4ig $.2I Categorias de componentes do 5ep0i para acesso a base de dados.
)ssa forma de tra'alho organi6ada em camadas distintas permite tam'm uma maior
reutili6a/"o de c5digo e portanto um aumento de produtividade na constru/"o de aplica/=es atravs
dos recursos do Delphi de cria/"o de componentes e 8templates9 de telas,
!.2.1. Componentes *isuais
Componentes responsveis pela interface com o usurio, Correspondem e camada de
Apresenta/"o discutida anteriormente, )sses componentes est"o locali6ados na pgina 5ata
Contros da paleta de componentes do Delphi,
!.2.2. Componentes de Acesso : base de dados
Componentes responsveis em criar toda a estrutura necessria para acessar e manipular o
'anco de dados, +"o os componentes encarregados em interfacear com os servi/os de
gerenciamento e manipula/"o fornecidos pela 'ase de dados, )sses componentes tam'm possuem
Professor: Daniel Moreland Pgina 1E de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
propriedades e eventos destinados a implementa/"o da l5gica de neg5cio na aplica/"o, )sses
componentes est"o locali6ados na pgina 5ata Access da paleta de componentes,
!.2.3. Componente de igao
Componente responsvel pela interface entre as duas camadas acima, +ua principal
caracter2stica tornar os componentes visuais independentes dos componentes de acesso! ou se0a! a
camada de Apresenta/"o da @5gica do Meg5cio, )sse componente o +DataSo/rce &ue fica
locali6ado tam'm na pgina 5ata Access da paleta de componentes,
!.2.!. ;tii8ando 5ata Rodues
)m uma aplica/"o Cliente*+ervidor interessante utili6ar o recurso de Data Fodule
fornecido pelo Delphi, Data Fodule um componente &ue fornece uma locali6a/"o
centrali6ada para componentes n"o4vis2veis do Delphi, Pode4se ent"o utili6ar o Data
Fodule para conter os componentes da categoria Data Access! responsveis pela l5gica
de neg5cio da aplica/"o e interface com o 'anco de dados, Assim! toda a l5gica de
neg5cio fica concentrada em um Anico ponto da aplica/"o facilitando a manuten/"o e
evolu/"o, Para aplica/=es maiores normal &ue se utili6e mais de um Data Fodule
su'dividindo a l5gica de neg5cio,
Para e3emplificarmos esse recurso! iremos construir a tela de cadastro de produtos,, Para se
construir essa tela! deve4se inicialmente criar um Data2od/le e colocar nele um componente
Database.
4ig &.1I Componente (Database.
Componente Propriedade 7aor
DataFodule1 Mame DF+istPendas
<abea de Propriedades.
#.".). 'omponente (Database
Como foi visto o componente +Database responsvel pela cone3"o com o 'anco de dados,
)sse componente possui algumas propriedades &ue permitem a configura/"o dessa cone3"o, Pode4
se utili6ar a op/"o 5atabase Editor do popup menu &ue e3i'ido ao se pressionar o 'ot"o direito do
mouse so're o componente Database*,
Professor: Daniel Moreland Pgina 14 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
4ig &.2I 5atabase Editor
Atravs do Data'ase )ditor pode4se atri'uir os valores para vrias propriedades como foi
mostrado na figura, Alm disso! so'repor valores do 8Alias9 definidos no BD) atravs do 'ot"o
5e%auts,
1 B ;SEQ +AREI )sse par?metro pode ser utili6ado para dei3ar fi3o o usurio &ue ir acessar o
'anco de dados, Algumas empresas adotam essa forma de tra'alho ao invs de criar vrios
usurios no 'anco de dados, )m nosso e3emplo! iremos atri'uir o valor +f+DBA para o
par?metro,
# B PASSVOQ5I +e for fi3ado o valor de :+)R MAF)! pode4se tam'm 0 dei3ar especificada a
senha do usurio, PA++(.RDUmasterOeK
E B SZ'PASS<#Q; RO5EI )sse par?metro possui tr-s valores poss2veis: +IAR)D
A:<.C.FF<! +IAR)D M.A:<.C.FF< e M.< +IAR)D, Deve4se especificar +IAR)D!
&uando dese0a4se &ue todos as atuali6a/=es feitas automaticamente pelo Delphi! as atuali6a/=es
feitas manualmente e o controle de transa/"o usem a mesma cone3"o, cuando a op/"o M.<
+IAR)D utili6ada! uma nova cone3"o escondida esta'elecida com o 'anco de dados, Assim!
todas as atuali6a/=es feitas manualmente atravs do mtodo E-ecS[ de uma 8/er$ e o controle
de transa/"o feito atravs dos mtodos do componente +Database utili6am essa nova cone3"o,
Alm disso! se especificada a op/"o +IAR)D! pode4se ainda escolher entre as op/=es
A:<.C.FF< e M.A:<.C.FF<, A primeira efetiva automaticamente &ual&uer comando +c@
enviado ao servidor! a menos &ue uma transa/"o se0a a'erta e3plicitamente atravs do comando
start transaction, Ma segunda op/"o! os comandos esperam pela e3ecu/"o e3pl2cita do comando
commit para serem efetivados, )m nosso e3emplo! iremos atri'uir o valor +IAR)D
A:<.C.FF< para o par?metro,
Esco0endo entre <<abe e <ZuerW
. Delphi possui dois componentes &ue permitem o acesso e manipula/"o dos dados do
servidor: ++able e +8/er$, . primeiro 'aseado no acesso a uma determinada ta'ela do 'anco de
dados e o segundo 'aseado em uma senten/a +c@ (comando seect), Por ser 'aseado em uma
senten/a +c@! o componente +8/er$ permite tra'alhar com mais de uma ta'ela do 'anco de dados
ao mesmo tempo, Am'os os componentes utili6am a linguagem +c@ para acessar a 'ase de dados,
cuando se tra'alha com ++able! o Delphi gera automaticamente uma senten/a +c@ de acordo com
os par?metros definidos para o componente, Alm dessa diferen/a 'sica entre os dois
componentes! outros fatores devem ser o'servados na escolha,
Professor: Daniel Moreland Pgina 1% de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Abertura
.pera/"o feita &uando e3ecutado o mtodo Open do componente ++able ou +8/er$! &ue
produ6 a compila/"o e e3ecu/"o do comando seect, cuando esse mtodo e3ecutado atravs do
componente ++able! o Delphi reali6a uma srie de outros comandos +c@s para 'uscar informa/=es
do catlogo da ta'ela necessrias para as opera/=es de sele/"o e atuali6a/"o, )ssa 'usca pode ser
otimi6ada atravs da op/"o )MAB@) +CI)FA CACI) do BD)! fa6endo com &ue essas informa/=es
se0am lidas apenas uma ve6 durante a e3ecu/"o da aplica/"o, cuando o primeiro acesso feito! o
BD) arma6ena as informa/=es em um ar&uivo e &ual&uer nova necessidade de a'ertura da mesma
ta'ela n"o necessita 'uscar novamente os elementos do catlogo,
Por outro lado! utili6ando4se o componente +8/er$! pode4se desviar dessa 'usca desde &ue
n"o se utili6e a propriedade Qe[uest 'i*e &ue torna o 8result set9 da 8&uerK9 atuali6vel
automaticamente pelo Delphi, +e o valor da propriedade Qe[uest 'i*e for <R:) e o +)@)C<
utili6ado o'edecer as restri/=es para &ue o Delphi consiga atuali6ar o 8result set9! as mesmas 'uscas
utili6adas para o componente ++able ter"o &ue ser feitas,
Concluindo! para &ue a 'usca de elementos do catlogo n"o se0a feita necessrio utili6ar o
componente +8/er$ e controlar as atuali6a/=es manualmente ou atravs de componentes do tipo
+5pdateS8&,
4itros
:ma das grandes vantagens de se utili6ar +NBDs poder fa6er o filtro no pr5prio servidor e
portanto trafegar um nAmero menor de linhas pela rede, Para se fa6er isso! necessrio utili6ar a
clusula /0ere do comando seect, cuando se envia uma clusula /0ere no comando +c@! o
pr5prio servidor se encarrega de selecionar os registros &ue comp=em a pes&uisa reali6ada! 0
o'servando as melhores alternativas de acesso tentando utili6ar o m3imo dos 2ndices esta'elecidos
no 'anco de dados,
Com o componente +8/er$ isso feito diretamente no comando +c@ suportando a sinta3e
fornecida pela linguagem +c@ do 'anco de dados utili6ado, )ntretanto! se for utili6ada a propriedade
%iter do +8/er$ para filtrar o 8result set9! o Delphi n"o utili6ar os recursos do +NBD para selecionar
os registros e ir tra6er todas as linhas resultantes da cuerK para a esta/"o, +omente &uando essas
linhas forem tra6idas para m&uina cliente! &ue o filtro ser aplicado localmente! tornando cada
linha vis2vel ou n"o na tela,
)ntretanto! com o componente ++able a propriedade %iter e as fun/=es de sele/"o como
SetQange agem de forma diferente, . Delphi tenta tradu6ir as especifica/=es feitas atravs desses
dois mtodos e coloc4las diretamente na clusula /0ere do seect reali6ado, Desta forma!
consegue4se o mesmo desempenho do componente +8/er$! 0 &ue o filtro feito na pr5pria clusula
/0ere, )ntretanto! como o Delphi &ue reali6a a tradu/"o das especifica/=es para a clusula /0ere!
e3iste uma certa limita/"o dessas especifica/=es e se essas n"o conseguirem ser tradu6idas! o filtro
ser feito na pr5pria m&uina cliente, Portanto! o componente +8/er$ mais a'rangente no &ue se
di6 respeito a filtros! suportando de forma mais completa a sinta3e fornecida pelo 'anco de dados,
Com rela/"o ao evento On4iterQecord! em am'os os componentes o filtro aplicado
localmente e portanto todas as linhas &ue comp=em o 8result set9 precisam ser tra6idas para a
esta/"o cliente! n"o utili6ando os recursos do servidor,
<ransa.es
Como 0 foi visto o componente ++able possui uma forma mais inteligente de se comportar do
&ue o componente +8/er$ &uando o 8result set9 est prestes a ser destru2do atravs da reali6a/"o de
um comando commit para finali6ar a transa/"o,
. componente +8/er$ necessita &ue todas as linhas at o final da sele/"o se0am tra6idas
para a esta/"o cliente antes &ue o commit se0a e3ecutado no 'anco para &ue o usurio n"o perca as
linhas &ue ainda n"o foram tra6idas para aplica/"o,
Professor: Daniel Moreland Pgina 1Z de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
b o componente ++able simplesmente fecha o 8result set9 sem nenhum efeito &ue diminua o
desempenho da atuali6a/"o e se houver a necessidade de 'uscar as linhas restantes da ta'ela um
novo seect feito a partir da Altima linha tra6ida,
)ntretanto! alguns 'ancos de dados permitem &ue o commit n"o destrua os 8result set9 ou
pode4se tam'm utili6ar cone3=es separadas para a atuali6a/"o e para o 8result set9, Desta forma
n"o h necessidade do componente +8/er$ reali6ar as 'uscas antes da real necessidade do usurio,
Por outro lado! o componente ++able! dei3a a'erta uma transa/"o &ue pode! dependendo do
'anco de dados! estar travando alguma pgina da ta'ela,
+,mero de <abeas Acessadas
:m outro fator relevante na escolha do componente! o nAmero de ta'elas &ue devem ser
acessadas para 'uscar as informa/=es necessrias para o usurio em uma mesma tela, At um certo
nAmero de ta'elas mais interessante utili6ar o recurso de 80oins9 dos 'ancos para tra6er em um
Anico comando +c@! todo o con0unto de informa/=es, Messe caso um componente +8/er$ deveria
ser utili6ado, cuando isso feito atravs de vrios componentes ++able! as ve6es necessrio tra6er
os dados de todas as ta'elas para a m&uina cliente para &ue a rela/"o entre elas possa ser feita, Mo
melhor caso! se filtrarmos cada ta'ela pelo registro selecionado na outra! ter2amos &ue e3ecutar
vrios comandos +)@)C<s mais simples no servidor contra um Anico comando um pouco mais
comple3o do componente +8/er$,
(rabalhando com o (*uer+
. componente +8/er$ pode ser ent"o utili6ado para acessar e manipular os dados, Como foi visto! a
utili6a/"o desse componente dei3a mais fle32vel o acesso ao 'anco! 0 &ue tra'alha diretamente com
a linguagem +c@, Portanto! manuten/=es evolutivas como acessar mais de uma ta'ela atravs do
mesmo componente podem ser implementadas com mais facilidade,
Afim de continuarmos nossa aplica/"o! devemos colocar um componente +8/er$ no
Data2od/le D2Sist9endas.
4ig &.3I Componente (*uer+
Componente Propriedade 7aor
cuerK1 Mame cProduto
Data'aseMame DBP)MDA+
+c@ +elect g from produto order 'K produto,prodhcd
Re&uest @ive <R:)
Active <R:)
<abea de Propriedades.
A propriedade Qe[uest 'i*e ligada! fa6 com &ue o Delphi tente atuali6ar automaticamente o
8result set9 tra6ido pela 8&uerK9, Desta forma! o componente +8/er$ se comporta de forma
semelhante ao componente ++able,
)ntretanto! para &ue isso se0a poss2vel! o comando +c@ tem &ue o'edecer algumas
restri/=es como por e3emplo:
Professor: Daniel Moreland Pgina 1` de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
1 B Conter apenas uma ta'ela na clusula 4romD
# B M"o possuir agrega/=es atravs de group bW e fun/=es como sum! ma-! etcD
Ap5s termos preenchido o Data2od/le com os componentes responsveis pelo acesso ao
'anco de dados! podemos construir o 8form9 de manuten/"o da ta'ela de produto como a figura a
seguir:
4ig &.!I 4orm de Produto.
Componente Propriedade Valor
%or1 &ae fr'roduto
(aption 'rodutos
'anel1 Ali)n al*op
(aption
'anel2 Ali)n al(lient
(aption
+ata,ource1 &ae +,-ain
+ata,et +-,ist.endas./produto
+0&a1i)ator1 +ata,ource +,-ain
+02dit1..+02dit4 +ata,ource +,-ain
+ata%ield pro3cd..pro3esto4ue
<abea de Propriedades.
Podemos ent"o e3ecutar a aplica/"o e verificar &ue atravs da propriedade Qesut 'i*e do
8prod/to! foi poss2vel atuali6ar os dados e acrescentar novas linhas e ta'ela, )ntretanto! podemos
notar &ue as linhas inseridas desaparecem do 8Result +et9 ao navergarmos para outro registro, )sta
uma restri/"o &ue e3iste no componente +8/er$ &uando se utili6a a propriedade Qesut 'i*e para
torn4lo atuali6vel automaticamente pelo Delphi, Alm disso! foi visto &ue para ser poss2vel tornar o
8result set9 atuali6vel! e3istem algumas restri/=es &uanto ao comando +c@ definido,
Por causa desses motivos! talve6 se0a ent"o necessrio tra'alhar com a propriedade Qesut
'i*e igual a 8Lalse9 e utili6ar um outro artif2cio para tornar o 8result live9 atuali6vel sem restri/=es no
comando +c@ e sem perder as linhas inseridas,
Professor: Daniel Moreland Pgina 1a de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
;tii8ando Cac0ed ;pdates
A outra forma de tornar o 8result set9 de um componente +8/er$ atuali6vel utili6ando o
recurso de 8cached updates9 do Delphi,
cuando a propriedade Cac0ed;pdates est ligada! todas as inser/=es! altera/=es e
e3clus=es reali6adas so're o Dataset n"o s"o enviadas diretamente para o 'anco, Ao invs disso!
s"o arma6enadas em um 8cache9 local na mem5ria at &ue se dispare um comando do Dataset para
aplicar todas as atuali6a/=es atravs de Anico processo no 'anco de dados,
Com isso! toda ve6 &ue for reali6ado um comando post! as altera/=es ser"o enviadas para o
8cache9 ao invs de irem diretamente para o 'anco! se0a atravs do DB6a#i:ator! automaticamente
&uando se dei3a a linha ou atravs da chamada e3pl2cita do comando,
Fesmo se &uisermos enviar linha a linha os registros para o 'anco de dados! talve6 se0a
necessria a utili6a/"o do recurso de 8cached updates9 simplesmente para tornar o 8result set9
atuali6vel! caso n"o se0a poss2vel utili6ar a propriedade Qesut 'i*e do +8/er$,
Para utili6ar o recurso de 8cached updates9! deve4se ligar a propriedade de mesmo nome do
componente +8/er$, Pamos fa6er isso para o 8Prod/to! mas mantendo por en&uanto a propriedade
Qesut 'i*e U 8<rue9,
Pamos retirar do DB6a#i:ator alguns 'ot=es dei3ando somente os 'ot=es de navega/"o, A
seguir! vamos colocar &uatro novos 'ot=es do tipo SpeedB/tton para implementarmos as opera/=es
de inser/"o! e3clus"o! salvamento e cancelamento,

4ig &."I O %orm de Produto.
Componente Propriedade 7aor
+ppedButton1 Mame 'tnAppend
+ppedButton# Mame 'tnDelete
+ppedButtonE Mame 'tn+ave
+ppedButton4 Mame 'tnDiscard
<abea de Propriedades
Devemos agora! implementar o c5digo para os eventos OnCic\ dos 'ot=es,
. primeiro 'ot"o 8'tnAppend9 deve apenas criar uma nova linha no 8result set9 atravs do
mtodo append do componente 8Prod/to, )ntretanto vamos tentar ser um pouco mais genrico no
c5digo para depois podermos reutili6ar o c5digo escrito atravs de 8templates9,
procedure <%rmProduto.btnAppendCic\1SenderI <Object2J
Professor: Daniel Moreland Pgina 17 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
begin
5SRain.5ataSet.AppendJ
endJ
Para o segundo 'ot"o! tam'm n"o h nenhuma novidade,
procedure <%rmProduto.btn5eeteCic\1SenderI <Object2J
begin
5SRain.5ataSet.5eeteJ
endJ
:saremos o terceiro 'ot"o 8'tn+ave9 para aplicar no 'anco de dados todas as altera/=es
feitas nos diversos registros e &ue est"o por en&uanto arma6enadas no 8cached updates9,
procedure <%rmProduto.btnSa*eCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.AppW;pdatesJ
<35E5ataSet15SRain.5ataSet2.Commit;pdatesJ
endJ
Messe caso! foi necessrio fa6er um 8tKpecast9 na propriedade 5ataSet para &ue ela possa
identificar os mtodos AppW;pdates e Commit;pdates, )sses dois mtodos s"o responsveis em
aplicar as altera/=es pendentes no 8cache9 no 'anco de dados,
Alm disso! necessrio utili6ar a 8unit9 &ue contm a classe +BDEDataSet, Podemos fa6er
isso na clusula use da se/"o impementation,
1 B AppW;pdates: esse mtodo aplica no 'anco de dados todas as altera/=es pendentes no
8cached update9,
# B Commit;pdates: esse mtodo limpa do 8'uffer9 do 8cached update9 os registros &ue foram
aplicados no 'anco! ap5s uma atuali6a/"o reali6ada com sucesso,
Para o Altimo 'ot"o (8'tnDiscard9)! podemos utili6ar o mtodo Cance;pdates &ue tam'm
limpa o 8'uffer9! mas descartando todas as altera/=es atualmente contidas no 8cached update9,
procedure <%rmProduto.btn5iscardCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.Cance;pdatesJ
endJ
Desta forma! temos a tela de produtos funcionando atravs do recurso 8cached updates9! ou
se0a! as altera/=es sendo enviadas em con0unto para o 'anco de dados,
Alm disso! essa uma alternativa para criar 8result sets9 atuali6veis sem utili6ar a
propriedade Qe[uest 'i*e! como verermos a seguir,
;tii8ando o Componente <;pdateSZ'
)3istem duas maneiras de se tornar o 8result set9 de uma 8&uerK9 atuali6vel! sem as
limita/=es impostas pela defini/"o da propriedade Qe[uest 'i*e, A primeira utili6ando o
componente +5pdateS8&, Atravs desse componente poss2vel definir os comandos &ue ser"o
utili6ados para efetuar as opera/=es de inser/"o! altera/"o e e3clus"o, A segunda forma atravs do
evento On;pdateQecord e ser vista mais adiante nos pr53imos cap2tulos,
Pamos ent"o colocar um componente +5pdateS8& no Data2od/le da aplica/"o! como
mostrado na figura! e definir algumas propriedades atravs da ta'ela a seguir,
Professor: Daniel Moreland Pgina #$ de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7

4ig &.$I Componente ,-Produto.
Componente Propriedade 7aor
:pdate+c@1 Mame :+Produto
cProduto Re&uest @ive Lalse
:pdate.'0ect :+Produto
<abea de Propriedades
Pressionando o 'ot"o direito do mouse so're o componente! pode4se selecionar a op/"o
;pdate SZ' Editor... para a'rir uma tela &ue ir permitir a gera/"o dos comandos +c@s de
atuali6a/"o simplesmente definindo alguns par?metros,
dessa ta'ela para as listas e direita da tela, +e e3istir somente uma ta'ela! toda esse
procedimento n"o ser necessrio! 0 &ue a ta'ela e seus campos ser"o tra6idos automaticamente,
As duas listas da direita apresentam todos os campos contidos na ta'ela, Deve4se selecionar
na primeira lista 8ieK Lields]! os campos &ue ser"o utili6ados na clusula /0ere dos comandos
update e deete, Pode4se optar somente pela chave! caso se &ueira dei3ar a concorr-ncia mais livre!
ou escolher todos os campos para verificar se o registro 0 foi alterado por outro usurio, Desta forma!
consegue4se simular os valores 8up(hereieK.nlK9 e 8up(hereAll9 respectivamente da propriedade
;pdateRode do DataSet! 0 &ue essa propriedade s5 vlida &uando se utili6a a propriedade
Qe[uest 'i*e igual a 8<rue9,
Para selecionar apenas a chave primria! pode4se utili6ar o 'ot"o Seect PrimarW ^eWs, )m
nosso e3emplo! vamos utili6ar esse 'ot"o para selecionar apenas a chave primria,
Deve4se selecionar na lista ;pdate4ieds! os campos &ue ser"o alterados e inseridos pelos
comandos update e insert,
Linali6ando! o Altimo 'ot"o serve para gerar os comandos +c@s! seguindo o &ue 0 foi
definido,
Depois de gerado! os comandos podem ainda sofrer modifica/=es, Pode4se por e3emplo
retirar a coluna PR.hCD da clusula set do comando update! 0 &ue n"o devemos dei3ar o usurio
alterar a chave primria, sso pode at causar um erro em alguns 'ancos de dados,
Pode4se notar &ue em alguns lugares foram utili6ados prefi3os 8.@D9 antes do nome das
colunas, sso foi feito para &ue se0a testado o valor anterior a modifica/"o reali6ada ao invs do valor
atual, )sse processo necessrio &uando utili6a4se todos os campos na clusula /0ere! para
permitir &ue os campos se0am alterados e a verifica/"o se0a feita a partir de seus valores anteriores,
=ra*ao 'in0a a 'in0a ou em 3atc0
Mo in2cio do e3emplo! as grava/=es eram feitas linha a linha, Ao sair de um registro para o
outro! as altera/=es eram automaticamente gravadas no 'anco de dados, )ntretanto! este
comportamento foi alterado &uando se optou em tra'alhar com 8cached update9, Apesar do recurso
8cached update9 apresentar tais caracter2sticas! n"o foi por esse motivo &ue n5s o utili6amos em
nosso e3emplo, . motivo principal de termos utili6ado o recurso de 8cached updates9 foi para permitir
&ue um comando &ual&uer +c@! sem limita/=es! pudesse gerar um 8result set9 atuali6vel,
Professor: Daniel Moreland Pgina #1 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
cual ser ent"o a melhor forma de tra'alhar j La6er as grava/=es linha a linha ou arma6en4
las em um 8cache9 e depois envi4las todas de uma ve6 para o servidor, Cada uma das alternativas
possuem vantagens e desvantagens &ue devem ser o'servadas antes de se escolher o processo &ue
ser utili6ado,
Pode4se citar como vantagens de se tra'alhar com atuali6a/=es em 8'atch9! ou se0a!
arma6enando no 8cache9 e enviando o con0unto de atuali6a/=es de uma Anica ve6 para o 'anco:
1 B .s pacotes da rede ser"o melhor dimensionados! alm de diminuir o nAmero de comandos &ue
ser"o enviados pela rede! tendo no total um trfego 'em menor na rede,
2 B +e um controle de transa/"o estiver sendo utili6ado! permite &ue a atuali6a/"o se0a uma
opera/"o Anica, +e um dos comandos falhar! nenhum comando efetivado e o 'anco de dados
volta para o estado original antes do in2cio da transa/"o,
E Porm este mtodo tam'm possui algumas desvantagens:
B )sse mtodo pode confundir o usurio, . usurio pode perder o controle do &ue ele 0
atuali6ou, Alm disso! se um erro ocorrer na grava/"o! a corre/"o do registro ou dos
registros pelo usurio um processo dif2cil de ser implementado,
B Como o usurio pode levar muito tempo para alterar os registros! e3iste uma pro'a'ilidade
maior de um outro usurio ter alterado o mesmo registro e portanto 'lo&uear a grava/"o,
B .utro fator importante a ser considerado o tempo de espera do usurio, )m um sistema! o
usurio nunca gosta de esperar muito tempo por um determinado processo, A grava/"o
linha a linha distri'ui o processo total de atuali6a/"o em pe&uenos intervalos de tempo &ue
s"o muitas ve6es consumidos pelo pr5prio tempo de digita/"o do usurio tornando4os
impercept2veis, b a grava/"o em 8'atch9! dependendo da comple3idade do processo &ue
est sendo reali6ado! pode demorar muito! 0 &ue toda a atuali6a/"o feita de uma Anica
ve6, . tempo total da atuali6a/"o em 8'atch9 at menor do &ue os feitos linha a linha! 0
&ue um nAmero menor de comandos s"o enviados ao 'anco, )ntretanto o usurio poder
achar a performance da grava/"o linha a linha 'em melhor do &ue a outra! por&ue o tempo
total dilu2do em diversas opera/=es de tempo 'em menores,
Atravs da discuss"o acima! pode4se concluir &ue as grava/=es linha a linha parecem ser um
mtodo mais interessante de se utili6ar! a menos &ue ha0a a necessidade da grava/"o ser reali6ada
dentro de uma Anica transa/"o! como por e3emplo! o cadastro de um pedido e de seus itens,
Para fa6er isso no Delphi! podemos continuar utili6ando o recurso 8cached updates9! mas
&uestionando ao usurio o salvando ou cancelamento das altera/=es antes &ue ele dei3e o registro,
Antes de fa6er isso! vamos organi6ar um pouco mais nossa aplica/"o, Ao invs de
implementarmos a l5gica diretamente nos eventos dos 'ot=es! vamos criar procedures separadas
para cada evento para &ue estes possam depois serem reutili6ados mais facilmente,
.
.
pubic
M Pubic decarations N
procedure Sa*eJ

procedure +e/4orInsertJ
procedure 5eeteJ
procedure 5iscardJ
endJ
.
.
Professor: Daniel Moreland Pgina ## de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Depois de criar as procedures! vamos transferir o c5digo contido nos eventos dos 'ot=es para
as novas procedures:
procedure <%rmProduto.btnAppendCic\1SenderI <Object2J
begin
+e/4orInsertJ
endJ
procedure <%rmProduto.btn5eeteCic\1SenderI <Object2J
begin
5eeteJ
endJ
procedure <%rmProduto.btnSa*eCic\1SenderI <Object2J
begin
Sa*eJ
endJ
procedure <%rmProduto.btn5iscardCic\1SenderI <Object2J
begin
5iscardJ
endJ
procedure <%rmProduto.+e/4orInsertJ
begin
5SRain.5ataSet.AppendJ
endJ
procedure <%rmProduto.5eeteJ
begin
5SRain.5ataSet.5eeteJ
endJ
procedure <%rmProduto.Sa*eJ
begin
<35E5ataSet15SRain.5ataSet2.AppW;pdatesJ
<35E5ataSet15SRain.5ataSet2.Commit;pdatesJ
endJ

procedure <%rmProduto.5iscardJ
begin
<35E5ataSet15SRain.5ataSet2.Cance;pdates
endJ
Para facilitar o gerenciamento dos eventos interessante criar uma varivel &ue indi&ue se
um determinado evento est sendo e3ecutado, Atravs desse mtodo! pode4se verificar dentro de
evento! se ele est sendo e3ecutado por um outro evento e assim 'lo&uear chamadas mAltiplas de
um mesmo evento,
Pamos criar o seguinte tipo de dado na se/"o tWpe da inter%ace:
<OperStateC1op+oneHop+e/4orInsertHop5eeteHopSa*eHop5iscard2J
Ma se/"o pubic da classe <%rmProduto! podemos criar uma varivel desse tipo:
.
.
pubic
M Pubic decarations N
OperStateI <OperStateJ
procedure Sa*eJ
procedure +e/4orInsertJ
procedure 5eeteJ
procedure 5iscardJ
endJ
.
Professor: Daniel Moreland Pgina #E de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Podemos iniciali64la no evento OnCreate da ,or%:
procedure <%rmProduto.4ormCreate1SenderI <Object2J
begin
OperStateICop+oneJ
endJ
Agora! para cada evento devemos controlar o valor da varivel atri'uindo a ela a opera/"o
&ue est sendo e3ecutada e retornando ao valor original no final do evento,
procedure <%rmProduto.+e/4orInsertJ
*ar OdOperStateI <OPerStateJ
begin
OdOperStateICOperStateJ
OperStateICop+e/4orInsertJ
trW
5SRain.5ataSet.AppendJ
%inaW
OperStateICOdOperStateJ
endJ
endJ
Com isso! 0 temos o c5digo mais organi6ado e com mais poder de gerenciamento, Pamos
agora implementar o salvamento linha a linha, Para isso vamos utili6ar o evento On;pdate5ata do
DataSo/rce &ue disparado sempre &ue se tentar enviar uma linha alterada para o 8cache9! ou se0a!
sempre &ue e3ecutado um comando post,
Messe evento iremos perguntar ao usurio se ele dese0a gravar o registro! descartar as
altera/=es ou cancelar a tentativa de sair do registro,
procedure <%rmProduto.5SRain;pdate5ata1SenderI <Object2J
*ar retI integerJ
begin
I% OperState in Fop+oneHop+e/4orInsertG t0en begin
retICAppication.Ressage3o-1S5eseja sa*ar as atera.esSH
SCon%irmaoSH R3U_ES+OCA+CE' ? R3UICO+Z;ES<IO+ 2J
case ret o%
id_esI Sa*eJ
id+oI 5iscardJ
idCanceI AbortJ
endJ
endJ
endJ
A primeira coisa &ue ser feita no evento checar se nenhuma opera/"o conhecida est
sendo e3ecutada, M"o &ueremos! por e3emplo! &ue a pergunta se0a feita se o usurio apertar o 'ot"o
de salvar,
Depois ser feita a pergunta para o usurio e com a resposta foi montado um comando case,
+e o usurio &uiser salvar! simplesmente chamamos o comando Sa*e. +e ele n"o &uiser!
descartamos a altera/"o antes de sair do registro, ) se ele &uiser cancelar! e3ecutamos o comando
Abort,
Podemos melhorar o evento 5iscard para descartar e limpar o 8cache9 apenas se ele conter
algum registro, Caso contrrio podemos apenas descartar as altera/=es antes mesmo delas irem
para o 8cache9,
procedure <%rmProduto.5iscardJ
*ar OdOperStateI <OPerStateJ
begin
OdOperStateICOPerStateJ
Professor: Daniel Moreland Pgina #4 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
OperStateICop5iscardJ
trW
I% <35E5ataSet15SRain.5ataSet2.;pdatesPending t0en
<35E5ataSet15SRain.5ataSet2.Cance;pdates
ese
<35E5ataSet15SRain.5ataSet2.CanceJ
%inaW
OperStateICOdOperStateJ
endJ
endJ
. mtodo cance do DataSet descarta as altera/=es &ue ainda n"o foram para o 8cached
updates9, Atravs da propriedade ;pdatesPending! pode4se verificar se e3istem registros pendentes
no 8cache9 &ue ainda n"o foram enviados para o 'anco,
Para finali6ar! devemos acrescentar os comandos &ue efetivam o 8cached updates9 no 'anco
ap5s o e3clus"o de um registro no evento 5eete,
procedure <%rmProduto.5eeteJ
*ar OdOperStateI <OPerStateJ
begin
OdOperStateICOPerStateJ
OperStateICop5eeteJ
trW
5SRain.5ataSet.5eeteJ
<35E5ataSet15SRain.5ataSet2.AppW;pdatesJ
<35E5ataSet15SRain.5ataSet2.Commit;pdatesJ
%inaW
OperStateICOdOperStateJ
endJ
endJ
Professor: Daniel Moreland Pgina #% de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
<raba0ando com o <<abe
Como foi visto! fa6er uma simples tela de cadastro com o componente +8/er$ foi um pouco
tra'alhoso, . mesmo n"o acontece com o componente ++able! &ue poderia fornecer a mesma
funcionalidade atravs de um processo muito mais simples,
Pamos implementar ent"o uma outra tela de cadastro! mas agora utili6ando o componente
++able, Para isso vamos colocar um componente ++able no Data2od/le DF+istPendas,

4ig &.(I Componente ((able.
Componente Propriedade 7aor
<a'le1 Mame <:L
Data'aseMame DBP)MDA+
<a'leMame :L
Active <R:)
<abea de Propriedades.
:tili6aremos este componente ++able para acessar a ta'ela de :L no 'anco de dados,
Pamos montar a tela de maneira parecida com a &ue montamos para a tela de Produto,
4ig &.6I <ea de ;4.
Componente Propriedade 7aor
form1 Mame frm:L
Caption :L
Panel1 Caption
Panel# Caption
Data+ource1 Mame D+Fain
Data+et DF+istPendas,<:L
DBMavigator Data+ource D+Fain
+ppedButton1 Mame 'tnAppend
Professor: Daniel Moreland Pgina #Z de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
+ppedButton# Mame 'tnDelete
+ppedButtonE Mame 'tn+ave
+ppedButton4 Mame 'tnDiscard
DB)dit1,,DB)dit# Data+ource D+Fain
DataLield :Lh+N,,:LhMF
<abea de Propriedades.
Podemos implementar os eventos OnCic\ dos 'ot=es simplesmente e3ecutando os
respectivos mtodos do DataSet associado ao DataSo/rce DS2ain,
procedure <%rm;4.btnAppendCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.AppendJ
endJ
procedure <%rm;4.btn5eeteCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.5eeteJ
endJ
procedure <%rm;4.btnSa*eCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.PostJ
endJ
procedure <%rm;4.btn5iscardCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.CanceJ
endJ
Podemos agora alterar a tela principal do pro0eto para frm:L e e3ecutar a aplica/"o, remos
notar &ue a tela funciona de uma forma 'em semelhante e tela de Produto, Por&ue ent"o implementar
telas com +8/er$! se atravs do componente ++able muito mais simples e rpida a constru/"o j
Alm da facilidade! a implementa/"o atravs do componente ++able mais eficiente &uando
a transa/"o finali6ada 0 &ue n"o 'usca todos os registros no 'anco, )ntretanto! teremos &ue optar
pela implementa/"o atravs do +8/er$ &uando e3istir um nAmero maior de ta'elas envolvidas em
uma Anica tela, Cada ++able ir e3ecutar um comando seect! &ue poderia talve6! ser e3ecutado por
um Anico comando atravs do componente +8/er$ com uma performance 'em melhor, .utra
pe&uena desvantagem do componente ++able &ue ele necessita 'uscar as informa/=es de catlogo
o &ue fa6 demorar mais na primeira a'ertura de cada ta'ela, Porm com a op/"o )MAB@)D
+CI)FA CACI) do BD) ligada! esse pro'lema pode ser minimi6ado,
<ea de Consuta Espec)%ica
:ma outra forma de filtrar a pes&uisa &ue ser feita no 'anco de dados para 'uscar o registro
&ue o usurio dese0a! criar uma tela de consulta separada da tela de manuten/"o, Com isso a tela
de manuten/"o n"o precisa conter elementos de navega/"o! 0 &ue pode tra'alhar com apenas um
registro de cada ve6, . usurio utili6a a tela de consulta para filtrar! pes&uisar e selecionar o registro
dese0ado &ue transferido para a tela de manuten/"o! onde normalmente informa/=es mais
detalhadas s"o apresentadas! permitindo ao usurio reali6ar as manuten/=es necessrias so're esse
registro,
Com esse tipo de padr"o de cadastro poss2vel tam'm! fa6er um melhor 'alanceamento
entre os dados necessrios para consulta e os dados necessrios para a manuten/"o! 0 &ue estes
est"o em telas diferentes, Para discutir esses conceitos! vamos implementar a tela de cliente na
aplica/"o e3emplo,
<ea de Consuta
Professor: Daniel Moreland Pgina #` de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Ma tela de consulta e3plora4se a ta'ela ou as ta'elas envolvidas! no sentido vertical! ou se0a!
um nAmero maior de registros devem ser tra6idos para aplica/"o para permitir &ue o usurio fa/a a
escolha navegando entre eles, )ntretanto! a sele/"o pode ser redu6ida hori6ontalmente! 0 &ue a
escolha do usurio pode ser feita e3i'indo4se um nAmero pe&ueno de colunas! e conse&>entemente
de ta'elas! &ue o au3iliem na sele/"o, Para isso preciso aplicar o seguinte conceito: informa/=es de
ta'elas relacionadas e ta'ela principal n"o devem participar da sele/"o e sim dos filtros, Por
e3emplo! se o usurio necessitar escolher clientes de uma determinada cidade! ao invs de mostrar
na consulta as cidades &ue o cliente pertence! fa/a4o informar antes da consulta a cidade da &ual os
clientes ele dese0a, Atravs dessa tcnica! elimina4se o nAmero de ta'elas necessrias na clusula
%rom! tornando o comando seect 'em mais eficiente com o mesmo resultado para o usurio &ue
dese0ava selecionar um cliente de uma determinada cidade,
remos em nosso e3emplo construir uma tela de consulta espec2fica para selecionarmos o
cliente, Antes porm! iremos criar alguns componentes DataSets no Data2od/le,
4ig (."I 5ataRodue 5RSist7endas
Componente Propriedade 7aor
cuerK1 Mame cConsCliente
Data'aseMame DBP)MDA+
+c@ +)@)C< P)++.A,P)+hCD !
P)++.A,P)+hMF !
P)++.A,P)+h<P !
)++.A,P)+hCNCCPL LR.F
C@)M<) C@)M<) ! P)++.A
P)++.A (I)R)
( C@)M<),P)+hCD U
P)++.A,P)+hCD ) .RD)R
Bf P)++.A,P)+hMF
<a'le1 Mame <ConsCli:L
Data'aseMame DBP)MDA+
<a'leMame :L
cuerK# Mame cConsCliCidade
Data'aseMame DBP)MDA+
+c@
+)@)C< g LR.F (5+A+2
67282 9%3,: ;
<9%3,:
'aras 9%3,: = ,trin)
<abea de Propriedades
A figura a seguir mostra a tela de consulta de clientes, Mote &ue s"o colocados na parte de
cima da tela componentes +Edit para &ue o usurio possa fa6er a pes&uisa antes de tra6er os dados
para tela, Messa sele/"o! encontram4se os campos :L e CDAD) &ue representam o relacionamento
da ta'ela principal P)++.A com as ta'elas :L e CDAD), Portanto estas ta'elas ser"o utili6adas
para permitir o usurio fa6er o filtro! mas n"o entram no seect principal da tela,
Professor: Daniel Moreland Pgina #a de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
4ig (.$I <ea de Consuta de Cientes.
Componente Propriedade 7aor
form1 Mame frmConsCliente
Caption Clientes
Panel1 Align al<op
@a'el1 Caption C5digo
@a'el# Caption Mome
@a'elE Caption :L
@a'el4 Caption Cidade
)dit1 Mame edtCodigo
)dit# Mame edtMome
)ditE Mame edt:L
)dit4 Mame edtCidade
Button1 Mame 'tnPes&uisa
Caption Pes&uisa
'utton# Mame 'tnMovo
Caption Movo
Data+ource1 Mame D+Fain
Data+et DF+istPendas,cConsCliente
Data+ource# Mame D+:L
Data+et DF+istPendas,<ConsCli:L
Data+ourceE Mame D+Cidade
Data+et DF+istPendas,cConsCliCidade
Panel# Align alClient
D'Nrid1 Data+ource D+Fain
PanelE Align alBottom
Bit'tn1 iind 'O.O
Bit'tn# iind 'OCancel
<abea de Propriedades
Professor: Daniel Moreland Pgina #7 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
Para o usurio poder selecionar uma cidade e ou uma :L utili6aremos um Nrid &ue ser
e3i'ido &uando ele posicionar no campo de :L ou de Cidade,
Professor: Daniel Moreland Pgina E$ de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7

4ig (.$I =rid para permitir a seeo de um ;4 peo usurio.
Para fa6ermos essa consulta! iremos criar uma tela com um Nrid dentro como mostrado na
figura seguinte:

4ig (.&I =rid para consuta.
Componente Propriedade 7aor
Lorm1 Mame frmNrid
Border+Kle 'sMone
DBNrid1 Align alClient
.ptions Sdg<itles! dgColumnResi6e! dgCol@ines! dg<a's! dgRo;+elect!
dgConfirmDelete! dgCancel.n)3itT
<abea de Propriedades
Devemos implementar tam'm os seguintes eventos:
procedure <%rm=rid.53=rid1^eWPress1SenderI <ObjectJ *ar ^eWI C0ar2J
begin
I% ^eW C P13 t0en begin
RodaQesutICmrO\J
end ese i% \eW C P2& t0en begin
RodaQesutICmrCanceJ
endJ
endJ
procedure <%rm=rid.4ormCose1SenderI<ObjectJ *ar ActionI<CoseAction2J
begin
Professor: Daniel Moreland Pgina E1 de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
ActionICca4reeJ
endJ
procedure <%rm=rid.53=rid15bCic\1SenderI <Object2J
begin
RodaQesutICmrO\J
endJ
procedure <%rm=rid.4ormS0o/1SenderI <Object2J
*ar p1I<PointJ
begin
P1.-IC<4orm1O/ner2.Acti*eContro.'e%tJ
P1.WIC1<4orm1O/ner2.Acti*eContro.<op ? <4orm1O/ner2.Acti*eContro.#eig0t2J
P1IC<Contro1<4orm1O/ner2.Acti*eContro.Parent2.Cient<oScreen1P12J
I% 1P1.W ? 1"92 E Screen.#eig0t t0en
P1.WICP1.W @ 1"9 @ <4orm1O/ner2.Acti*eContro.#eig0tJ
Set3ounds1P1.-HP1.WH2"9H1"92J
endJ
A implementa/"o do evento 4ormS0o/ fa6 com &ue a ,or% se0a a'erta e3atamente em'ai3o
dos componentes edits da tela de consulta,
. c5digo da tela de consulta fica ent"o da seguinte forma:
unit conscienteJ
inter%ace
uses
Vindo/sH RessagesH SWs;tisH CassesH =rap0icsH ControsH 4ormsH 5iaogsH
5bH 3uttonsH StdCtrsH =ridsH 53=ridsH E-tCtrsH 53CtrsJ
tWpe
<%rmConsCiente C cass1<4orm2
Pane1I <PaneJ
Pane2I <PaneJ
53=rid1I <53=ridJ
edtCodigoI <EditJ
'abe1I <'abeJ
'abe2I <'abeJ
edt+omeI <EditJ
btnPes[uisaI <3uttonJ
Pane3I <PaneJ
3it3tn1I <3it3tnJ
3it3tn2I <3it3tnJ
5SRainI <5ataSourceJ
btn+o*oI <3uttonJ
5S;4I <5ataSourceJ
5SCidadeI <5ataSourceJ
edt;4I <EditJ
edtCidadeI <EditJ
'abe3I <'abeJ
'abe!I <'abeJ
procedure btn+o*oCic\1SenderI <Object2J
procedure btnPes[uisaCic\1SenderI <Object2J
procedure 4ormCreate1SenderI <Object2J
procedure 4orm5estroW1SenderI <Object2J
procedure edt;4Enter1SenderI <Object2J
procedure edtCidadeEnter1SenderI <Object2J
pri*ate
M Pri*ate decarations N

CmdSeectI StringJ
pubic
M Pubic decarations N
Professor: Daniel Moreland Pgina E# de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
sCodCidadeI StringJ
endJ
*ar
%rmConsCienteI <%rmConsCienteJ
impementation
uses 5m91H dbtabesH Cons=ridJ
MOQ A.54RN
procedure <%rmConsCiente.btn+o*oCic\1SenderI <Object2J
begin
edtCodigo.CearJ
edt+ome.CearJ
edt;4.CearJ
edtCidade.CearJ
endJ
procedure <%rmConsCiente.btnPes[uisaCic\1SenderI <Object2J
*ar sV0ereHsSeectHsepIstringJ
nPosOrder3WIintegerJ
begin
<ZuerW15SRain.5ataSet2.CoseJ
SepICSSJ
sV0ereICS And SJ
sSeectICCmdSeectJ
I% 1edtCodigo.<e-t DE SS2 t0en begin
sV0ereIC4ormat1S`s `s 1`s C `s2SHFsV0ereHSepHSPESUC5SHedtCodigo.<e-tG2J
SepICSAndSJ
endJ
I% 1edt+ome.<e-t DE SS2 t0en begin
sV0ereIC4ormat1S`s `s 1`s i\e SS`s`sSS2 SH
FsV0ereHSepHSPESU+RSHedt+ome.<e-tHS`SG2J
SepICSAndSJ
endJ
I% 1edt;4.<e-t DE SS2 t0en begin
sV0ereIC4ormat1S`s `s 1`s C SS`sSS2 SHFsV0ereHSepHS;4US=SHedt;4.<e-tG2J
SepICSAndSJ
endJ
I% 1edtCidade.<e-t DE SS2 t0en begin
sV0ereIC4ormat1S`s `s 1`s C `s2 SHFsV0ereHSepHSCI5UC5SHsCodCidadeG2J
SepICSAndSJ
endJ
I% Sep DE SS t0en begin
nPosOrder3WICPos1SOQ5EQ 3_SH ;pperCase1sSeect22J
i% nPosOrder3W C 9 t0en
sSeectICsSeect ? sV0ere
ese
Insert1sV0ereHsSeectHnPosOrder3W2J
endJ
<ZuerW15SRain.5ataSet2.SZ'.<e-tICsSeectJ
<ZuerW15SRain.5ataSet2.OpenJ
endJ
procedure <%rmConsCiente.4ormCreate1SenderI <Object2J
begin
CmdSeectIC<ZuerW15SRain.5ataSet2.SZ'.<E-tJ
5S;4.5ataSet.OpenJ
endJ
procedure <%rmConsCiente.4orm5estroW1SenderI <Object2J
begin
5S;4.5ataSet.CoseJ
5SCidade.5ataSet.coseJ
Professor: Daniel Moreland Pgina EE de 41
DataLine Onde seu futuro acontece Apostila de
Programao: Deplhi7
<ZuerW15SRain.5ataSet2.SZ'.<E-tICCmdSeectJ
endJ
procedure <%rmConsCiente.edt;4Enter1SenderI <Object2J
begin
%rm=ridIC<4rm=rid.Create1Se%2J
%rm=rid.53=rid1.5ataSourceIC5S;4J
I% 1%rm=rid.S0o/RodaCmrO\2 and 1+ot 5S;4.5ataSet.IsEmptW2 t0en
Professor: Daniel Moreland Pgina E4 de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&

begin
<Edit1Sender2.<e-tIC5S;4.5ataSetFS;4US=SGJ
edtCidade.CearJ
endJ
endJ
procedure <%rmConsCiente.edtCidadeEnter1SenderI <Object2J
begin
5SCidade.5ataSet.CoseJ
<ZuerW15SCidade.5ataSet2.ParamsF9G.*aueICedt;4.<e-tJ
5SCidade.5ataSet.OpenJ
%rm=ridIC<4rm=rid.Create1Se%2J
%rm=rid.53=rid1.5ataSourceIC5SCidadeJ
I% 1%rm=rid.S0o/RodaCmrO\2 and 1+ot 5SCidade.5ataSet.IsEmptW2 t0en
begin
<Edit1Sender2.<e-tIC5SCidade.5ataSetFSCI5U+RSGJ
sCodCidadeIC5SCidade.5ataSet.4ied3W+ame1SCI5UC5S2.AsStringJ
endJ
endJ
end.
<ea de Ranuteno
Como somente um registro tra6ido na tela de manuten/"o! pode4se e3plorar mais o sentido
hori6ontal! tra6endo informa/=es mais detalhadas, Porm! respeitando ainda a regra de n"o tra6er
informa/=es ainda n"o re&uisitadas pelo usurio, Por e3emplo! pode ser &ue a tela da manuten/"o
apresente4se dividida em 8fichas9 ou 8pgina9, +e a informa/"o de uma pgina tem &ue acessar uma
outra ta'ela &ue n"o se0a a ta'ela principal! pode4se esperar o usurio selecionar a pgina para ent"o
'uscar essas informa/=es no 'anco de dados,
Para implementarmos a tela de manuten/"o de clientes! devemos primeiro criar o DataSet
responsvel pela 'usca dos dados no 'anco, :tili6aremos um componente +8/er$ com um comando
+c@ selecionando dados de &uatro ta'elas do 'anco de dados: P)++.A! C@)M<)! CDAD)! :L,
Alm disso ser feito um filtro pelo c5digo da pessoa para &ue se0a selecionado apenas um registro
no 'anco de dados, Desta forma redu6iremos o nAmero de linhas e aumentaremos a &uantidade de
informa/=es so're um determinado cliente,
4ig (.(I 5ata Rodue.
Professor: 5anie Roreand Pgina E% de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&
Componente Propriedade 7aor
cuerK1 Mame ccliente
Data'aseMame DBP)MDA+
Cached:pdate <R:)
:pdate.'0ect :+Pessoa
+c@ +)@)C< P)++.A,P)+hCD! P)++.A,P)+hMF!
P)++.A,P)+h<P ! P)++.A,P)+hCNCCPL !
P)++.A,P)+h@.NRAD.:R. ! P)++.A,P)+hM:F)R. !
P)++.A,P)+hC.FP@)F)M<. ! P)++.A,P)+hBARR. !
P)++.A,CDhCD ! P)++.A,:Lh+N !
P)++.A,P)+hD<hMA+C ! P)++.A,CDhCDhMA+C !
P)++.A,:Lh+NhMA+C ! C@)M<),C@h@F<)CR)D<. !
C@)M<),C@hD)B<. ! CDAD),CDhMF! :L,:LhMF
LR.F P)++.A P)++.A! C@)M<) C@)M<)! CDAD)
CDAD)! :L :L (I)R) P)++.A,P)+hCD U
C@)M<),P)+hCD AMD P)++.A,CDhCD U
CDAD),CDhCD AMD P)++.A,:Lh+N U CDAD),:Lh+N
AMD CDAD),:Lh+N U :L,:Lh+N AMD
P)++.A,P)+hCDU :P)+hCD .RD)R Bf
P)++.A,P)+hMF
+c@ +)@)C< P)++.A,P)+hCD! P)++.A,P)+hMF!
P)++.A,P)+h<P ! P)++.A,P)+hCNCCPL !
P)++.A,P)+h@.NRAD.:R. ! P)++.A,P)+hM:F)R. !
P)++.A,P)+hC.FP@)F)M<. ! P)++.A,P)+hBARR. !
P)++.A,CDhCD ! P)++.A,:Lh+N !
P)++.A,P)+hD<hMA+C ! P)++.A,CDhCDhMA+C !
P)++.A,:Lh+NhMA+C! C@)M<),C@h@F<)CR)D<. !
C@)M<),C@hD)B<. ! CDAD),CDhMF ! :L,:LhMF
LR.F P)++.A P)++.A! C@)M<) C@)M<)! CDAD)
CDAD)! :L :L (I)R) P)++.A,P)+hCD U
C@)M<),P)+hCD AMD P)++.A,CDhCD U
CDAD),CDhCD AMD P)++.A,:Lh+N U CDAD),:Lh+N
AMD CDAD),:Lh+N U :L,:Lh+N AMD
P)++.A,P)+hCDU :P)+hCD .RD)R Bf
P)++.A,P)+hMF
Params P)+hCD d nteger
:pdate+c@1 Mame :+Pessoa
<a'leMame P)++.A
<abea de Propriedades
Podemos agora! construir a tela de manuten/"o como mostra as figuras seguintes:
Professor: 5anie Roreand Pgina EZ de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&

4ig (.6I <ea de Ranuteno de Cientes 1Pg 12.
Componente Propriedade 7aor
Lorm1 Mame frmCliente
Caption Clientes
Panel1 Align al<op
+peedButton1 Mame 'tnAppend
+peedButton# Mame 'tnDelete
+peedButtonE Mame 'tn+ave
+peedButton4 Mame 'tnDiscard
+peedButton% Mame 'tn+earch
PageControl1 Align alClient
<a'+heet1 Caption nforma/=es Nerais
<a'+heet# Caption Pessoa L2sica
<a'+heetE Caption Crditos
Data+ource1 Mame D+Fain
Data+et DF+istPendas,ccliente
DBControls ,,,,, ,,,,,
<abea de Propriedades
.s eventos dos 'ot=es de edi/"o ser"o definidos de maneira similar ao padr"o utili6ado pela
tela de produto! ficando cada um da seguinte forma:
procedure <%rmCiente.btnAppendCic\1SenderI <Object2J
begin
I% +ot 5SRain.5ataSet.Acti*e t0en begin
5SRain.5ataSet.OpenJ
endJ
5SRain.5ataSet.AppendJ
endJ
procedure <%rmCiente.btn5eeteCic\1SenderI <Object2J
begin
5SRain.5ataSet.5eeteJ
<35E5ataSet15SRain.5ataSet2.AppW;pdatesJ
<35E5ataSet15SRain.5ataSet2.Commit;pdatesJ
5SRain.5ataSet.coseJ
endJ
Professor: 5anie Roreand Pgina E` de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&
procedure <%rmCiente.btnSa*eCic\1SenderI <Object2J
begin
<35E5ataSet15SRain.5ataSet2.AppW;pdatesJ
<35E5ataSet15SRain.5ataSet2.Commit;pdatesJ
endJ
procedure <%rmCiente.btn5iscardCic\1SenderI <Object2J
begin
I% <35E5ataSet15SRain.5ataSet2.;pdatesPending t0en
<35E5ataSet15SRain.5ataSet2.Cance;pdates
ese
<35E5ataSet15SRain.5ataSet2.CanceJ
I% <35E5ataSet15SRain.5ataSet2.IsEmptW t0en begin
<35E5ataSet15SRain.5ataSet2.coseJ
endJ
endJ
. 'ot"o de 8Pes&uisa9 ir chamar a tela de consulta de clientes para &ue o usurio possa
escolher um determinado cliente para tra'alhar, Depois de escolhido! informa/=es mais detalhadas
desse cliente s"o tra6idas para a tela de manuten/"o para &ue possam ser visuali6adas e editadas
pelo usurio,
procedure <%rmCiente.btnSearc0Cic\1SenderI <Object2J
begin
5SRain.5ataSet.CoseJ
%rmConsCienteIC<%rmConsCiente.Create1Se%2J
I% 1%rmConsCiente.S0o/RodaCmrO\2 and
1+ot 1%rmConsCiente.5SRain.5ataSetFSPESUC5SG C +u22 t0en
begin
<ZuerW15SRain.5ataSet2.ParamsF9G.*aueIC
%rmConsCiente.5SRain.5ataSetFSPESUC5SGJ
5SRain.5ataSet.OpenJ
endJ
%rmConsCiente.%reeJ
endJ
Podemos utili6ar a pr5pria m&uina de estado do DataSo/rce fornecida pelo Delphi para
controlar a ha'ilita/"o dos 'ot=es:
procedure <%rmCiente.5SRainStateC0ange1SenderI <Object2J
begin
Case 5SRain.State o%
dsInacti*eI
begin
btnAppend.EnabedIC<Q;EJ
btn5eete.EnabedIC4A'SEJ
btnSa*e.EnabedIC4A'SEJ
btn5iscard.EnabedIC4A'SEJ
btnSearc0.EnabedIC<Q;EJ
endJ
dsInsertI
begin
btnAppend.EnabedIC4A'SEJ
btn5eete.EnabedIC4A'SEJ
btnSa*e.EnabedIC<Q;EJ
btn5iscard.EnabedIC<Q;EJ
btnSearc0.EnabedIC4A'SEJ
endJ
dsEditI
begin
btnAppend.EnabedIC4A'SEJ
btn5eete.EnabedIC4A'SEJ
btnSa*e.EnabedIC<Q;EJ
Professor: 5anie Roreand Pgina Ea de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&
btn5iscard.EnabedIC<Q;EJ
btnSearc0.EnabedIC4A'SEJ
endJ
ds3ro/seI
begin
btnAppend.EnabedIC<Q;EJ
btn5eete.EnabedIC<Q;EJ
btnSa*e.EnabedIC4A'SEJ
btn5iscard.EnabedIC4A'SEJ
btnSearc0.EnabedIC<Q;EJ
endJ
endJ
endJ
Para finali6ar devemos fechar o DataSet antes de sairmos da tela de manuten/"o!
implementando o evento OnCose da seguinte forma:
procedure <%rmCiente.4ormCose1SenderI <ObjectJ *ar ActionI <CoseAction2J
begin
5SRain.5ataSet.CoseJ
endJ
Qecursos de 'oo\;p
)3istem vrias formas de fornecer para o usurio uma pes&uisa em registros de ta'elas
secundrias relacionadas com a ta'ela principal, )sse recurso! muitas ve6es chamado de 8looOup9
deve prover implementa/=es para as tr-s fases seguintes:
1 B Preencher e e3i'ir uma lista ou ta'ela de registros para permitir a escolha do usurioD
# B Ao se escolher um registro! deve4se atuali6ar o c5digo relacionado na ta'ela principalD
E B cuando for selecionado um registro na ta'ela principal! deve4se selecionar o registro
correspondente na ta'ela secundria! permitindo a e3i'i/"o de alguns campos como a descri/"o,
Campo 'oo\;p do 5ep0i
. Delphi permite a cria/"o de campos 8looOup_s9 dentro de um dataset para apresentar uma
lista com os registros de uma outra ta'ela relacionada, )sse recurso implementa as tr-s fases
discutidas acima da seguinte forma:
Lase 1,A lista preenchida atravs de um DataSet &ue seleciona os registros da ta'ela
relacionada, R utili6ado componentes co%bo bo; ou list bo; para apresentar a lista, cuando utili6ado
co%bo bo;! a parte edit n"o ha'ilitada para edi/"o! for/ando o usurio a realmente escolher um
elemento vlido da lista, Como utili6ado um componente DataSet para prover a sele/"o! poss2vel
atri'uir filtros ao 8result set9! desde &ue n"o invia'ili6e a fase E, cuando o recurso implementado
diretamente atravs dos componentes (com'o 'o3 e list 'o3) permite &ue o usurio visuali6e mais de
um campo ao mesmo tempo para sele/"o, Para se a'rir a lista de op/=es necessrio o'viamente
&ue o DataSet este0a a'erto,
1 Lase #,cuando selecionado um registro da lista! automaticamente feita a atuali6a/"o do
campo da ta'ela principal relacionado com a chave primria da ta'ela utili6ada para sele/"o,
# Lase E,M"o necessria a participa/"o da descri/"o ou de &ual&uer outro campo &ue se
dese0e visuali6ar da ta'ela secundria no comando seect da ta'ela principal, cuando o
campo (chave estrangeira) da ta'ela principal &ue se relaciona com a ta'ela secundria
tra6ido para a tela! automaticamente o Delphi procura no DataSet secundrio o registro e
mostra os campos descritivos da ta'ela secundria, Portanto! todas as linhas da ta'ela
secundria devem estar dispon2veis na esta/"o cliente para &ue &ual&uer c5digo se0a
Professor: 5anie Roreand Pgina E7 de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&
encontrado, Por isso preciso tomar 'astante cuidado na atri'ui/"o de filtros para permitir
&ue os registros necessrios se0am encontrados pelo Delphi,
A principal vantagem desse mtodo a facilidade de implement4lo no Delphi, Alm disso ele
simplifica o comando +c@ utili6ado para a ta'ela principal! 0 &ue n"o necessita da participa/"o de
outras ta'elas no seect,
Fas deve4se tomar cuidado com sua utili6a/"o &uando as ta'elas relacionadas possuem
muitos registros por&ue 'asicamente todos os registros ter"o &ue ser tra6idos para a m&uina do
usurio pela rede, magine selecionar atravs desse recurso uma ta'ela de clientes com cerca de
1,$$$,$$$ de registros, Apesar da possi'ilidade de se atri'uir filtros ao DataSet responsvel em
popular a lista! isto dif2cil devido a necessidade da fase tr-s de encontrar o registro atravs do
c5digo, +e filtros forem colocados! pode ser &ue esse registro n"o se0a encontrado,
.utro fator &ue deve ser o'servado a &uantidade de ta'elas relacionadas com a ta'ela
principal, +e a ta'ela principal possuir muitas ta'elas relacionadas! para a'rir a ta'ela principal
necessrio a'rir tam'm todas as ta'elas secundrias o &ue pode pre0udicar muito a performance
nesse ponto,
Outros Ratodos
Apesar do nosso e3emplo da tela de cliente tratar ta'elas pe&uenas como :L e cidade! tentaremos
mostrar a utili6a/"o de recursos alternativos &uando o mtodo 8looOup9 do Delphi n"o for satisfat5rio,
1 Lase 1,:tili6aremos o mesmo recurso utili6ado na tela de consulta de clientes para propiciar a
sele/"o de um registro secundrio na tela de manuten/"o de clientes, cuando o usurio
posicionar nos campos da ta'ela principal &ue se relacionam com as ta'elas secundrias! um
8grid9 ser e3i'ido para permitir a escolha,
# Lase #,A atuali6a/"o dos campos da ta'ela principal feita &uando o usurio fecha a tela de
pes&uisa escolhendo uma das op/=es,
E Lase E,Para evitar &ue os DataSets responsveis pelas ta'elas secundrios necessitem ser
a'ertos para a sele/"o de um registro da ta'ela principal! inclu2mos os campos de descri/"o
no pr5prio comando seect,
Fais adiante! nos pr53imos cap2tulos! tentaremos melhorar ainda mais esse recurso!
permitindo ao usurio a atri'ui/"o de filtros,
Portanto os eventos OnEnter dos campos relacionados :Lh+N e CDhCD ficam da seguinte
forma:
procedure <%rmCiente.53Edit6Enter1SenderI <Object2J
begin
I% 5SRain.State DE dsInacti*e t0en begin
I% +ot 5S;4.5ataSet.Acti*e t0en 5S;4.5ataSet.OpenJ
%rm=ridIC<4rm=rid.Create1Se%2J
%rm=rid.53=rid1.5ataSourceIC5S;4J
I% 1%rm=rid.S0o/RodaCmrO\2 and 1+ot 5S;4.5ataSet.IsEmptW2 t0en begin
I% 5SRain.State C ds3ro/se t0en 5SRain.5ataSet.EditJ
5SRain.5ataSetFS;4US=SGIC5S;4.5ataSetFS;4US=SGJ
5SRain.5ataSetFS;4U+RSGIC5S;4.5ataSetFS;4U+RSGJ
5SRain.5ataSetFSCI5U+RSGICSSJ
5SRain.5ataSetFSCI5UC5SGIC+uJ
endJ
endJ
endJ
procedure <%rmCiente.53Edit(Enter1SenderI <Object2J
begin
I% 5SRain.State DE dsInacti*e t0en begin
5SCidade.5ataSet.CoseJ
Professor: 5anie Roreand Pgina 4$ de 41
DataLine Onde seu futuro acontece Apostila de Programa/"o:
5ep0i&
<ZuerW15SCidade.5ataSet2.ParamsF9G.AsStringIC
5SRain.5ataSet.4ied3W+ame1S;4US=S2.AsStringJ
5SCidade.5ataSet.OpenJ

Professor: 5anie Roreand Pgina 41 de 41

Potrebbero piacerti anche