Você está na página 1de 0

ProgramaoOrientadaa

ObjetosAvanada
TDSTecnologia

2008TDSTecnologia


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 2
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

2 Histria

Sumrio

Histria ................................................................................................................................................. 4
O que houve de errado com o SIMULA ? ....................................................................................... 5
Se Tratando de Delphi Language ..................................................................................................... 6
Introduo ao Mundo Orientado a Objetos .......................................................................................... 8
Classes e Objetos ............................................................................................................................. 8
Declaraes Forward........................................................................................................................ 9
Meta Classes .................................................................................................................................. 10
Herana .......................................................................................................................................... 11
Herana por Associao ................................................................................................................. 12
Interfaces ........................................................................................................................................ 12
Implements ..................................................................................................................................... 15
Polimorfismo .................................................................................................................................. 15
Override e Method Hides ............................................................................................................... 17
Polimorfismo Tcito. Pensando em Cadeia Polimrfica ........................................................... 17
Virtual ou Dynamic, eis a questo! ................................................................................................ 18
Sobrecarga de Mtodos .................................................................................................................. 19
Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos. ............ 19
Mtodos Abstratos ......................................................................................................................... 20
Type Casts ...................................................................................................................................... 21
Encapsulamento ............................................................................................................................. 22
Get e Sets ....................................................................................................................................... 23
O Operador Index........................................................................................................................... 23
Propriedades Indexadas.................................................................................................................. 24
Default, NoDefault e Stored ........................................................................................................... 25
Encapsulamento e Classes Amigas ................................................................................................ 25
Design Patterns .................................................................................................................................. 26
Como e Quando tudo Comeou ..................................................................................................... 26
A Gangue Dos Quatro (GoF) ......................................................................................................... 27
Padres Criacionais ........................................................................................................................ 27
Factory Method .............................................................................................................................. 27
Abstract Factory ............................................................................................................................. 29
Builder ............................................................................................................................................ 32
Prototype ........................................................................................................................................ 35
Singleton ........................................................................................................................................ 37
Padres Estruturais ......................................................................................................................... 38
Adapter ........................................................................................................................................... 38
Composite ...................................................................................................................................... 40

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 3
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

3 Histria
Faade ............................................................................................................................................ 42
Proxy .............................................................................................................................................. 44
Padres Comportamentais.............................................................................................................. 47
Iterator ............................................................................................................................................ 47
Observer ......................................................................................................................................... 49
State ................................................................................................................................................ 52
Strategy .......................................................................................................................................... 54
Template Method ........................................................................................................................... 56
Model View Controller - MVC .......................................................................................................... 58
Model ............................................................................................................................................. 58
View ............................................................................................................................................... 58
Controller ....................................................................................................................................... 58
Data Access Objetc - DAO ................................................................................................................ 64
Estrutura DAO ............................................................................................................................... 64
BusinessObject ............................................................................................................................... 65
DataAccessObject .......................................................................................................................... 65
DataSource ..................................................................................................................................... 65
TransferObject ............................................................................................................................... 65
Reflexo ............................................................................................................................................. 70
RTTI ............................................................................................................................................... 70
RTTI para Propriedades ................................................................................................................. 71
RTTI para Mtodos ........................................................................................................................ 73
RTTI para Campos ......................................................................................................................... 74
A diretiva $METHODINFO .......................................................................................................... 76
Reflection .NET ............................................................................................................................. 81
Object Persistence Framework - OPF ................................................................................................ 87
DePO Delphi Persistent Objects (Win32) ...................................................................................... 87
Instalando o DePO ......................................................................................................................... 87
ECO Enterprise Core Objects (.NET) ............................................................................................ 90
Colocando Tudo J unto ..................................................................................................................... 106
O Model ....................................................................................................................................... 106
Controllers .................................................................................................................................... 110
Views ........................................................................................................................................... 118
Apendices ......................................................................................................................................... 137
Banco de dados Orientados a Objetos.......................................................................................... 137
Inserindo a propriedade Telefone em Cliente .......................................................................... 148



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 4
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

4 Histria

Histria

Antes de tudo, muito importante esclarecer que o termo OOP ou Object-Oriented Programming
no se aplica somente a um modelo de programao, e muito menos se restringe a paradigmas como
herana, polimorfismo e encapsulamento. OOP um conceito muito mais amplo do que
imaginamos, e muito mais complexo. Por mais estranho que parea ser, a idia da Orientao a
Objetos surgiu atravs das primeiras linguagens a usar este conceito, SIMULA I entre (1962-1965)
e SIMULA 67 (1967). O Simula 67 (SIMUlation LAnguage) empregou os principais pontos chave
da orientao a objetos, classes e objetos, herana, mtodos virtuais.

A linguagem Simula foi desenvolvida no Centro Noruegus de Computao em Oslo, Noruega, por
Ole-J ohan Dahl e Kristen Nygaard.




O trabalho de Nygaard na Pesquisa Operacional nos anos de 1950 e mais tarde em 1960 criou a
necessidade por ferramentas precisas para a descrio e simulao de sistemas complexos homem-
mquina. Em 1961 a idia surgiu desenvolvendo uma linguagem poderia ser usada para descrio
de sistemas (por pessoas) e para prescrio de sistemas (como um programa de computador atravs
de um compilador). Tal linguagem tem que conter uma linguagem algortmica e o conhecimento de
Dahl em compiladores torna-se essencial.

O compilador do SIMULA I foi parcialmente financiado pela UNIVAC e estava pronto em J aneiro
de 1965. SIMULA I rapidamente comeou uma reputao como uma linguagem de programao de
simulao.

Quando o mecanismo de herana foi inventado em 1967, o Simula 67 foi desenvolvido como uma
linguagem de programao de uso geral, que tambm poderia ser utilizada em vrias reas,
inclusive no sistema de simulao.

Compiladores Simula 67 comeou a aparecer em computadores UNIVAC, IBM, Control Data,
Burroughs, DEC e em outros mais tarde na dcada de 70.

O Simula 67 foi usado por vrias pessoas a redor do mundo, mas o principal impacto aconteceu
atravs da introduo de uma das principais categorias da programao, mais conhecida como
object-oriented programming. Os conceitos do Simula foram importantes na discusso de tipos de
dados abstratos e dos modelos para a execuo de programa concorrente, comeando no princpio
dos anos 70.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 5
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

5 Histria

O Simula 67 e as modificaes do Simula foram usados no projeto de circuitos do VLSI (Intel,
Caltech, Stanford). O grupo de Alan Kay em Xerox PARC usou Simula como uma plataforma para
seu desenvolvimento do Smalltalk (primeira verso da linguagem em 1970), estendendo a
programao orientada a objetos importantemente pela integrao de interfaces de usurio grficas
e a execuo interativa de um programa.

Bjarne Stroustrup comeou seu desenvolvimento do C++(nos 80) trazendo os conceitos chaves do
Simula na linguagem de programao de C. Simula inspirou tambm muito trabalho na rea do
reuso de componente do programa e na construo de bibliotecas.



Bjarne Stroustrup, criador do C++



IDE do SmallTalk



OquehouvedeerradocomoSIMULA?

Simula nunca tornou-se uma linguagem de programao extensamente usada. Existem vrias razes
que explicam este fato:

Gerais:
Nasceu em um pequeno pas Europeu
Congelado em 1968
Caro
No tem uma IDE moderna

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 6
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

6 Histria
Muito complicado
Publicaes insuficientes

Caractersticas da linguagem:
Facilidades limitadas de acesso a arquivos
Ausncia de tipos de dados (records, sets)
Sem paralelismo avanado e suporte em tempo real.
Sem suporte a interface grfica GUI
Pesados executveis para pequenos programas

Caractersticas OOP:
Sem suporte a herana mltipla
Sem suporte a interfaces

Simulao:
Sem suporte automtico de coleo de estatsticas.
Sem suporte a relatrios
Ausncia de facilidades especializadas (resources)


SeTratandodeDelphiLanguage

O primeiro compilador Pascal foi desenvolvido em Zurique para a famlia de computadores CDC
6000, sendo lanado em 1970. Tambm em 1970 foi desenvolvido o primeiro compilador Pascal
norte americano, na Universidade de Illinois por Donald B. Gillies, que gerava cdigo de mquina
nativo para o mini-computador PDP-11.

Pensando-se em propagar rapidamente o uso da linguagem, foi criado, em Zurique, um "kit de
converso" que incluia um compilador que gerava cdigo intermedirio, e um simulador para ele.
Esse kit foi batizado de p-System, e foi utilizado, entre outras coisas, para criar um sistema
operacional para mini-computadores chamado UCSD p-System, desenvolvido pelo Instituto de
Sistemas de Informao da Universidade da Califrnia em San Diego. Segundo o prprio Niklaus
Wirth, o p-System e o UCSD foram instrumentais na popularizao do Pascal.

Nos anos 80, Anders Hejlsberg desenvolveu o compilador Blue Label Pascal o Nascom-2. Depois,
ele foi trabalhar na Borland e reescreveu seu compilador transformando-o no Turbo Pascal para a
plataforma IBM PC (e tambm CP/M 80), que era vendido a US$ 49,95, muito mais barato do que
o Blue Label. Uma caracterstica muito importante que o Turbo Pascal uma linguagem
compilada, que gera cdigo de mquina real para a arquitetura Intel 8088, tornando-a muito mais
rpida do que as linguagens interpretadas.

Por ser mais barato, o Turbo Pascal passou a ter uma grande influncia na comunidade Pascal, que
comeou a se concentrar na plataforma IBM PC no fim dos anos 80. Muitos usurios de PC da
poca migraram para o Turbo Pascal, em busca de uma linguagem estruturada que no fosse
interpretada, para substituir, por exemplo, o BASIC. Pode se afirmar que o sucesso comercial de
Turbo Pascal foi definitivo para a ampla divulgao da linguagem Pascal entre os usurios de
micro-computador.

Outra variante era o Super Pascal, que adicionava labels no numricas, o comando return e
expresses como nomes de tipos.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 7
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

7 Histria
Durante os anos 90, compiladores que podiam ser modificados para trabalhar com arquiteturas
diferentes tiveram grande destaque, incluindo nessa lista o Pascal.




O prximo grande passo para a linguagem, foi a implementao da orientao a objeto (OO ou
OOP em ingls) na sua estrutura, comeando com a verso 5.5 do Turbo Pascal. Mais tarde, ao
projetar o Delphi, querendo funcionalidades mais elaboradas da orientao a objeto, a Borland
utilizou o conceito Object Pascal criado pela Apple, utilizando-o como base para uma nova
linguagem, que nas verses iniciais era chamado de Object Pascal foi rebatizado como Delphi
Programming Language nas verses posteriores. As maiores diferenas em relao s
implementaes OO das verses mais antigas foram a adio do conceito de objetos por referncia,
construtores, destrutores e propriedades, entre outros.

Lembre-se sempre que dominar os paradigmas da orientaco a objetos como herana e
polimorfismo no o far objetivamente, um programador orientado a objetos.


1973 Criamos a linguagem Pascal
1983 Turbo Pascal 1.0
1989 Turbo Pascal 5.5 (Object Pascal)
1995 Delphi 1.0 (Win3.1)
1996 Delphi 2.0 (Win32)
1997 Delphi 3.0
1998 Delphi 4.0
1999 Delphi 5.0
2000 Delphi 6.0
2001 Kylix
(Linux)

2002 Delphi 7.0

2003 Delphi 8.0 for .NET

2004 Delphi 2005

2005 Updates, C++, CF, ALM, Delphi
1973 1983 1989 1995 2000 2004

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 8
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

8 Introduo ao Mundo Orientado a Objetos
Introduo ao Mundo Orientado a Objetos

Costumo dizer que a orientao a objetos no a soluo para todos os problemas. H um ditado
que retrata muito bem isto: "quando a nica ferramenta que temos na mo um martelo, tudo vira
prego". A idia da OOP agregar a modelos de programao estruturados e modular paradigmas
que trazem benefcios objetivos.

Figura X. Pilares da OOP.
ClasseseObjetos

Eu poderia aqui fazer uma grande dissertao acadmica falando de classes e objetos, os
comparando a bolos, carros, pessoas etc.. Acredito que depois de mais de 30 anos ningum agenta
mais tais analogias. Classes representam o prottipo para objetos em memria (instncia). Classes
determinam todo o comportamento de um objeto, em outras palavras um objeto uma
representao fsica de uma classe, assim como uma edificao a representao de uma planta.

A principal motivao que impulsiona a orientao a objetos a criao de classes que representam
uma funcionalidade especfica, uma tarefa determinada, ou seja, para cada classe um objeto, para
cada objeto uma responsabilidade.

Uma classe deve possuir uma classe ancestral obrigatoriamente, contudo no Delphi no necessrio
declarar esta herana explicitamente, pois qualquer classe quando declarada sem sua classe
ancestral, automaticamente herda da classe TObject, que a classe progenitora de todas as classes
que compem a VCL.

Um prottipo de objeto (classe) pode ser composta de campos (Fields), propriedades (property) e
mtodos (procedures e functions).

Toda classe deve possuir ao menos dois mtodos, um mtodo construtor e outro destrutor. Os
mtodos construtores de uma classe so declarados atravs da palavra reservada constructor e
geralmente so chamados de Create. Mtodos construtores so mtodos especializados, pois
alocam toda a memria necessria criao (instanciao) de um objeto, retorna a referncia para
este objeto, e o local recomendado para inicializao de campos, onde todos os membros so
inicializados com nil ou string vazia.


Herana
Orientao a Objetos
Encapsulamento
Polimorfismo
Abstrao

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 9
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

9 Introduo ao Mundo Orientado a Objetos
Dica: caso algo de errado acontea durante a construo do objeto constructor automaticamente
seu mtodo destrutor ser invocado.


Mas ao ser observado a estrutura do construtor na classe base TObject, ser constatado que o
mesmo no possui instruo alguma:

const r uct or TObj ect . Cr eat e;
begi n
end;

Todo construtor automaticamente chama o mtodo NewInstance da classe Tobject que invoca o
mtodo InitInstance. Por sua vez, InitInstance usa a funo InstanceSize do objeto para determinar
quanto em bytes necessrio para alocar memria para o objeto. Nunca o mtodo NewInstance ou
InitInstance devero ser invocados diretamente.

cl ass f unct i on NewI nst ance: TObj ect ; vi r t ual ;
cl ass f unct i on I ni t I nst ance( I nst ance: Poi nt er ) : TObj ect ;
cl ass f unct i on I nst anceSi ze: Longi nt ;

Observe que o mtodo NewInstance virtual, portanto pode ser sobreposto em situaes onde
houver a necessidade de modificao da forma com os recursos (memria) so alocados. Uma vez
que o NewInstance seja sobreposto para customizao da alocao de memria, o FreeInstance
tambm dever ser sobreposto, pois os recursos alocados precisam ser dispensados.

Contudo, no frigir dos ovos objetivamente, no o mtodo Create quem aloca memria
diretamente, ele apenas um estimulador automtico dos mtodos NewInstance e InitInstance.

O mtodo destrutor de uma classe tem um papel inverso ao construtor, sua tarefa desalocar os
recursos que o construtor demandou. Todo mtodo destrutor de um objeto chama automaticamente
o mtodo FreeInstance usa tambm o InstanceSize para dispensar a memria alocada pelo
NewInstance para o objeto.

Contudo isto, se justifica que os mtodos construtor e destrutor de Tobject estejam vazios, pois so
apenas encadeadores dos verdadeiros mtodos que realizam as tarefas de alocar e desalocar
memria para os objetos.


DeclaraesForward

Freqentemente quando trabalhamos com classes comum nos depararmos com a situaes de
mtua dependncia, ou seja, duas classes que fazem referncia uma as outras:

TCl assA = cl ass
B: Tcl assB; / / er r o aqui !
End;

Tcl assB = cl ass
A: Tcl assA;
End;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 10
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

10 Introduo ao Mundo Orientado a Objetos
Um erro em tempo de desenvolvimento seria exibido, pois a classe TclassA usa (associao) a
classe TclassB que est declara aps a classe, ou seja, o compilador ainda no tomou cincia da
existncia da classe TclassB, pois a compilao top-down (de cima para baixo).

Para resolver esta mtua dependncia, usamos uma declarao forward acima da classe
TclassA:

Tcl assB = cl ass; / / decl ar acao f or war d

Tcl assA = cl ass
B: Tcl assB;
End;

Tcl assB = cl ass
A: Tcl assA;
End;

muito comum confundir declaraes forward com a de classes do tipo Tsample =class end. So
coisas totalmente distintas.sdfsdfsdfsdfsdfsdfsdf.

MetaClasses

Meta Classes so estruturas referncia para classes, que podem ser utilizadas no cdigo para
aumentar a flexibilidade. A declarao de um tipo referencia de classe feita atravs da diretiva
class of.

TMet aCl i ent e = cl ass of TCl i ent e;

Com isto, agora temos em TmetaCliente, uma referncia a classe Tcliente, ou seja, TmetaCliente
poder ser exigido em operaes que exijam o tipo da classe e no sua instancia. Observe este
exemplo prtico:


t ype
TBaseCl ass = cl ass
end;

TMet aBaseCl ass = cl ass of TBaseCl ass;

TCl i ent e = cl ass( TBaseCl ass)
Nome: st r i ng;
end;

TFunci onar i o = cl ass( TBaseCl ass)
Mat r i cul a: st r i ng;
end;

Observe que o construtor pode ser invocado atravs de uma varivel referncia de classe.

f unct i on TFor m1. Get Obj ect I nst ance( Met a: TMet aBaseCl ass) : TBaseCl ass;
begi n
r esul t : = Met a. Cr eat e;
end;


Com isso podemos criar instancias de objetos genricos sem conhecer suas estruturas originais.

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 11
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

11 Introduo ao Mundo Orientado a Objetos


var
Cl i ent e: TCl i ent e;
Funci onar i o: TFunci onar i o;
begi n
Cl i ent e : = Get Obj ect I nst ance( TCl i ent e) as TCl i ent e;
Funci onar i o : = Get Obj ect I nst ance( TFunci onar i o) as TFunci onar i o;
end;


Herana

Herana realmente um mecanismo poderoso da orientao a objetos mas, objetivamente no a
panacia tecnolgica. Neste observaremos que valorizam essa prtica e outras as quais ela trs
prejuzos. Herana agrega evidente reaproveitamento de cdigo, onde verdadeira estruturas
codificadas podem se especializadas em uma nova classe. Quando falamos em herana dois termos
precisam ser esclarecidos: Generalizao e Especializao.



Generalizao um grau de abstrao de alto nvel, representada atravs de classes que servem de
base polimrfica e/ou de implementao para classes descendentes. No Delphi isto est presente
em toda a arquitetura da VCL.

TAnimal generalizao de todas as classes que descendem de TAnimal.

A Generalizao pode ser classificada em trs tipos: disjunta, sobreposta, completa ou incompleta.

Especializao a herana propriamente dita, quando reaproveitamos estruturas j declaradas por
uma classe ancestral.

TDog uma especializao de TAninal;

A especializao de uma classe sempre total, ou seja, ao herdar de uma determinada classe, voc
assumir todos os seus membros, sem exceo. Classes especializadas podem ganhar flexibilidade
adicional quando usada associada a mtodos no estticos, que veremos em seguida.

A arquitetura da linguagem Delphi no foi projetada de forma a permitir especializar mais de uma
classe simultaneamente herana mltipla. Acredito que esta regra esteja em total conformidade
com os paradigmas da orientao a objetos.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 12
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

12 Introduo ao Mundo Orientado a Objetos
HeranaporAssociao

Como coloquei no incio do captulo, a herana no soluo para todos os problemas, o velho
problema de martelos e pregos. A herana atribui ao cdigo uma dependncia forte entre as
classes, o que chamamos de forte acoplamento, o que contradiz ao paradigma da orientao a
objetos que prega que o cdigo deve Ter fraco acoplamento. Bom, o que isto significa
objetivamente para o programador? Forte acoplamento se traduz e dependncias que refletem e
diversos efeitos colaterais no cdigo fonte, aquelas pequenas correes ou at mesmo melhorias que
encadeiam uma serie bugs em todo o projeto.

Efeitos colaterais so caracterizados por mudanas no cdigo que afetam o funcionamento de outras
classes que utilizam desta implementao. Um exemplo tpico seria uma classe que usa um servio
de uma outra classe que calcula um determinado imposto. Na evoluo do projeto, muito comum
ocorrem mudanas, e uma destas mudanas afetou a forma de como o imposto calculado para uma
nica situao especfica. Ao altera este comportamento, voc atenderia a demanda especfica, mas
faria com que todas as outras classes que utilizam deste servio deixem de funcionar.

Para minimizar estes reflexos no cdigo, devemos reduzir o acoplamento entre as classes usando
associaes em vez de herana. Associao entre classes estabelecem uma relao lgica que
classificada de duas formas: Agregao ou Composio.

Interfaces

Interface uma ferramenta da orientao a objetos extremamente poderosa. Grande novidade no
Delphi 3, Interfaces propem-se a estabelecer uma camada abstrata que determina uma estrutura ou
contrato para um objeto. Isto significa que, analogamente a um exemplo real como a de construo
de moradias, as necessidades expostas por um processo licitatrio seria nossa interface, ou seja,
toda empresa que desejasse participar do processo dever estar em conformidade com as
necessidades determinadas no documento de licitao. Com isto temos uma abstrao total de qual
empresa objeto efetuar a tarefa.

I l i ci t acao = i nt er f ace
pr ocedur e Document ar Pr oj et os;
pr ocedur e El i ci t ar Requi si t os;
pr ocedur e Model acaoUML;
end;

TEmpr esaA = cl ass( Ti nt er f acedObj ect , I l i ci t acao)
pr ocedur e Document ar Pr oj et os;
pr ocedur e El i ci t ar Requi si t os;
pr ocedur e Model acaoUML;
end;

TEmpr esaB = cl ass( Ti nt er f acedObj ect , I l i ci t acao)
pr ocedur e Document ar Pr oj et os;
pr ocedur e El i ci t ar Requi si t os;
pr ocedur e Model acaoUML;
end;


Neste exemplo, usamos uma interface que declara o mtodo ExecuteCalc, que ser implementado
por vrias classes, cada qual a sua necessidade.

t ype

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 13
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

13 Introduo ao Mundo Orientado a Objetos
I Cal cul at or = i nt er f ace
f unct i on Execut eCal c( a, b: Doubl e) : Doubl e;
end;

TSum= cl ass( TI nt er f acedObj ect , I Cal cul at or )
publ i c
f unct i on Execut eCal c( a, b: Doubl e) : Doubl e;
end;

TDi vi de = cl ass( TI nt er f acedObj ect , I Cal cul at or )
publ i c
f unct i on Execut eCal c( a, b: Doubl e) : Doubl e;
end;

TMul t i pl y = cl ass( TI nt er f acedObj ect , I Cal cul at or )
publ i c
f unct i on Execut eCal c( a, b: Doubl e) : Doubl e;
end;

TSubt r act i on = cl ass( TI nt er f acedObj ect , I Cal cul at or )
publ i c
f unct i on Execut eCal c( a, b: Doubl e) : Doubl e;
end;

i mpl ement at i on

uses
SysUt i l s;

f unct i on TSum. Execut eCal c( a, b: Doubl e) : Doubl e;
begi n
r esul t : = a +b ;
end;

f unct i on TDi vi de. Execut eCal c( a, b: Doubl e) : Doubl e;
begi n
i f b = 0 t hen
begi n
r esul t : = 0;
r ai se Except i on. Cr eat e( ' Di vi so por Zer o ! ! ! ! ' ) ;
end
el se
r esul t : = a / b;
end;

f unct i on TMul t i pl y. Execut eCal c( a, b: Doubl e) : Doubl e;
begi n
r esul t : = a * b;
end;

f unct i on TSubt r act i on. Execut eCal c( a, b: Doubl e) : Doubl e;
begi n
r esul t : = a - b;
end;

Cliente:

var
a, b, r Sum, r Mul t : Doubl e;
Cal cSum, Cal cMul t : I Cal cul at or ;
begi n
a : = 10;
b : = 20;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 14
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

14 Introduo ao Mundo Orientado a Objetos
Cal cSum: = TSum. Cr eat e;
r Sum : = Cal cSum. Execut eCal c( a, b) ; / / r esul t ado da soma
r Mul t : = Cal cMul t . Execut eCal c( a, b) ; / / r esul t ado da mul t i pl i cacao
end;


Costumo usar este exemplo com meus alunos, onde eu digo: ...Eu quero um carro. Com esta
afirmativa eu coloquei uma necessidade num contexto geral, no me preocupando com os detalhes
envolvidos no que eu pedia. Isto uma interface, ou seja, um veculo pra ser entendido como
carro precisa de requisitos mnimos, como pneus, motor, volante e como diz minha me: carro
pro seu pai basta ter a ignio !. A afirmativa no detalhou qual carro se deseja, isso quer dizer
que qualquer objeto concreto (TMercedez) que tenha as caracterstica de um carro (ICarro)
solucionaria nossa questo.


t ype
I Car r o = i nt er f ace
pr ocedur e Set Model o( const Val ue: st r i ng) ;
f unct i on Get Model o: st r i ng;
pr ocedur e Li gar ;
pr oper t y Model o: st r i ng r ead Get Model o wr i t e Set Model o;
end;

TMer cedez = cl ass( TI nt er f acedObj ect , I Car r o)
pr i vat e
FModel o: st r i ng;
publ i c
pr ocedur e Set Model o( const Val ue: st r i ng) ;
f unct i on Get Model o: st r i ng;
const r uct or Cr eat e;
publ i shed
pr ocedur e Li gar ;
pr oper t y Model o: st r i ng r ead Get Model o wr i t e Set Model o;
end;

i mpl ement at i on
uses Di al ogs;

const r uct or TMer cedez. Cr eat e;
begi n
i nher i t ed;
FModel o : = ' Mer cedez' ;
end;

f unct i on TMer cedez. Get Model o: st r i ng;
begi n
r esul t : = FModel o;
end;

pr ocedur e TMer cedez. Li gar ;
begi n
ShowMessage( ' Mot or l i gado! ' ) ;
end;

pr ocedur e TMer cedez. Set Model o( const Val ue: st r i ng) ;
begi n
FModel o : = Val ue;
end;




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 15
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

15
Interfaces so componentes indispensveis a uma boa abstrao e reduo de acoplamento.
Interfaces no Delphi obedecem a uma hierarquia que tem como base a interface Iinterface. Toda
interface escrita em Delphi herda direta ou indiretamente de IInterface, portanto, para uma interface
que ter um papel de automao (COM Component Object Model) dever ter IUnknown como
interface base. Esta diviso hierrquica atende apenas para fins de organizao, visto que Iunknown
explicitamente equivalente a IInterface

I Unknown = I I nt er f ace;

Interfaces possuem um mecanismo de contagem de referncia, o que permite o autogerenciamento
no que diz respeito aos recursos de memria. Isto elimina a necessidade de liberaes explicitas de
objetos atravs de Free, Destroy ou FreeAndNil.

{codigo IInterface e mtodos}

Interfaces so similares a classes abstratas, que possuem mtodos abstratos no implementados.
Uma interface no implementa mtodo algum, ela apenas os declara, os publica, deixando a cargo
das classes concretas que os implementam.

Implements

Use a diretiva implements para delegar property da classe a implementao dos mtodos de uma
interface.

t ype
I I nt er f aceA = i nt er f ace
pr ocedur e Sampl e;
end;
TMyCl ass = cl ass( TI nt er f acedObj ect , I I nt er f aceA)
FMyI nt er f ace: I I nt er f aceA;
pr oper t y MyI nt er f ace: I I nt er f aceA r ead FMyI nt er f ace i mpl ement s I I nt er f aceA;
end;
TConcr et e = cl ass( TI nt er f acedObj ect , I I nt er f aceA)
publ i c
pr ocedur e Sampl e;
end;


pr ocedur e TFor m1. But t on1Cl i ck( Sender : TObj ect ) ;
var
MyCl ass: TMyCl ass;
I nt er f aceA: I I nt er f aceA;
begi n
MyCl ass : = TMyCl ass. Cr eat e;
MyCl ass. FMyI nt er f ace : = TConcr et e. Cr eat e;
I nt er f aceA : = MyCl ass;
I nt er f aceA. Sampl e;
end;


Polimorfismo

Polimorfismo o principal recurso que justifica o uso de herana no seu cdigo. Polimorfismo
vrias formas uma tcnica que permite o aumento da abstrao na chamada a mtodos de um

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 16
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

16
objeto. Atravs de uma cadeia de heranas, mtodos so herdados da classe progenitora,
ocasionando que todas as classes possuam o mesmo mtodo, mas possuam efeitos diferenciados.


TAni mal
pr ocedur e Wal k;
end;

THuman = cl ass( TAni mal ) / / her dar o mt odo Wal k
end;

TDog = cl ass( TAni mal ) / / her dar o mt odo Wal k
end;


O polimorfismo caracterizado no cdigo quando usamos as diretivas virtual ou dynamic e
override nos membros da classe. Isto indica que o mtodo sinalizado como virtual ou
dynamic um membro que pertence a uma cadeia polimrfica, ou seja, as classes que herdarem
mtodos com estas diretivas podem adicionar novas funcionalidades a eles.


TAni mal
pr ocedur e Wal k; vi r t ual ;
end;

THuman = cl ass( TAni mal )
pr ocedur e Wal k; over r i de;
end;

TDog = cl ass( TAni mal )
pr ocedur e Wal k; over r i de;
end;


Uma vez criada esta cadeia polimrfica para o mtodo Walk ganhamos uma maior flexibilidade
ao codificar nossas rotinas, uma vez que podemos abstrair o verdadeiro mtodo a ser invocado.

pr ocedur e DoWal k( Ani mal : Tani mal ) ;
begi n
Ani mal . Wal k;
end;

/ /

begi n
DoWal k( Tdog. Cr eat e) ;
end;

Com isto, em tempo de execuo, o Delphi ir decidir qual mtodo ir invocar, este recurso
chamado de ligao tardia ou late binding, pois em tempo de desenvolvimento no possvel se
determinar qual instncia ser passada no mtodo DoWalk pode ser qualquer classe que pertena
a hierarquia de Tanimal;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 17
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

17
OverrideeMethodHides

A diretiva Override indica um mtodo que sobreposto na classe onde ele declarado. Seu uso
freqente na programao orientada a objetos e tem um papel agregador, ou seja, adiciona
funcionalidades a um mtodo herdado, uma vez que este tenha sido declarado como virtual ou
dynamic. A declarao de um mtodo sobreposto deve seguir fielmente a declarao do mtodo na
classe ancestral, fidelidade de nome e lista de parmetros. No entanto, h ocasies em que
redeclaramos o mtodo e no o sobrepomos. Isto ocasiona um fato curioso ao compilar a aplicao:

[Warning] Unit2.pas(12): Method 'MethodName' hides virtual method of base type 'TMyClass'

Este warning do compilador indica que o mtodo virtual MethodName declarado na classe
ancestral TMyClass foi ocultado.

Isto a indicao que houve uma quebra da cadeia polimrfica para o mthod MethodName, ou
seja, o mtodo no poder ser invocado com efeito polimrfico, o mtodo no estar relacionado
na VMT.

Dica: Na sobreposio de metodos virtuais, na classe corrente, posicionado em uma linha em
branco, invoque o code completion ctrl+space e todos os mtodos passveis de sobreposio sero
exibidos. Lembre-se a linha dever estar totalmente em branco para que funcione o atalho.

TMyCl ass = cl ass
/ / i nvoque o code compl et i on aqui !
end;

PolimorfismoTcito.PensandoemCadeiaPolimrfica

A cadeia polimrfica estabelecida quando um mtodo no esttico sobreposto seqentemente ou
no, nas diversas classes pertencentes a uma hierarquia.

t ype
TFi r st Cl ass = cl ass
pr ocedur e Sampl e; vi r t ual ;
end;
TSecondCl ass = cl ass( TFi r st Cl ass)
pr ocedur e Sampl e; over r i de;
end;
TThi r dCl ass = cl ass( TSecondCl ass)
pr ocedur e Sampl e; over r i de;
end;
TFour t hCl ass = cl ass( TThi r dCl ass)
pr ocedur e Sampl e; over r i de;
end;


i mpl ement at i on
uses Di al ogs;

pr ocedur e TSecondCl ass. Sampl e;
begi n
ShowMessage( ' Second! ' ) ;
end;
pr ocedur e TThi r dCl ass. Sampl e;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 18
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

18
ShowMessage( ' Thi r d! ' ) ;
end;
pr ocedur e TFour t hCl ass. Sampl e;
begi n
ShowMessage( ' Four t h! ' ) ;
end;
pr ocedur e TFi r st Cl ass. Sampl e;
begi n
ShowMessage( ' Fi r st ! ' ) ;
end;

A palavra reservada inherited pode ser usada em qualquer situao onde seja necessrio
identificar que o mtodo a ser invocado no o da classe atual, mas sim, o da classe ancestral. Mas
neste exemplo no foi utilizado para no confundir nosso foco central.

No cdigo seguinte, feita uma quebra intencional na classe TFourthClass:

t ype
TFi r st Cl ass = cl ass
pr ocedur e Sampl e; vi r t ual ;
end;
TSecondCl ass = cl ass( TFi r st Cl ass)
pr ocedur e Sampl e; over r i de;
end;
TThi r dCl ass = cl ass( TSecondCl ass)
pr ocedur e Sampl e; over r i de;
end;
TFour t hCl ass = cl ass( TThi r dCl ass)
procedure Sample;virtual;
end;

O mtodo sample na classe TfourthClass estabeleceu um novo teto polimorfico. E a chamada
teria um efeito inusitado:

var
Fi r st Cl ass: TFi r st Cl ass;
begi n
Fi r st Cl ass : = TFour t hCl ass. Cr eat e;
Fi r st Cl ass. Sampl e;
end;

Resul t ado: Thi r d!

O que aconteceu que o mtodo sample da classe TfirstClass no pertence mais a cadeia, pois foi
declarado como virtual e quebrou a seqncia hierrquica. Isto fez com que em tempo de execuo
fosse escolhido para execuo o mtodo da classe hierarquicamente acima. Se sample fosse
override o mtodo de TfourthClass seria executado.

VirtualouDynamic,eisaquesto!

As diretivas Virtual e Dynamic so usadas para permitir que o mtodo sinalizado possa ser
sobreposto. Um mtodo no esttico (virtual ou dymaic) pode ser reescrito atravs da diretiva
override.

Ento se ambos permitem a sobreposio, ento qual a real diferena entre eles?


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 19
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

19 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.
Na verdade, mtodos virtuais ou dinmicos atendem ao mesmo problema, a da sobreposio
polimrfica, sendo que a diretiva virtual indicada a mtodos que sofrem override com
frequncia, pois cria uma entrada na VMT Virtual Method Table, a qual relaciona os endereos de
todos os mtodos virtuais de um objeto. Esta abordagem mais eficiente visto que o
endereamento da VMT criado em tempo de execuo.

Ao criar novas especializaes de uma classe, ela ter sua prpria VMT, relacionando todos os
mtodos virtuais herdados e todos os que forem declarados na nova classe.

Use a diretiva dynamic para mtodos que no so sobrepostos com frequncia, pois os mesmos
so adicionados a Dynamic Method Table, que criada sob demanda.

SobrecargadeMtodos

Uma das regras na declarao de classes que no podem haver dois ou mais mtodos com o
mesmo nome, ainda que com parmetros diferentes.

t ype
TSampl e = cl ass
pr ocedur e Cal c( Val ue: i nt eger ) ;
f unct i on Cal c( a, b: i nt eger ) : i nt eger ; / / er r o aqui ! !
end;

i mpl ement at i on
uses Di al ogs, SysUt i l s;

pr ocedur e TSampl e. Cal c( Val ue: i nt eger ) ;
begi n
ShowMessage( I nt ToSt r ( Val ue) ) ;
end;

f unct i on TSampl e. Cal c( a, b: i nt eger ) : i nt eger ;
begi n
r esul t : = a + b;
end;

Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.

t ype
TSampl e = cl ass
pr ocedur e Cal c( Val ue: i nt eger ) ; over l oad;
f unct i on Cal c( a, b: i nt eger ) : i nt eger ; over l oad;
end;

Ao utlizar a classe Tsample, os dois mtodos estaro disponveis no code completion.

var
Sampl e: TSampl e;
r et ur n: i nt eger ;
begi n
Sampl e : = TSampl e. Cr eat e;
r et ur n : = Sampl e. Cal c( 1, 2) ;
Sampl e. Cal c( r et ur n) ;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 20
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

20 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.
O compilador usar os critrios de nmero de parmetros, tipo dos parmetros para determinar qual
mtodo dever ser invocado. No caso acima, o fator que determinou o mtodo a ser usado em cada
situao foi o nmero de parmetros, uma vez que ambos requerem parmetros de tipos inteiros. O
overload tambm pode ser usado em casos de mtodos herdados, para evitar seu ocultamento.

TSampl e = cl ass
pr ocedur e Cal c( Val ue: i nt eger ) ; over l oad;
f unct i on Cal c( a, b: i nt eger ) : i nt eger ; over l oad;
pr ocedur e Test ;
end;

TSampl e1 = cl ass( TSampl e)
pr ocedur e Test ( s: st r i ng) ; over l oad;
end;

Com isto, para a classe Tsample1 agora tempos disponvel o mtodo Test herdado da classe
ancestral e Test(s: string), novo mtodo sobrecarregado em Tsample1.

Na situao a seguir, declarado dois mtodos sobrecarregados, ambos requerem parmetros
inteiros, porm de tipos diferentes:

TCal cul at or = cl ass
pr ocedur e Cal c( si : Shor t I nt ) ; over l oad;
pr ocedur e Cal c( si : Smal l I nt ) ; over l oad;
end;

At aqui nenhum problema que possa nos impedir compilar, mas o que faria o compilador caso eu
invoque Calc com o seguinte parmetro:

var
Cal cul at or : TCal cul at or ;
begi n
Cal cul at or : = TCal cul at or . Cr eat e;
Calculator.Calc(29);
end;

O compilador ir avaliar o tamanho (range) suportado por cada tipo em ambos parmetros.

Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit

Como o valor passado no parmetro potencialmente poderia ser suportado por ambos os tipos, ser
escolhido aquele cujo tipo do parmetro possui o menor intervalo.


MtodosAbstratos

Mtodos declarados como abstratos usam a diretiva abstract. Este tipo de mtodo no possui
implementao na classe onde foi declarado, deixando isto a cargo das classes descendentes. O uso
da diretiva abstract sempre vir acompanhada de um virtual ou dynamic, para permitir
sobrescrever o mtodo. Classes que especializam classes com mtodos abstratos no so obrigadas
a implement-los.

pr ocedur e Sampl e; vi r t ual ; abst r act ;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 21
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

21 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.
As classes descendentes podem sobrepor override o mtodo abstrato e implement-lo. Ao
invocar um mtodo abstrato que no tenha sido sobreposto a seguinte exceo ser erguida:

| Abst r act er r or |

Mtodos abstratos so usados em situaes onde importante que todas as classes de uma cadeia
hierrquica tenha um determinado mtodo, como por exemplo um conjunto de classes que modelam
o mundo animal, teramos a classe TMamifero com o mtodo abstrato Walk, cuja implementao
estaria a cargo das classes descendentes.

TypeCasts

Type Cast um mecanismo do Delphi Language que permite a converso pontual de um
determinado tipo. Em conjunto com polimorfismo, type casts tornam-se indispensveis na
codificao de rotinas genricas.

Type Casts so classificados em dois tipos: Value Type Casts e Variable Type Casts.

Observe neste exemplo a aplicao de um Variable Type Cast:

TAni mal = cl ass
Age: byt e;
end;

TDog = cl ass( TAni mal )
Pedi gr ee: st r i ng;
end;

TCat = cl ass( TAni mal )
Name: st r i ng;
end;


var
Ani mal : TAni mal ;
begi n
Ani mal : = TCat . Cr eat e;
TCat ( Ani mal ) . Name : = ' Li ssi ' ; / / t ype cast
end;


Observe que foi feita a converso de uma varivel do tipo Tanimal para o tipo Tcat. Isso s foi
possivel porque Tanimal ancestral comum a classe TCAt, em outras palavras, elas pertencem a
mesma cadeia hierrquica.


Value Type Casts so mais incomuns, no aparecem com tanta freqncia. Veja este exemplo:

var
asci i : i nt eger ;
begi n
asci i : = I nt eger ( ' Z' ) ;

A varivel ascii receber o valor da tabela ASCII correspondente a letra Z. Neste outro exemplo


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 22
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

22 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.

var
obj : TObj ect ;
P: I nt eger ;
begi n
Obj : = TObj ect . Cr eat e( ni l ) ;
P : = I nt eger ( Obj ) ; / / pega o ender eo de Obj
ShowMessage( TObj ect ( P) . Cl assName) ;
end;

Encapsulamento

Todo objeto dever ser responsvel por seus prprios comportamentos, com isto garantir a
integridade daquilo que o faz funcionar de maneira regular. Encapsulamento uma tcnica OO
para ocultar determinados membros de um objeto. Conhecido como Data Hidding o
encapsulamento utilizado como mecanismo regulador de acesso aos dados de um objetos. O
encapsulamento torna as mudanas no comportamento interno de um objeto transparentes para
outros objetos e auxilia na preveno de problemas de efeitos colaterais no cdigo. Pegue o que
varia no seu cdigo e encapsule!

No necessrio se preocupar em saber como uma tarefa realizada, portanto que seja feita!

Quando usamos o mtodo Ligar do objetos carro uma srie de outros mtodos sero invocados
internamente no objeto. Estes detalhes do funcionamento no

No Delphi existem clusulas que so utilizadas para demarcar regies de uma classe, que
determinam qual o grau de visibilidade de cada membro dentro destas regies, so elas Public,
Protected, Private, Published, Strict Private, Strict Protected.

Pblico
A propriedade ou mtodo da classe pode ser acessado por todas as demais entidades do sistema.

Privado
O acesso aos membros da classe s permitido aos mtodos da prpria classe.

Protegido
O acesso aos membros da classe s permitido a classes da mesma hierarquia.

Published
Regras de visibilidade idnticas ao public, sendo que alm disso; aparece no object inspector (no
caso de componentes do delphi ).


Um dos questionamentos que caberiam seria: O que encapsular? Quando encapsular? Pra que
encapsular? Evidentemente todas estas perguntas precisam e devem ser respondidas e esclarecidas.

A linguagem Delphi fornece um recurso muito utilizado quando trabalhamos com encapsulamento,
as Propertys, assim com os campos de uma classe, as propriedades criam um mecanismo de
leitura e escrita para um campo privado classe. Muito mais eficiente que a declarao simples de
um campo, propriedades permitem uma forma concreta de controle do que pode ser escrito e lido de
um determinado campo. Quem nunca teve um erro em sua frente Invalid property value quando

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 23
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

23 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.
entrou com um valor incompatvel a uma propriedade ainda que acidentalmente atravs do object
inspector.

Propriedades so declaradas geralmente nas sees public ou published de uma classe e obedece a
seguinte semntica:

pr oper t y NoDaPr opr i edade: Ti po r ead FNoDaPr opr i edade wr i t e FnoDaPr opr i edade;

GeteSets

Uma vez que as propriedades promovem uma forma de encapsulamento e controle de leitura e
escrita, podemos substituir a leitura e escrita direto do campo por mtodos Get e Set.

Pr oper t y Nome: st r i ng r ead Get Nome wr i t e Set Nome;

Os mtodos GetNome e SetNome sero usados pela property para as tarefas de leitura e escrita na
varivel encapsulada. Isto nos permite criar um estgio de verificao preliminar a escrita ou leitura
do campo.

OOperadorIndex

Os mtodos Get e Set so instrumentos eficientes no controle da leitura e escrita por parte de uma
propriedade, mas pode ser tornar um elemento perturbador no que diz respeito a legibilidade de uma
classe, por isso, possvel compartilhar um nico par de mtodos Get e Set entre diversas
propriedades indexadas. Para declarar esta funcionalidade adicione a diretiva index seguido de
um inteiro entre -2147483647 e 2147483647 em todas as propriedades que iro usar os mtodos
compartilhados:

t ype
TAl uno = cl ass
pr i vat e
FNome: st r i ng;
FEmai l : st r i ng;
FTel ef one: st r i ng;
f unct i on Get Dat a( const I ndex: I nt eger ) : st r i ng;
pr ocedur e Set Dat a( const I ndex: I nt eger ; const Val ue: st r i ng) ;
publ i c
pr oper t y Nome: st r i ng i ndex 0 r ead Get Dat a wr i t e Set Dat a;
pr oper t y Emai l : st r i ng i ndex 1 r ead Get Dat a wr i t e Set Dat a;
pr oper t y Tel ef one: st r i ng i ndex 2 r ead Get Dat a wr i t e Set Dat a;
end;

i mpl ement at i on

f unct i on TAl uno. Get Dat a( const I ndex: I nt eger ) : st r i ng;
begi n
case I ndex of
0: r esul t : = FNome;
1: r esul t : = FEmai l ;
2: r esul t : = FTel ef one;
end;
end;

pr ocedur e TAl uno. Set Dat a( const I ndex: I nt eger ; const Val ue: st r i ng) ;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 24
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

24 Para permitir essa flexibilidade, utilizada a diretiva overload nos mtodos envolvidos.
case I ndex of
0: FNome : = Val ue;
1: FEmai l : = Val ue;
2: FTel ef one : = Val ue;
end;
end;

Dica: Na declarao de propriedades, digite a penas at o tipo, encerrando em seguida com ponto e
virgula. Logo aps pressione ctrl+shift+c e o restante da estrutura da propriedade ser criada
automaticamente.

PropriedadesIndexadas

Propriedades podem ser declaradas de forma a permitir a leitura seqencial de uma estrutura ordinal
como um array. A declarao bem simples, basta informa a lista de parmetros ao lado do nome
da propriedade:

i nt er f ace
uses Cl asses;

t ype
TCl i ent e = cl ass
pr i vat e
FTel sLi st : TSt r i ngLi st ;
f unct i on Get Tel ef ones( I ndex: i nt eger ) : st r i ng;
pr ocedur e Set Tel ef ones( I ndex: i nt eger ; const Val ue: st r i ng) ;
publ i c
const r uct or Cr eat e;
dest r uct or Dest r oy; over r i de;
pr oper t y Tel ef ones[ I ndex: i nt eger ] : st r i ng r ead Get Tel ef ones wr i t e
Set Tel ef ones;
end;

i mpl ement at i on

uses SysUt i l s;

const r uct or TCl i ent e. Cr eat e;
begi n
i nher i t ed;
FTel sLi st : = TSt r i ngLi st . Cr eat e;
end;

dest r uct or TCl i ent e. Dest r oy;
begi n
Fr eeAndNi l ( FTel sLi st ) ;
i nher i t ed;
end;

f unct i on TCl i ent e. Get Tel ef ones( I ndex: i nt eger ) : st r i ng;
begi n
r esul t : = FTel sLi st . St r i ngs[ I ndex] ;
end;

pr ocedur e TCl i ent e. Set Tel ef ones( I ndex: i nt eger ; const Val ue: st r i ng) ;
begi n
FTel sLi st . St r i ngs[ I ndex] : = Val ue;
end;



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 25
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

25
Para Ter acesso a leitura e escrita na propriedade Telefones informe o indice desejado:

var
Cl i ent e: TCl i ent e;
begi n
Cl i ent e : = TCl i ent e. Cr eat e;
Cl i ent e. Tel ef ones[ 0] : = ' 21 2223- 1234' ;
end;

Default,NoDefaulteStored

Default, nodefault e stored so diretivas que determinam se os dados de uma propriedade publicada
podem ou no serem gravados no .dfm de um formulrio.

O especificador default tem efeito diferente dependendo do tipo de propriedade onde foi
declarado. Quando usamos propriedades indexadas, possvel usar o especificador default, de
forma que seja possvel suprimir a identificao de uma propriedade no ato da sua utilizao:

pr oper t y Tel ef ones[ I ndex: i nt eger ] : st r i ng r ead Get Tel ef ones wr i t e Set Tel ef ones;
def aul t ;

var
Cl i ent e: TCl i ent e;
begi n
Cl i ent e : = TCl i ent e. Cr eat e;
Cl i ent e[ 0] : = ' 21 2223- 1234' ;

Em outra situao, o default pode ser usado para determinar um valor inicial para uma
propriedade, quando seguido de sua declarao for declarado um valor compatvel ao tipo da
propriedade:

pr oper t y I dade: i nt eger r ead FI dade wr i t e Set I dade def aul t 10;

Alguns detalhes precisam ser observados quanto ao uso do default nesta situao: possvel
utiliz-lo somente em propriedade cujo tipo ordinal.

Use o especificador NoDefault somente em casos de sobreposio (override) de propriedades, que
ser visto em seguida.

O especificador stored determina se o valor da propriedade ser efetivamente gravado (persistido)
no .dfm do formulrio.

pr oper t y Nome: st r i ng r ead FNome wr i t e Set Nome st or ed f al se;

EncapsulamentoeClassesAmigas

Classes ditas como amigas so classes que so declaradas na mesma unidade (unit). a
caracterstica do compilador digamos que no documentada. Esta caracterstica da linguagem
permite que membros privados e protegidos de uma classe possa ser lido por outras classes na
mesma unit.



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 26
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

26 Design Patterns
Design Patterns

Assim como na Engenharia Civil, h normas muito bem elaboradas e definidas de que forma que
toda construo obrigatoriamente siga as determinaes destas normas. No mundo da informtica,
mais precisamente na orientao a objetos no diferente. Design Patterns, ou simplesmente
Padres de Projeto incentiva o reuso de elementos recorrentes na programao, ou seja, por que
reinventar a roda? Algum j resolveu os seus problemas!

O foco de nossa discusso o empirismo, ou seja, a questo em torno dos design patterns o
catlogo do conhecimento de forma que outros o possam utilizar sem ter que passar pelos percalos
enfrentados por outros, para alcanar a soluo.

ComoeQuandotudoComeou

Tudo comeou por meio de um Austraco chamado Christopher Alexander, professor na
Universidade da Califria em Berkeley. Dentre suas inmeras obras criou o conceito de linguagem
em padres. Sua rea a Engenharia Civil, onde ele percebeu que na construo de edifcios, havia
caractersticas recorrentes, onde resolver catalogar em seu livro The Timeless Way of Building.





The Timeless Way of
Building.



Segundo Christopher Alexander, "Cada Pattern descreve um problema o qual ocorre repetidamente
em nosso ambiente, e ento descreve um conjunto de solues para este problema, de maneira que
voc possa usar esta soluo um milho de vezes, sem o fazer da mesma maneira duas vezes."



Christopher Alexander

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 27
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

27 Design Patterns
AGangueDosQuatro(GoF)

Durante anos, os especialistas na rea de engenharia de software tentaram adequar as idias de
Alexander para a construo de sistemas de informao. Finalmente, em 1994, liderados por Erich
Gamma a GoF (Gang of Four) - Erich Gamma, Richard Helm, Ralph J ohnson e J ohn Vlissides
publicaram o livro que deu origem onda dos Patterns na rea de informtica, Design Patterns:
Elements of Reusable Object-Oriented Software. O primeiro catlogo bem descrito sobre patterns
de projeto para programas orientados a objeto. Aps isto, seguiram outros livros de outros autores,
publicaes, papers, conferncias, entre outros.



Mas lembre-se, Design patterns so classificados com base nos problemas os quais eles solucionam,
no pela forma como so declarados.


PadresCriacionais

Padres criacionais abstraem o processo de instanciao. Ajudam a criar um sistema independente
de como o objeto criado, composto e representado.


FactoryMethod

Define uma interface para criao de um objeto, mas deixa as subclasses decidirem qual classe
instanciar. Factory Method deixa as classes adiarem a instanciao para as subclasses [GoF].

Este tipo de pattern elimina instanciaes concretas no cdigo, reduzindo problemas com
manutenes no cdigo.

Diagrama Estrutural


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 28
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

28 Design Patterns



Classes participantes e suas responsabilidades


Classe Papel
Product Define a interface de objetos que o factory method cria.

ConcreteProduct Implementa a interface de Product.

Creator Declara o factory method, o qual retorna um objeto do tipo
Product. O Creator pode tambm definir uma
implementao padro do factory method que retorne um
objeto ConcreteProduct.

ConcreteCreator Sobreescreve o factory method para retornar uma instncia
de ConcreteProduct.



Implementao


t ype
I Car r o = i nt er f ace
pr ocedur e Li gar ;
end;

Ci vi c = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Cor ol l a = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Vect r a = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Car r oFact or y = cl ass
publ i c
f unct i on Get Car r o( Model o: st r i ng) : I Car r o;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 29
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

29 Design Patterns
i mpl ement at i on

f unct i on Car r oFact or y. Get Car r o( Model o: st r i ng) : I Car r o;
begi n
i f Model o = ' Ci vi c' t hen
r esul t : = Ci vi c. Cr eat e
el se i f Model o = ' Cor ol l a' t hen
r esul t : = Cor ol l a. Cr eat e
el se i f Model o = ' Vect r a' t hen
r esul t : = Vect r a. Cr eat e;
end;


pr ocedur e Vect r a. Li gar ;
begi n
ShowMessage( ' Vect r a l i gado ! ' ) ;
end;

pr ocedur e Ci vi c. Li gar ;
begi n
ShowMessage( ' Ci vi c l i gado ! ' ) ;
end;

pr ocedur e Cor ol l a. Li gar ;
begi n
ShowMessage( ' Cor ol l a l i gado ! ' ) ;
end;


Usando nossa Fbrica:

var
Car r o: I Car r o;
begi n
Car r o : = Car r oFact or y. Cr eat e. Get Car r o( Ci vi c ) ;
Car r o. Li gar ;
end;



AbstractFactory

Fornece uma interface para criao de famlias de objetos relacionados ou dependentes sem
especificar suas classes concretas [GoF].

Este pattern pode em certo ponto se parecer com o Factory. O Abstract Factory acrescenta uma
maior abstrao, estabelecendo classes Fabrica Abstratas que criam uma independncia das
classes concretas.


Diagrama Estrutural


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 30
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

30 Design Patterns



Classes participantes e suas responsabilidades


Classe Papel
AbstractFactory

Declara uma interface para mtodos que criam objetos
abstratos de produtos.

ConcreteFactory

Implementa mtodos que criam objetos concretos de
produtos.

AbstractProduct

Declara uma interface para um tipo de objeto produto.

Product

Define um objeto produto para ser criado pela fbrica
concreta correspondente. Implementa a interface de
AbstractProduct.




Implementao

t ype
I Car r o = i nt er f ace
pr ocedur e Li gar ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 31
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

31 Design Patterns
end;

Ci vi c = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Cor ol l a = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Vect r a = cl ass( TI nt er f acedObj ect , I Car r o)
pr ocedur e Li gar ;
end;

Car r oFact or y = cl ass
publ i c
f unct i on Get Car r o( Model o: st r i ng) : I Car r o;
end;

I Fabr i cant eFact or y = i nt er f ace
f unct i on Car r o: I Car r o;
end;

HondaFact or y = cl ass( TI nt er f acedObj ect , I Fabr i cant eFact or y)
f unct i on Car r o: I Car r o;
end;

Chevr ol et = cl ass( TI nt er f acedObj ect , I Fabr i cant eFact or y)
f unct i on Car r o: I Car r o;
end;

Toyot aFact or y = cl ass( TI nt er f acedObj ect , I Fabr i cant eFact or y)
f unct i on Car r o: I Car r o;
end;



i mpl ement at i on
uses Di al ogs;


f unct i on Car r oFact or y. Get Car r o( Model o: st r i ng) : I Car r o;
begi n
i f Model o = ' Ci vi c' t hen
r esul t : = Ci vi c. Cr eat e
el se i f Model o = ' Cor ol l a' t hen
r esul t : = Cor ol l a. Cr eat e
el se i f Model o = ' Vect r a' t hen
r esul t : = Vect r a. Cr eat e;
end;

f unct i on HondaFact or y. Car r o: I Car r o;
begi n
r esul t : = Ci vi c. Cr eat e;
end;

f unct i on Chevr ol et . Car r o: I Car r o;
begi n
r esul t : = Vect r a. Cr eat e;
end;

f unct i on Toyot aFact or y. Car r o: I Car r o;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 32
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

32 Design Patterns
r esul t : = Cor ol l a. Cr eat e;
end;

pr ocedur e Ci vi c. Li gar ;
begi n
ShowMessage( ' Ci vi c l i gado ! ' ) ;
end;

pr ocedur e Cor ol l a. Li gar ;
begi n
ShowMessage( ' Cor ol l a l i gado ! ' ) ;
end;

pr ocedur e Vect r a. Li gar ;
begi n
ShowMessage( ' Vect r a l i gado ! ' ) ;
end;


var
Fabr i cant e: I Fabr i cant eFact or y;
Car r o: I Car r o;
begi n
Fabr i cant e : = HondaFact or y. Cr eat e;
Car r o : = Fabr i cant e. Car r o;
Car r o. Li gar ;
end;




Builder

Separa a construo de um objeto complexo da sua representao de modo que o mesmo processo
de construo possa criar diferentes representaes [GoF].


Diagrama Estrutural





Classes participantes e suas responsabilidades


Classe Papel

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 33
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

33 Design Patterns
Builder

Especifica uma interface abstrata para criao de partes de um
objeto Product.
ConcreteBuilder

Constri e monta partes do produto atravs da implementao da
interface Builder.

Director

Constri um objeto usando a interface Builder.

Product

Representa um objeto complexo. ConcreteBuilder constroi o
produto internamente e determina o processo pelo qual ser
montado.



Implementao


t ype

Car r o = cl ass / / PRODUCT
Cor : st r i ng;
Mar ca: st r i ng;
Combust i vel : st r i ng;
end;

I Const r ut or = i nt er f ace / / BUI LDER
pr ocedur e I ni ci al i zar ;
pr ocedur e Cr i ar Cor ;
pr ocedur e Cr i ar Combust i vel ;
pr ocedur e Cr i ar Mar ca;
f unct i on Vei cul o: Car r o;
end;

Fabr i ca = cl ass / / DI RECTOR
pr ocedur e Const r ui r ( C: I Const r ut or ) ;
end;

Ci vi c = cl ass( TI nt er f acedObj ect , I Const r ut or )
pr i vat e
C: Car r o;
publ i c
pr ocedur e I ni ci al i zar ;
pr ocedur e Cr i ar Cor ;
pr ocedur e Cr i ar Combust i vel ;
pr ocedur e Cr i ar Mar ca;
f unct i on Vei cul o: Car r o;
end;

Cor ol l a = cl ass( TI nt er f acedObj ect , I Const r ut or )
pr i vat e
C: Car r o;
publ i c
pr ocedur e I ni ci al i zar ;
pr ocedur e Cr i ar Cor ;
pr ocedur e Cr i ar Combust i vel ;
pr ocedur e Cr i ar Mar ca;
f unct i on Vei cul o: Car r o;
end;

i mpl ement at i on


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 34
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

34 Design Patterns
pr ocedur e Ci vi c. Cr i ar Cor ;
begi n
C. Cor : = ' Pr et o' ;
end;

pr ocedur e Ci vi c. Cr i ar Mar ca;
begi n
C. Mar ca : = ' Honda Ci vi c' ;
end;

pr ocedur e Ci vi c. Cr i ar Combust i vel ;
begi n
C. Combust i vel : = ' Gasol i na' ;
end;

pr ocedur e Ci vi c. I ni ci al i zar ;
begi n
C : = Car r o. Cr eat e;
end;

f unct i on Ci vi c. Vei cul o: Car r o;
begi n
r esul t : = C;
end;


pr ocedur e Cor ol l a. Cr i ar Combust i vel ;
begi n
C. Combust i vel : = ' GNV' ;
end;

pr ocedur e Cor ol l a. Cr i ar Cor ;
begi n
C. Cor : = ' Pr at a' ;
end;

pr ocedur e Cor ol l a. Cr i ar Mar ca;
begi n
C. Mar ca : = ' Toyot a Cor ol l a' ;
end;

pr ocedur e Cor ol l a. I ni ci al i zar ;
begi n
C : = Car r o. Cr eat e;
end;

f unct i on Cor ol l a. Vei cul o: Car r o;
begi n
r esul t : = C;
end;

pr ocedur e Fabr i ca. Const r ui r ( C: I Const r ut or ) ;
begi n
C. I ni ci al i zar ;
C. Cr i ar Cor ;
C. Cr i ar Combust i vel ;
C. Cr i ar Mar ca;
end;





___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 35
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

35 Design Patterns
Prototype

Especifica os tipos de objetos a serem criados usando uma instncia prottipo, e cria novos objetos
atravs da cpia deste prottipo. [GoF]





Classes participantes e suas responsabilidades

Classe Papel
Prototype

Declara uma interface para se auto clonar.

ConcretePrototype

Implementa uma operao para a auto clonagem.

Client

Cria um novo objeto.




Implementao


t ype
Car r oCl onavel = cl ass abst r act
f unct i on Cl one: Car r oCl onavel ; vi r t ual ; abst r act ;
end;

{$M+}
Honda = cl ass( Car r oCl onavel )
pr i vat e
FCor : st r i ng;
FMar ca: st r i ng;
pr ocedur e Set Cor ( const Val ue: st r i ng) ;
pr ocedur e Set Mar ca( const Val ue: st r i ng) ;
publ i c
f unct i on Cl one: Car r oCl onavel ;
publ i shed
pr oper t y Cor : st r i ng r ead FCor wr i t e Set Cor ;
pr oper t y Mar ca: st r i ng r ead FMar ca wr i t e Set Mar ca;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 36
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

36 Design Patterns
end;


I mpl ement at i on
uses TypI nf o;

f unct i on Honda. Cl one: Car r oCl onavel ;
var
Pr opLi st : PPr opLi st ;
Pr opCount , i : i nt eger ;
Obj : Honda;
begi n
Obj : = Honda. Cr eat e;
Pr opCount : = Get Pr opLi st ( Sel f , Pr opLi st ) ;
f or i : = 0 t o Pr ed( Pr opCount ) do
Set Pr opVal ue( Obj , Pr opLi st [ i ] . Name, Get Pr opVal ue( Sel f , Pr opLi st [ i ] . Name) ) ;
r esul t : = Obj ;
end;

pr ocedur e Honda. Set Cor ( const Val ue: st r i ng) ;
begi n
FCor : = Val ue;
end;

pr ocedur e Honda. Set Mar ca( const Val ue: st r i ng) ;
begi n
FMar ca : = Val ue;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 37
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

37 Design Patterns
Singleton

Assegura que haja somente uma instncia de uma classe, e fornece um ponto de acesso global para
acess-la [GoF].




Classes participantes e suas responsabilidades

Classe Papel
Singleton

Define um mtodo que permite clientes acessarem somente uma
instncia do objeto.




Implementao


t ype
Chevr ol et = cl ass
st r i ct pr i vat e
const r uct or Cr eat e;
cl ass var
FI nt er nal I nst ance: Chevr ol et ;
pr i vat e
FCor : st r i ng;
pr ocedur e Set Cor ( const Val ue: st r i ng) ;
publ i c
cl ass f unct i on I nst ance: Chevr ol et ;
pr oper t y Cor : st r i ng r ead FCor wr i t e Set Cor ;
end;

i mpl ement at i on

const r uct or Chevr ol et . Cr eat e;
begi n
i nher i t ed;
end;

cl ass f unct i on Chevr ol et . I nst ance: Chevr ol et ;
begi n
i f not Assi gned( FI nt er nal I nst ance) t hen
FI nt er nal I nst ance : = Chevr ol et . Cr eat e;
r esul t : = FI nt er nal I nst ance;
end;

pr ocedur e Chevr ol et . Set Cor ( const Val ue: st r i ng) ;
begi n
FCor : = Val ue;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 38
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

38 Design Patterns
var
Chev1, Chev2: Chevr ol et ;
begi n
Chev1 : = Chevr ol et . I nst ance;
Chev1. Cor : = ' Pr et o' ;

Chev2 : = Chevr ol et . I nst ance;
Chev2. Cor : = ' Ver mel ho' ;

ShowMessage( For mat ( ' Chev1. Cor : %s, Chev2. Cor : %s' , [ Chev1. Cor , Chev2. Cor ] ) ) ;
end;



PadresEstruturais

Padres estruturais definem como as classes e os objetos so compostos para dar forma a estruturas
maiores.
Adapter

Converte a interface de um objeto para outra esperada pelo cliente [GoF].

Diagrama Estrutural




Classes participantes e suas responsabilidades

Classe Papel
Client

Colabora com objetos conforme a interface Target

Target

Define a interface que Client usa.

Adapter

Adapta a interface de Adaptee para a interface Target


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 39
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

39 Design Patterns
Adaptee

Define uma interface existente que precisa ser adaptada.





Implementao

Neste exemplo usamos um adaptador de objeto, ou seja, usamos composio para realizar a
adaptao.

t ype
I BMW= i nt er f ace
pr ocedur e Acel er ar ;
end;

I Fusca = i nt er f ace
pr ocedur e Acel er ar ;
end;

BMW= cl ass ( TI nt er f acedObj ect , I BMW)
pr ocedur e Acel er ar ;
end;

Fusca = cl ass
pr ocedur e Acel er ar ;
end;

FuscaAdapt ado = cl ass( TI nt er f acedObj ect , I Fusca)
pr i vat e
FBMW: BMW;
publ i c
const r uct or Cr eat e( Adapt ado: BMW) ;
pr ocedur e Acel er ar ;
end;


i mpl ement at i on
uses Di al ogs;

pr ocedur e BMW. Acel er ar ;
begi n
ShowMessage( ' Mot or BMWacel er ado ! ' ) ;
end;

pr ocedur e Fusca. Acel er ar ;
begi n
ShowMessage( ' Mot or FUSCA acel er ado ! ' ) ;
end;

pr ocedur e FuscaAdapt ado. Acel er ar ;
begi n
FBMW. Acel er ar ;
end;

const r uct or FuscaAdapt ado. Cr eat e( Adapt ado: BMW) ;
begi n
FBMW: = Adapt ado;
end;

pr ocedur e Acel er ar Fusca( Fusca: I Fusca) ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 40
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

40 Design Patterns
begi n
Fusca. Acel er ar ; / / esper o que est ej a acel er ando umFUSCA ! . . . .
end;

pr ocedur e TFor m4. But t on1Cl i ck( Sender : TObj ect ) ;
var
F: FuscaAdapt ado;
B: BMW;
begi n
B : = BMW. Cr eat e;
F : = FuscaAdapt ado. Cr eat e( B) ;
Acel er ar Fusca( F) ;
end;



Composite

Compe objetos em uma estrutura de rvore para representar hierarquias todo-parte. [GoF].


Muito usando na arquitetura da VCL, como por exemplo, no componente TMenu com seus itens
TMenuItems.

Diagrama Estrutural











Classes participantes e suas responsabilidades

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 41
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

41 Design Patterns

Classe Papel
Component

Declara a interface para objetos em uma composio.
Leaf

Representa objetos folhana composio. Objetos folha no
possuem filhos.

Composite

Define o comportamento para componentes filhos.

Client

Manipula objetos na composio atravs da interface
Component.



Implementao


t ype
I t em= cl ass abst r act
pr ot ect ed
FName: st r i ng;
publ i c
pr ocedur e Add( I t em: I t em) ; vi r t ual ; abst r act ;
pr ocedur e Remove( I t em: I t em) ; vi r t ual ; abst r act ;
f unct i on Get Chi l d( I ndex: i nt eger ) : I t em; vi r t ual ; abst r act ;
const r uct or Cr eat e( Name: st r i ng) ; vi r t ual ; abst r act ;
f unct i on Get Name: st r i ng; / / oper at i on ! !
end;

I t emComposi t e = cl ass( I t em)
pr i vat e
FLi st : TLi st ;
publ i c
const r uct or Cr eat e( Name: st r i ng) ; over r i de;
pr ocedur e Add( I t em: I t em) ; over r i de;
pr ocedur e Remove( I t em: I t em) ; over r i de;
f unct i on Get Chi l d( I ndex: I nt eger ) : I t em; over r i de;
end;

Fol haComposi t e = cl ass( I t em)
pr ocedur e Add( I t em: I t em) ; over r i de;
pr ocedur e Remove( I t em: I t em) ; over r i de;
f unct i on Get Chi l d( I ndex: I nt eger ) : I t em; over r i de;
const r uct or Cr eat e( Name: st r i ng) ; over r i de;
end;

pr ocedur e I t emComposi t e. Add( I t em: I t em) ;
begi n
FLi st . Add( TObj ect ( I t em) ) ;
end;

const r uct or I t emComposi t e. Cr eat e( Name: st r i ng) ;
begi n
FLi st : = TLi st . Cr eat e;
FName : = Name;
end;

f unct i on I t emComposi t e. Get Chi l d( I ndex: I nt eger ) : I t em;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 42
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

42 Design Patterns
r esul t : = FLi st . I t ems[ I ndex] ;
end;

pr ocedur e I t emComposi t e. Remove( I t em: I t em) ;
begi n
FLi st . Remove( TObj ect ( I t em) ) ;
end;

pr ocedur e Fol haComposi t e. Add( I t em: I t em) ;
begi n
r ai se Except i on. Cr eat e( ' Fol ha no pode t er f i l hos ! ' ) ;
end;

const r uct or Fol haComposi t e. Cr eat e( Name: st r i ng) ;
begi n
FName : = Name;
end;

f unct i on I t em. Get Name: st r i ng;
begi n
r esul t : = FName;
end;

f unct i on Fol haComposi t e. Get Chi l d( I ndex: I nt eger ) : I t em;
begi n
r ai se Except i on. Cr eat e( ' Fol ha no pode t er f i l hos ! ' ) ;
end;

pr ocedur e Fol haComposi t e. Remove( I t em: I t em) ;
begi n
r ai se Except i on. Cr eat e( ' Fol ha no pode t er f i l hos ! ' ) ;
end;


var
Rai z: I t emComposi t e;
I t em: I t emComposi t e;
Node: TTr eeNode;
begi n
Rai z : = I t emComposi t e. Cr eat e( ' Rai z 1' ) ;
Rai z. Add( Fol haComposi t e. Cr eat e( ' Fol ha 1. 1' ) ) ;
Rai z. Add( Fol haComposi t e. Cr eat e( ' Fol ha 1. 2' ) ) ;
I t em: = I t emComposi t e. Cr eat e( ' Rai z 2' ) ;
I t em. Add( Fol haComposi t e. Cr eat e( ' Fol ha 2. 1' ) ) ;
I t em. Add( Fol haComposi t e. Cr eat e( ' Fol ha 2. 2' ) ) ;
Rai z. Add( I t em) ;
end;



Faade

Fornece uma interface unificada para um conjunto de interfaces de um subsistema. [GoF].


Diagrama Estrutural



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 43
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

43 Design Patterns



Classes participantes e suas responsabilidades


Classe Papel
Faade

Sabe quais classes do subsistema so responsveis por uma
requisio.

Subsystem

Implementa a funcionalidade do subsistema




Implementao


t ype
Car r o = cl ass;

Car r oFacade = cl ass / / I nt er f ace Faade si mpl i f i cada
pr i vat e
C: Car r o;
publ i c
pr ocedur e Usar Car r o;
const r uct or Cr eat e;
end;

Car r o = cl ass / / Subsi st ema Compl exo
pr ocedur e Abr i r Por t as;
pr ocedur e Aj ust ar Ret r ovi sor es;
pr ocedur e Aj ust ar Banco;
pr ocedur e Li gar ;
end;



pr ocedur e Car r o. Abr i r Por t as;
begi n
ShowMessage( ' Por t as aber t as ! ! ' ) ;
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 44
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

44 Design Patterns

pr ocedur e Car r o. Aj ust ar Banco;
begi n
ShowMessage( ' Banco aj ust ado ! ! ' ) ;
end;

pr ocedur e Car r o. Aj ust ar Ret r ovi sor es;
begi n
ShowMessage( ' Ret r ovi sor es aj ust ados ! ! ' ) ;
end;

pr ocedur e Car r o. Li gar ;
begi n
ShowMessage( ' Mot or Li gado ! ! ' ) ;
end;

const r uct or Car r oFacade. Cr eat e;
begi n
C : = Car r o. Cr eat e;
end;

pr ocedur e Car r oFacade. Usar Car r o;
begi n
C. Abr i r Por t as;
C. Aj ust ar Ret r ovi sor es;
C. Aj ust ar Banco;
C. Li gar ;
end;


var
C: Car r oFacade;
begi n
C : = Car r oFacade. Cr eat e;
C. Usar Car r o;
end;


Proxy

Fornece um objeto substituto de outro objeto para controlar o acesso a ele. [GoF].


Diagrama Estrutural



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 45
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

45 Design Patterns


Existem dois tipos de Proxy: Proxy Remoto e Proxy Virtual;

O Proxy Remoto utilizado em situaes que o objeto a ser utilizado est em outro AppDomain em
outra mquina, ou seja, na perspectiva do cliente, o objeto como se estivesse localmente. As
chamadas recebidas pelo objeto proxy transferida transparentemente para o objeto remoto e sua
resposta repassada para o proxy que transfere para o objeto solicitante. Esta tcnica muito
utilizada em tecnologias como o .NET Remoting.

O Proxy Virtual possui a mesma caracterstica de substiuio. Seu papel adiar a criao do objeto
real, com isso consegue-se reduzir o peso em instanciar completamente um determinado objeto
desnecessariamente.


Classes participantes e suas responsabilidades


Classe Papel
Proxy

Mantm a referncia que permite o acesso ao objeto real.
Subject

Define uma interface comum para o RealSubject e o Proxy.

RealSubject

Define o objeto real que o proxy representar.




Implementao

t ype
I Car r o = i nt er f ace
pr ocedur e Abr i r Por t as;
pr ocedur e Aj ust ar Ret r ovi sor es;
pr ocedur e Aj ust ar Banco;
pr ocedur e Li gar ;
end;

Car r o = cl ass( TI nt er f acedObj ect , I Car r o)
publ i c

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 46
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

46 Design Patterns
pr ocedur e Abr i r Por t as;
pr ocedur e Aj ust ar Banco;
pr ocedur e Aj ust ar Ret r ovi sor es;
pr ocedur e Li gar ;
end;

Car r oPr oxy = cl ass( TI nt er f acedObj ect , I Car r o)
pr i vat e
C: Car r o;
publ i c
pr ocedur e Abr i r Por t as;
pr ocedur e Aj ust ar Banco;
pr ocedur e Aj ust ar Ret r ovi sor es;
pr ocedur e Li gar ;
end;



pr ocedur e Car r o. Abr i r Por t as;
begi n
ShowMessage( ' Por t as aber t as ! ! ' ) ;
end;

pr ocedur e Car r o. Aj ust ar Banco;
begi n
ShowMessage( ' Banco aj ust ado ! ! ' ) ;
end;

pr ocedur e Car r o. Aj ust ar Ret r ovi sor es;
begi n
ShowMessage( ' Ret r ovi sor es aj ust ados ! ! ' ) ;
end;

pr ocedur e Car r o. Li gar ;
begi n
ShowMessage( ' Mot or l i gado ! ! ' ) ;
end;

pr ocedur e Car r oPr oxy. Abr i r Por t as;
begi n
C. Abr i r Por t as;
end;

pr ocedur e Car r oPr oxy. Aj ust ar Banco;
begi n
C. Aj ust ar Banco;
end;

pr ocedur e Car r oPr oxy. Aj ust ar Ret r ovi sor es;
begi n
C. Aj ust ar Ret r ovi sor es;
end;

pr ocedur e Car r oPr oxy. Li gar ;
begi n
i f not Assi gned( C) t hen
C : = Car r o. Cr eat e;
C. Abr i r Por t as;
C. Aj ust ar Banco;
C. Aj ust ar Ret r ovi sor es;
C. Li gar ;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 47
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

47 Design Patterns

var
C: Car r oPr oxy;
begi n
C : = Car r oPr oxy. Cr eat e;
C. Li gar ;
end;



PadresComportamentais


Iterator

Fornece uma forma de acessar elementos de um objeto agregado sequencialmente sem expor sua
representao. [GoF].


Diagrama Estrutural





Classes participantes e suas responsabilidades


Classe Papel
Iterator

Define uma interface para acesso aos elementos.

ConcreteIterator

Implementa a interface Iterator.

Aggregate

Define uma interface para criao de um objeto Iterator.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 48
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

48 Design Patterns
ConcreteAggregate

Implementa a criao do Iterator para retornar uma instncia
do ConcreteIterator.





Implementao

t ype
I I t er at or = i nt er f ace;

I Aggr egat e = i nt er f ace
[ ' {03F8E122- 91BE- 42EA- A4C1- 1738C62C133D}' ]
f unct i on Cr eat eI t er at or : I I t er at or ;
end;

TConcr et eAggr egat e = cl ass( TI nt er f acedObj ect , I Aggr egat e)
pr i vat e
FI t ems: TLi st ;
f unct i on Get I t ems( I ndex: I nt eger ) : TObj ect ;
publ i c
const r uct or Cr eat e;
f unct i on Cr eat eI t er at or : I I t er at or ;
pr oper t y I t ems[ I ndex: I nt eger ] : TObj ect r ead Get I t ems; def aul t ;
pr ocedur e Add( Obj : TObj ect ) ;
f unct i on Count : i nt eger ;
end;

I I t er at or = i nt er f ace
[ ' {02C55BDE- D1E3- 4593- B989- 80E1735F3091}' ]
f unct i on Fi r st : TObj ect ;
f unct i on Next : TObj ect ;
f unct i on I sDone: bool ean;
f unct i on Cur r ent I t em: TObj ect ;
end;

TConcr et eI t er at or = cl ass( TI nt er f acedObj ect , I I t er at or )
pr i vat e
FAggr egat e: TConcr et eAggr egat e;
FCur r ent : i nt eger ;
publ i c
const r uct or Cr eat e( Aggr egat e: TConcr et eAggr egat e) ;
f unct i on Cur r ent I t em: TObj ect ;
f unct i on Fi r st : TObj ect ;
f unct i on I sDone: Bool ean;
f unct i on Next : TObj ect ;
end;


i mpl ement at i on

const r uct or TConcr et eI t er at or . Cr eat e( Aggr egat e: TConcr et eAggr egat e) ;
begi n
i nher i t ed Cr eat e;
FAggr egat e : = Aggr egat e;
end;

f unct i on TConcr et eI t er at or . Cur r ent I t em: TObj ect ;
begi n
r esul t : = FAggr egat e[ FCur r ent ] ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 49
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

49 Design Patterns
end;

f unct i on TConcr et eI t er at or . Fi r st : TObj ect ;
begi n
r esul t : = FAggr egat e[ 0] ;
end;

f unct i on TConcr et eI t er at or . I sDone: Bool ean;
begi n
r esul t : = FCur r ent > Pr ed( FAggr egat e. Count ) ;
end;

f unct i on TConcr et eI t er at or . Next : TObj ect ;
begi n
r esul t : = ni l ;
I nc( FCur r ent ) ;
i f FCur r ent <= Pr ed( FAggr egat e. Count ) t hen
r esul t : = FAggr egat e[ FCur r ent ] ;
end;

pr ocedur e TConcr et eAggr egat e. Add( Obj : TObj ect ) ;
begi n
FI t ems. Add( Obj ) ;
end;

f unct i on TConcr et eAggr egat e. Count : i nt eger ;
begi n
r esul t : = FI t ems. Count ;
end;

const r uct or TConcr et eAggr egat e. Cr eat e;
begi n
i nher i t ed;
FI t ems : = TLi st . Cr eat e;
end;

f unct i on TConcr et eAggr egat e. Cr eat eI t er at or : I I t er at or ;
begi n
r esul t : = TConcr et eI t er at or . Cr eat e( Sel f ) ;
end;

f unct i on TConcr et eAggr egat e. Get I t ems( I ndex: I nt eger ) : TObj ect ;
begi n
r esul t : = FI t ems[ I ndex]
end;



Observer

Define uma dependncia um-para-muitos entre objetos de forma que se um mudar seu estado, todos
os objetos dependents sero notificados e atualizados automaticamente. [GoF].

Este padro muito freqente em projetos orientados a objetos. No Delphi este padro est
presente na notificao entre os componentes no form designer, quando um componente removido
ou inserido.

Diagrama Estrutural


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 50
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

50 Design Patterns



Classes participantes e suas responsabilidades


Classe Papel
Subject

Conhece os observadores. Fornece uma interface para atachar ou
desatachar objetos Observer.

Observer

Define uma interface de atualizao de objetos que so notificados de
mudanas em um Subject.

ConcreteSubject

Envia uma notificao para os observadores quado o estado mudar.

ConcreteObserver

Implementa a interface Observer.



Implementao

t ype
I Suj ei t o = i nt er f ace;

I Obser ver = i nt er f ace
pr ocedur e Updat e( ASuj ei t o : I Suj ei t o) ;
end;

I Suj ei t o = i nt er f ace / / Suj ei t o
pr ocedur e Subscr i be( AObser ver : I Obser ver ) ;
pr ocedur e UnSubscr i be( AObser ver : I Obser ver ) ;
pr ocedur e Not i f y;
end;

TMont ador a = cl ass( TI nt er f acedObj ect , I Suj ei t o)
pr i vat e
FObser ver s: I I nt er f aceLi st ;
publ i c
const r uct or Cr eat e;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 51
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

51 Design Patterns
pr ocedur e Mudar Model oMont agem;
pr ocedur e Subscr i be( AObser ver : I Obser ver ) ;
pr ocedur e UnSubscr i be( AObser ver : I Obser ver ) ;
pr ocedur e Not i f y;
end;

TCar r o = cl ass( TI nt er f acedObj ect , I Obser ver )
pr i vat e
FModel o: st r i ng;
publ i c
pr ocedur e Updat e( ASuj ei t o: I Suj ei t o) ;
const r uct or Cr eat e( Model o: st r i ng) ;
end;



const r uct or TCar r o. Cr eat e( Model o: st r i ng) ;
begi n
FModel o : = Model o;
end;

pr ocedur e TCar r o. Updat e( ASuj ei t o: I Suj ei t o) ;
begi n
i nher i t ed;
Showmessage( FModel o + ' not i f i cado ! ! ' )
end;

const r uct or TMont ador a. Cr eat e;
begi n
i nher i t ed;
FObser ver s : = TI nt er f aceLi st . Cr eat e;
end;

pr ocedur e TMont ador a. Mudar Model oMont agem;
begi n
/ / f az qq coi sa aqui .
Not i f y;
end;


pr ocedur e TMont ador a. Not i f y;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FObser ver s. Count ) do
( I Obser ver ( FObser ver s. I t ems[ i ] ) ) . Updat e( sel f ) ;
end;

pr ocedur e TMont ador a. Subscr i be( AObser ver : I Obser ver ) ;
begi n
FObser ver s. Add( AObser ver ) ;
end;

pr ocedur e TMont ador a. UnSubscr i be( AObser ver : I Obser ver ) ;
begi n
FObser ver s. Remove( AObser ver ) ;
end;



var
M: TMont ador a;
C1, C2: TCar r o;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 52
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

52 Design Patterns
begi n
M : = TMont ador a. Cr eat e;
C1 : = TCar r o. Cr eat e( ' Ci vi c' ) ;
C2 : = TCar r o. Cr eat e( ' Cor ol l a' ) ;
M. Subscr i be( C1) ;
M. Subscr i be( C2) ;
M. Mudar Model oMont agem;
end;




State

Permite um objeto alterar seu comportamento quando o estado interno dele mudar. [GoF].


Diagrama Estrutural








Classes participantes e suas responsabilidades


Classe Papel
Context

Define a interface para clients interessados.

State

Define uma interface para encapsular o comportamento
associado a um estado especfico.

ConcreteState subclasses

Cada subclasse implementa um comportamento associado com
o estado do Context.




Implementao

t ype

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 53
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

53 Design Patterns
TCl i ent e = cl ass;
I St at e = i nt er f ace
[ ' {0F7829C3- FD5C- 4765- A4F4- 793C64B57F24}' ]
f unct i on Sal var : bool ean;
end;

TEdi t St at e = cl ass( TI nt er f acedObj ect , I St at e)
pr i vat e
FObj : TCl i ent e;
publ i c
const r uct or Cr eat e( Obj : TCl i ent e) ;
f unct i on Sal var : Bool ean;
end;

TNewSt at e = cl ass( TI nt er f acedObj ect , I St at e)
pr i vat e
FObj : TCl i ent e;
publ i c
const r uct or Cr eat e( Obj : TCl i ent e) ;
f unct i on Sal var : Bool ean;
end;

TBr owseSt at e = cl ass( TI nt er f acedObj ect , I St at e)
pr i vat e
FObj : TCl i ent e;
publ i c
const r uct or Cr eat e( Obj : TCl i ent e) ;
f unct i on Sal var : Bool ean;
end;

TCl i ent e = cl ass
pr i vat e
FSt at e: I St at e;
pr ocedur e Set St at e( const Val ue: I St at e) ;
publ i c
f unct i on Sal var : Bool ean;
pr oper t y St at e: I St at e r ead FSt at e wr i t e Set St at e;
end;



const r uct or TNewSt at e. Cr eat e( Obj : TCl i ent e) ;
begi n
i nher i t ed Cr eat e;
FObj : = Obj ;
end;

f unct i on TNewSt at e. Sal var : Bool ean;
begi n
/ / qq cdi go aqui
/ / muda o est ado
FObj . St at e : = TBr owseSt at e. Cr eat e( FObj ) ;
ShowMessage( ' Est ado " New" par a " Br owse" ' ) ;
end;

const r uct or TEdi t St at e. Cr eat e( Obj : TCl i ent e) ;
begi n
i nher i t ed Cr eat e;
FObj : = Obj ;
end;

f unct i on TEdi t St at e. Sal var : Bool ean;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 54
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

54 Design Patterns
/ / qq cdi go aqui
/ / muda o est ado
FObj . St at e : = TBr owseSt at e. Cr eat e( FObj ) ;
ShowMessage( ' Est ado " Edi t " par a " Br owse" ' ) ;
end;

f unct i on TCl i ent e. Sal var : Bool ean;
begi n
r esul t : = FSt at e. Sal var ;
end;

pr ocedur e TCl i ent e. Set St at e( const Val ue: I St at e) ;
begi n
FSt at e : = Val ue;
end;

const r uct or TBr owseSt at e. Cr eat e( Obj : TCl i ent e) ;
begi n
i nher i t ed Cr eat e;
FObj : = Obj ;
end;

f unct i on TBr owseSt at e. Sal var : Bool ean;
begi n
/ / qq cdi go aqui
r ai se Except i on. Cr eat e( ' No est emedi o! ' )
end;


var
Cl i ent e: TCl i ent e;
begi n
Cl i ent e : = TCl i ent e. Cr eat e;
Cl i ent e. St at e : = TNewSt at e. Cr eat e( Cl i ent e) ;
Cl i ent e. Sal var ;
end;




Strategy

Define uma famlia de algoritmos, cada qual encapsulado e intercambiveis. Strategy deixa o
algoritmo muito mais independente dos clientes que os usam.[GoF]

Diagrama Estrutural




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 55
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

55 Design Patterns


Classes participantes e suas responsabilidades


Classe Papel
Strategy

Declara uma interface comum a todos os algoritmos.

ConcreteStrategy

Implementa o algoritmo usando a interface Strategy.

Context

Mantm uma referencia a um objeto Strategy.




Implementao


t ype
I St r at egy = i nt er f ace
pr ocedur e Al gor i t hmI nt er f ace;
end;

TConcr et eSt r at egyA = cl ass( TI nt er f acedObj ect , I St r at egy)
publ i c
pr ocedur e Al gor i t hmI nt er f ace;
end;

TConcr et eSt r at egyB = cl ass( TI nt er f acedObj ect , I St r at egy)
publ i c
pr ocedur e Al gor i t hmI nt er f ace;
end;

TConcr et eSt r at egyC = cl ass( TI nt er f acedObj ect , I St r at egy)
publ i c
pr ocedur e Al gor i t hmI nt er f ace;
end;

TCont ext = cl ass
pr i vat e
FSt r at egy: I St r at egy;
publ i c
const r uct or Cr eat e( St r at egy: I St r at egy) ;
pr ocedur e Cont ext I nt er f ace;
end;


i mpl ement at i on

pr ocedur e TConcr et eSt r at egyA. Al gor i t hmI nt er f ace;
begi n
ShowMessage( ' TConcr et eSt r at egyA. Al gor i t hmI nt er f ace' ) ;
end;

pr ocedur e TConcr et eSt r at egyB. Al gor i t hmI nt er f ace;
begi n
ShowMessage( ' TConcr et eSt r at egyB. Al gor i t hmI nt er f ace' ) ;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 56
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

56 Design Patterns
pr ocedur e TConcr et eSt r at egyC. Al gor i t hmI nt er f ace;
begi n
ShowMessage( ' TConcr et eSt r at egyC. Al gor i t hmI nt er f ace' ) ;
end;

pr ocedur e TCont ext . Cont ext I nt er f ace;
begi n
FSt r at egy. Al gor i t hmI nt er f ace;
end;

const r uct or TCont ext . Cr eat e( St r at egy: I St r at egy) ;
begi n
i nher i t ed Cr eat e;
FSt r at egy : = St r at egy;
end;







TemplateMethod

Define o esqueleto de um algoritmo em uma operao, delegando alguns passos s subclasses.
Template Method deixa subclasses redefinirem certos passos de um algoritmo sem modificar a
estrutura do algoritmo.[GoF]


Diagrama Estrutural





Classes participantes e suas responsabilidades


Classe Papel
AbstractClass

Define mtodos abstratos que subclasse definirao sua
implementao.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 57
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

57 Design Patterns
ConcreteClass

Implementa os mtodos abstratos.




Implementao

t ype
TCar r o = cl ass
pr ocedur e At i var I nj ecaoEl et r oni ca; vi r t ual ; abst r act ;
pr ocedur e At i var Bobi naI gni cao; vi r t ual ; abst r act ;
pr ocedur e Li gar ( ) ;
end;

THonda = cl ass( TCar r o)
publ i c
pr ocedur e At i var Bobi naI gni cao; over r i de;
pr ocedur e At i var I nj ecaoEl et r oni ca; over r i de;
end;

i mpl ement at i on

pr ocedur e TCar r o. Li gar ;
begi n
At i var I nj ecaoEl et r oni ca;
At i var Bobi naI gni cao;
end;

pr ocedur e THonda. At i var Bobi naI gni cao;
begi n
i nher i t ed;
ShowMessage( ' At i var Bobi naI gni cao' ) ;
end;

pr ocedur e THonda. At i var I nj ecaoEl et r oni ca;
begi n
i nher i t ed;
ShowMessage( ' At i var I nj ecaoEl et r oni ca' ) ;
end;



Teste suas habilidades:

http://home.earthlink.net/~huston2/dp/patterns_quiz.html

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 58
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

58 Design Patterns
Model View Controller - MVC

O padro MVC Model View Controller surgiu na comunidade SmallTalk por volta de 1979. Seu
principal objetivo determinar camadas com alta coeso e baixo acoplamento, independentes e ao
mesmo tempo integrveis, ou seja, atravs de camadas separadas por sua funo, possvel que o
modelo possa ser acessado e visualizado por vrios tipos de interfaces.








Model
Estrutura lgica de todas as classes de negcio, onde h um grande encapsulamento de
funcionalidades, modela os dados e o comportamento por trs do processo de negcios;

View
Interface grfica com o usurio

Controller
Implementa o meio de comunicao entre o modelo (Model) e a interface visual (View).


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 59
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

59 Design Patterns
Num primeiro momento este tipo de arquitetura faz lembrar a diviso em camadas atravs de
processos (DataSnap), mas, obviamente este no nosso objetivo. O MVC fornece uma maneira de
dividir a funcionalidade envolvida na manuteno e apresentao dos dados de uma aplicao. A
arquitetura MVC no nova e foi originalmente desenvolvida para mapear as tarefas tradicionais de
entrada, processamento e sada para um modelo de interao com o usurio. Usando o padro MVC
fica fcil mapear esses conceitos no domnio de aplicaes Web multicamadas.


t ype
/ / Obser ver
TModel = cl ass;
I Obser ver = i nt er f ace
pr ocedur e Updat e( Obser vabl e: TModel ) ;
end;

TModel = cl ass
pr i vat e
FObser ver s: I I nt er f aceLi st ;
publ i c
pr ocedur e At t ach( Obser ver : I Obser ver ) ;
pr ocedur e Det ach( Obser ver : I Obser ver ) ;
pr ocedur e Not i f y;
const r uct or Cr eat e;
end;

/ / Cont r ol ador
I Cont r ol l er = i nt er f ace
f unct i on Appl y: bool ean;
pr ocedur e New;
f unct i on Del et e: bool ean;
end;

/ / Cont r ol ador par a Cl i ent e
TCl i ent e = cl ass;
TObj ect Type = cl ass
pr i vat e
FCl i ent e: TCl i ent e;
pr ocedur e Set Cl i ent e( const Val ue: TCl i ent e) ;
publ i shed
pr oper t y Cl i ent e: TCl i ent e r ead FCl i ent e wr i t e Set Cl i ent e;
end;

TCl i ent eCont r ol l er = cl ass( TI nt er f acedObj ect , I Cont r ol l er )
pr i vat e
FObj ect Type: TObj ect Type;
publ i c
f unct i on Appl y: bool ean;
pr ocedur e New;
f unct i on Del et e: Bool ean;
pr oper t y Model : TObj ect Type r ead FObj ect Type;
const r uct or Cr eat e( AModel : TCl i ent e) ;
end;

/ / Model o Cl i ent e
TCl i ent e = cl ass( TModel )
pr i vat e
FEmai l : st r i ng;
FNome: st r i ng;
pr ocedur e Set Emai l ( const Val ue: st r i ng) ;
pr ocedur e Set Nome( const Val ue: st r i ng) ;
publ i c
const r uct or Cr eat e; vi r t ual ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 60
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

60 Design Patterns
publ i shed
pr oper t y Nome: st r i ng r ead FNome wr i t e Set Nome;
pr oper t y Emai l : st r i ng r ead FEmai l wr i t e Set Emai l ;
end;





pr ocedur e Tf r mVi ew1. bt nExcl ui r Cl i ck( Sender : TObj ect ) ;
begi n
FCont r ol l er . Del et e;
end;

pr ocedur e Tf r mVi ew1. bt nNovoCl i ck( Sender : TObj ect ) ;
begi n
FCont r ol l er . New;
end;

pr ocedur e Tf r mVi ew1. bt nSal var Cl i ck( Sender : TObj ect ) ;
begi n
FCont r ol l er . Model . Cl i ent e. Nome : = edt Nome. Text ;
FCont r ol l er . Model . Cl i ent e. Emai l : = edt Emai l . Text ;
FCont r ol l er . Appl y;
end;

const r uct or Tf r mVi ew1. Cr eat e( AOwner : TComponent ; Cont r ol l er :
TCl i ent eCont r ol l er ) ;
begi n
i nher i t ed Cr eat e ( AOwner ) ;
FCont r ol l er : = Cont r ol l er ;
FCont r ol l er . Model . Cl i ent e. At t ach( sel f ) ;
edt Nome. Text : = FCont r ol l er . Model . Cl i ent e. Nome;
edt Emai l . Text : = FCont r ol l er . Model . Cl i ent e. Emai l ;
end;

pr ocedur e Tf r mVi ew1. Updat e( Obser vabl e: TModel ) ;
begi n
edt Nome. Text : = FCont r ol l er . Model . Cl i ent e. Nome;
edt Emai l . Text : = FCont r ol l er . Model . Cl i ent e. Emai l ;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 61
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

61 Design Patterns



pr ocedur e Tf r mVi ew2. bt nNovoCl i ck( Sender : TObj ect ) ;
begi n
FCont r ol l er . New;
end;

pr ocedur e Tf r mVi ew2. bt nSal var Cl i ck( Sender : TObj ect ) ;
begi n
FCont r ol l er . Model . Cl i ent e. Nome : = edt Nome. Text ;
FCont r ol l er . Model . Cl i ent e. Emai l : = edt Emai l . Text ;
FCont r ol l er . Appl y;
end;

const r uct or Tf r mVi ew2. Cr eat e( AOwner : TComponent ; Cont r ol l er :
TCl i ent eCont r ol l er ) ;
begi n
i nher i t ed Cr eat e ( AOwner ) ;
FCont r ol l er : = Cont r ol l er ;
FCont r ol l er . Model . Cl i ent e. At t ach( sel f ) ;
edt Nome. Text : = FCont r ol l er . Model . Cl i ent e. Nome;
edt Emai l . Text : = FCont r ol l er . Model . Cl i ent e. Emai l ;
end;

pr ocedur e Tf r mVi ew2. Updat e( Obser vabl e: TModel ) ;
begi n
edt Nome. Text : = FCont r ol l er . Model . Cl i ent e. Nome;
edt Emai l . Text : = FCont r ol l er . Model . Cl i ent e. Emai l ;
end;






___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 62
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

62 Design Patterns



var
Model : TCl i ent e;

pr ocedur e TFor m1. bt nVi ew1Cl i ck( Sender : TObj ect ) ;
var
Cont r ol l er : TCl i ent eCont r ol l er ;
begi n
Cont r ol l er : = TCl i ent eCont r ol l er . Cr eat e( Model ) ;
f r mVi ew1 : = Tf r mVi ew1. Cr eat e( Sel f , Cont r ol l er ) ;
f r mVi ew1. Show;
end;

pr ocedur e TFor m1. bt nVi ew2Cl i ck( Sender : TObj ect ) ;
var
Cont r ol l er : TCl i ent eCont r ol l er ;
begi n
Cont r ol l er : = TCl i ent eCont r ol l er . Cr eat e( Model ) ;
f r mVi ew2 : = Tf r mVi ew2. Cr eat e( Sel f , Cont r ol l er ) ;
f r mVi ew2. Show;
end;

pr ocedur e TFor m1. For mCr eat e( Sender : TObj ect ) ;
begi n
Model : = TCl i ent e. Cr eat e;
end;







___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 63
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

63 Design Patterns

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 64
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

64 Design Patterns
Data Access Objetc - DAO


O DAO Data Access Object um pattern J 2EE que objetiva criar uma camada abstrata e
encapsulada a qual o modelo pudesse utilizar para persistir seus objetos, com isto, resolver a
impedncia que existe entre os objetos e o banco de dados relacional. Ainda que trabalhamos
orientados a objetos, o banco de dados relacional, com isto, ainda h a necessidade de se trabalhar
com comandos SQL. O DAO gerenciar a conexo ao banco de dados, far o controle das
gravaes e obtenes de dados.

Veja o problema segundo Martin Fowler:






EstruturaDAO




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 65
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

65 Design Patterns





BusinessObject
Representa os objetos do modelo, que requisitam acesso fonte de dados para obter e armazenar
dados.

DataAccessObject
o objeto primrio deste padro, faz o acesso aos dados transparente para uso dos
BusinessObjects.

DataSource
Representa uma implementao de uma fonte de dados, seja ela um RDBMS, OODBMS, XML
etc..

TransferObject
Representa um Transfer Object usado para conexes remotas.




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 66
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

66 Design Patterns
t ype
TDat aSour ce = ( dsI nt er base, dsMSSQL, dsOr acl e) ;

TCl i ent e = cl ass
pr i vat e
FEmai l : st r i ng;
FNome: st r i ng;
FOI D: i nt eger ;
pr ocedur e Set Emai l ( const Val ue: st r i ng) ;
pr ocedur e Set Nome( const Val ue: st r i ng) ;
pr ocedur e Set OI D( const Val ue: i nt eger ) ;
publ i shed
pr oper t y OI D: i nt eger r ead FOI D wr i t e Set OI D;
pr oper t y Nome: st r i ng r ead FNome wr i t e Set Nome;
pr oper t y Emai l : st r i ng r ead FEmai l wr i t e Set Emai l ;
end;

I Cl i ent eDAO = i nt er f ace
f unct i on Appl y( Cl i ent e: TCl i ent e) : bool ean;
f unct i on Del et e( Cl i ent e: TCl i ent e) : bool ean;
f unct i on Li st : TLi st ;
f unct i on Fi nd: TCl i ent e;
end;

TCl i ent eDAOMSSQL = cl ass( TI nt er f acedObj ect , I Cl i ent eDAO)
f unct i on Appl y( Cl i ent e: TCl i ent e) : bool ean;
f unct i on Del et e( Cl i ent e: TCl i ent e) : bool ean;
f unct i on Li st : TLi st ;
f unct i on Fi nd: TCl i ent e;
end;

TFact or yDAO = cl ass abst r act
f unct i on Cl i ent eDAO: I Cl i ent eDAO; vi r t ual ; abst r act ;
cl ass f unct i on Get DAOFact or y( Dat aSour ce: TDat aSour ce) : TFact or yDAO;
end;

TFact or yDAOMSSQL = cl ass ( TFact or yDAO)
cl ass f unct i on Ceat eConnect i on: TSql Connect i on;
f unct i on Cl i ent eDAO: I Cl i ent eDAO; over r i de;
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 67
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

67 Design Patterns
i mpl ement at i on

pr ocedur e TCl i ent e. Set Emai l ( const Val ue: st r i ng) ;
begi n
FEmai l : = Val ue;
end;

pr ocedur e TCl i ent e. Set Nome( const Val ue: st r i ng) ;
begi n
FNome : = Val ue;
end;

pr ocedur e TCl i ent e. Set OI D( const Val ue: i nt eger ) ;
begi n
FOI D : = Val ue;
end;

f unct i on TCl i ent eDAOMSSQL. Appl y( Cl i ent e: TCl i ent e) : bool ean;
var
Conn: TSql Connect i on;
st r SQL: st r i ng;
begi n
t r y
Conn : = TFact or yDAOMSSQL. Ceat eConnect i on;
st r SQL : = ' I nser t I nt o Cl i ent e( Nome, Emai l ) Val ues( ' +
Quot edSt r ( Cl i ent e. Nome) + ' , ' +
Quot edSt r ( Cl i ent e. Emai l ) + ' ) ' ;
r esul t : = Conn. Execut eDi r ect ( st r SQL) = 1;
f i nal l y
Fr eeAndNi l ( Conn) ;
end;
end;

f unct i on TCl i ent eDAOMSSQL. Del et e( Cl i ent e: TCl i ent e) : bool ean;
var
Conn: TSql Connect i on;
st r SQL: st r i ng;
begi n
t r y
Conn : = TFact or yDAOMSSQL. Ceat eConnect i on;
st r SQL : = ' Del et e Fr omCl i ent e Wher e I D=' + I nt ToSt r ( Cl i ent e. OI D) ;
r esul t : = Conn. Execut eDi r ect ( st r SQL) = 1;
f i nal l y
Fr eeAndNi l ( Conn) ;
end;
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 68
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

68 Design Patterns
f unct i on TCl i ent eDAOMSSQL. Fi nd: TCl i ent e;
var
Conn: TSql Connect i on;
Dat a: TSql Dat aSet ;
st r SQL: st r i ng;
begi n
t r y
Conn : = TFact or yDAOMSSQL. Ceat eConnect i on;
st r SQL : = ' Sel ect * Fr omCl i ent e' ;
Dat a : = TSQLDat aSet . Cr eat e( ni l ) ;
Dat a. CommandText : = st r SQL;
Dat a. SQLConnect i on : = Conn;
Dat a. Open;
i f not Dat a. Eof t hen
wi t h Dat a do
begi n
r esul t : = TCl i ent e. Cr eat e;
r esul t . Nome : = Dat a. Fi el dByName( ' Nome' ) . AsSt r i ng;
r esul t . Emai l : = Dat a. Fi el dByName( ' Emai l ' ) . AsSt r i ng;
end;
f i nal l y
Fr eeAndNi l ( Conn) ;
Fr eeAndNi l ( Dat a) ;
end;
end;

f unct i on TCl i ent eDAOMSSQL. Li st : TLi st ;
var
Conn: TSql Connect i on;
Dat a: TSql Dat aSet ;
st r SQL: st r i ng;
Cl i ent e: TCl i ent e;
begi n
t r y
Conn : = TFact or yDAOMSSQL. Ceat eConnect i on;
st r SQL : = ' Sel ect * Fr omCl i ent e' ;
Dat a : = TSQLDat aSet . Cr eat e( ni l ) ;
Dat a. CommandText : = st r SQL;
Dat a. SQLConnect i on : = Conn;
Dat a. Open;
whi l e not Dat a. Eof do
begi n
Cl i ent e : = TCl i ent e. Cr eat e;
wi t h Dat a, Cl i ent e do
begi n
r esul t : = TLi st . Cr eat e;
Nome : = Dat a. Fi el dByName( ' Nome' ) . AsSt r i ng;
Emai l : = Dat a. Fi el dByName( ' Emai l ' ) . AsSt r i ng;
Next ;
end;
end;
f i nal l y
Fr eeAndNi l ( Conn) ;
Fr eeAndNi l ( Dat a) ;
end;
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 69
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

69 Design Patterns
cl ass f unct i on TFact or yDAO. Get DAOFact or y( Dat aSour ce: TDat aSour ce) : TFact or yDAO;
begi n
case Dat aSour ce of
dsMSSQL: r esul t : = TFact or yDAOMSSQL. Cr eat e;
dsI nt er base: {r esul t : = TFact or yDAOI BX. Cr eat e};
dsOr acl e: {r esul t : = TFact or yDAOOr acl e. Cr eat e};
end;
end;

cl ass f unct i on TFact or yDAOMSSQL. Ceat eConnect i on: TSql Connect i on;
var
ASql Conn: TSql Connect i on;
begi n
ASql Conn : = TSQLConnect i on. Cr eat e( ni l ) ;
ASql Conn. Dr i ver Name : = ' MSSQL' ;
ASql Conn. Get Dr i ver Func : = ' get SQLDr i ver MSSQL' ;
ASql Conn. Li br ar yName : = ' dbexpmss. dl l ' ;
ASql Conn. Vendor Li b : = ' ol edb' ;
ASql Conn. Par ams. Val ues[ ' Host Name' ] : = ' l ocal host ' ;
ASql Conn. Par ams. Val ues[ ' Dat abase' ] : = ' Nor t hWi nd' ;
ASql Conn. Par ams. Val ues[ ' User _Name' ] : = ' sa' ;
ASql Conn. Par ams. Val ues[ ' Passwor d' ] : = ' ' ;
ASql Conn. Logi nPr ompt : = f al se;
ASql Conn. Open;
r esul t : = ASql Conn;
end;

f unct i on TFact or yDAOMSSQL. Cl i ent eDAO: I Cl i ent eDAO;
begi n
r esul t : = TCl i ent eDAOMSSQL. Cr eat e;
end;

var
Fact or yDAO: TFact or yDAO;
Cl i ent eDAO: I Cl i ent eDAO;
Cl i ent e: TCl i ent e;
begi n
Fact or yDAO : = TFact or yDAOMSSQL. Get DaoFact or y( dsMSSQL) ;
Cl i ent eDAO : = Fact or yDAO. Cl i ent eDAO;

Cl i ent e : = TCl i ent e. Cr eat e;
Cl i ent e. Nome : = ' Adi l son J r ' ;
Cl i ent e. Emai l : = ' adi l sonj r @t dst ecnol ogi a. com. br ' ;

Cl i ent eDAO. Appl y( Cl i ent e) ;
end;










___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 70
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

70 Reflexo
Reflexo

Reflexo a habilidade de uma dada linguagem de extrair informaes a respeito de seus objetos,
de forma que possa modificar e controlar seus membros em tempo de execuo.

Este recurso trs uma flexibilidade incrvel, visto que podemos escrever cdigos mais eficientes,
capazes de saber sobre determinado objeto em tempo de execuo, acessar suas propriedades,
atributos, invocar seus mtodos, informaes estas que no teramos em tempo de desenvolvimento
se quisssemos um cdigo realmente flexvel.

Uma demonstrao mais objetiva deste comportamento no Delphi 2006 a simples tarefa de pr
um novo componente no formulrio, imediatamente o object inspector obtm uma lista de todas as
propriedades do componente adicionado. O conceito de propriedade (owner) dos componentes
tambm usa de reflexo para eliminar os componentes possudos (owned).

Este mecanismo uma soluo para alguns dos problemas que surgem no ciclo de vida de software,
pois permite que um sistema possa alterar o seu prprio esquema de funcionamento, modificando
ou analisando o seu prprio comportamento. Em geral, o mecanismo de reflexividade aumenta a
flexibilidade, a extensibilidade e a reutilizao de cdigo.

Reflexo o motor que realiza o funcionamento de frameworks de persistncia como DePO,
InstantObjects, TDS Baltazar etc., visto que uma vez que qualquer objeto pode ter seus membros
extrados em tempo de execuo possvel com isto, criar os SQLs necessrios ao banco de dados
relacional (Impedncia, Mapeamento Objeto Relacional).


RTTI

RTTI (Runtime Type Information) uma implementao limitada de reflexo para aplicaes
Delphi Win32. Digo limitada porque a RTTI possui restries em seu uso, que veremos a seguir:


Algumas restries:

Propriedades
Propriedade cujo tipo ordinal, string, classe, interface ou method-pointer podem ser publicadas.
Tipos reais podem ser publicados, com exceo do Real48. Propriedades array no podem ser
publicadas.

Mtodos
Todos os mtodos so publicveis, porm uma classe no pode publicar dois ou mais mtodos
sobrecarregados overload.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 71
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

71 Reflexo
Campos
Campos podem ser publicados somente se forem do tipo de classes ou interfaces.

Para usar reflexo no Delphi necessrio que a classe seja compilada com a diretiva {$M+}{$M-}
ou {$TYPEINFO ON}{TYPEINFO OFF}, ou herdar de uma que j tenha a diretiva como
TPersistent. Com isto, toda propriedade, mtodo ou campo publicado published poder ser lido
em tempo de execuo, ou seja, o compilador ir gerar RTTI para os membros nesta seo.

Na VCL encontramos a unit TypInfo que relaciona todos os mtodos necessrios para se trabalhar
com reflexo no Delphi Win32.


RTTIparaPropriedades

O record TPropInfo descreve a estrutura de propriedades que so publicadas, com variveis para
acessar suas informaes internas.


TPr opI nf o = packed r ecor d
Pr opType: PPTypeI nf o;
Get Pr oc: Poi nt er ;
Set Pr oc: Poi nt er ;
St or edPr oc: Poi nt er ;
I ndex: I nt eger ;
Def aul t : Longi nt ;
NameI ndex: Smal l I nt ;
Name: Shor t St r i ng;
end;


Observe a presena da palavra reservada packed que indica que o compilador no ir alinhar os
campos internos do record, ou seja, o alinhamento de endereamento de memria em 2, 4 ou 8 bytes
que otimizaria o acesso no ser feito. Com isto perde-se um pouco a performance, mas ganha-se
em tamanho, pois o cdigo final ficar sutilmente menor.



O ponteiro PropType aponta para uma estrutura de dados que informa o tipo da propriedade.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 72
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

72 Reflexo
Na verdade, observando a estrutura da VCL ir notar que PropType um pronteiro para um
ponteiro do tipo TTypeInfo, que possui a seguinte estrutura:


TTypeI nf o = r ecor d
Ki nd: TTypeKi nd;
Name: Shor t St r i ng;
{TypeDat a: TTypeDat a}
end;


O Kind do tipo TTypeKind um enumerado que classifica o tipo. O Name o nome classificador
tipo, string, integer, boolean, etc.. Observe na tabela abaixo os classificadores disponveis
para TTypeKind:



TTypeKind Descrio
tkUnknown No utilizado
tkInteger Usado por qualquer tipo numrico ordinal
tkChar Tipos Char e AnsiChar
tkEnumeration Todos tipos enumerados, isto inclui boolean, ByteBool,
WordBool, LongBool e Bool
tkFloat Qualquer tipo flutuante exceto Real
tkString Tipo da estrutura antiga de strings com limitaes [255], os
ShortStrings
tkSet Tipos Set
tkClass Tipos de Classes
tkMethod Tipos mtodos, procedures ou functions
tkWChar Tipos WideChar, novidade no Delphi 2
tkLString Strings longas, novidade no Delphi 2 os famosos AnsiChars
tkLWString Adicionado no Delphi 2 para preparao para as strings
longas,wide strings para Unicode, planejado para o Delphi 3
tkWString Substituiu no Delphi 3 o tkLWString
tkVariant Tipos Variant, novidade no Delphi 2
tkArray Tipos Array, novidade no Delphi 3
tkRecord Tipos Record, novidade no Delphi 3
tkInterface Tipos Interface, novidade no Delphi 3
tkInt64 Inteiros de 64-bit, novidade no Delphi 4
tkDynArray Tipos de arrays dinmicos, novidade no Delphi 4




GetProc e SetProc so ponteiros pra mtodos que obtm e grava algum dado na propriedade. Estes
mtodos so utlizados quando adicionamos componentes e alteramos suas propriedades no object
inspector.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 73
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

73 Reflexo
StoredProc um ponteiro pra uma funo que diz se o valor da propriedade sera gravado no .DFM
do formulrio. Isto est disponvel nos compontes da VCL atravs da chamada ao mtodo
SetSubComponent.

Index o ndice da propriedade. usado como um parmetro para os mtodos GetProc e SetProc
em propriedades indexadas, veja este exemplo:

pr oper t y Nome: st r i ng I ndex 0 r ead FNome wr i t e Set Nome;
pr oper t y Emai l : st r i ng I ndex 1 r ead FEmai l wr i t e Set Emai l ;

Default o valor default da propriedade.

Name o nome qualificador da propriedade.


Mtodos Importantes:

GetPropList
Retorna uma lista de propriedades publicadas de um objeto.

PropType
Indica o tipo da propriedade, pode se qualquer uma das relacionadas na tabela abaixo:

IsPublishedProp
Verifica se uma determinada propriedade foi publicada.

GetPropValue
Retorna o valor de uma propriedade.

GetObjectProp
Retorna a referncia ao objeto apontado pela propriedade.

SetPropValue
Atribui um valor a propriedade.

SetObjectProp
Atribui um objeto a propriedade.



RTTIparaMtodos

Os mtodos publicados usam uma estrutura de dados determinado pelo record TMethodInfoHeader.


TMet hodI nf oHeader = packed r ecor d
Len: Wor d;
Addr : Poi nt er ;
Name: Shor t St r i ng;
end;



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 74
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

74 Reflexo
Onde Len o tamanho do mtodo. Add o endereo de memria ponteiro para o mtodo. Name
o nome qualificador do mtodo.


RTTIparaCampos

Infelizmente, a VCL no nos deixou nenhum canal para que fosse usado como forma de extrair uma
lista de campos publicados de um objeto, o nico mtodo que pode se aproximar disto o mtodo
FieldAddress da classe TObject, que retorna um ponteiro para o campo passado como parmetro.

f unct i on TObj ect . Fi el dAddr ess( const Name: Shor t St r i ng) : Poi nt er ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 75
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

75 Reflexo
Vamos a um exemplo pragmtico do uso do RTTI no Delphi Win32. Crie uma nova aplicao
VCL Forms Application:





Neste exemplo construiremos uma TreeView com os membros publicados da classe TCliente.




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 76
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

76 Reflexo
Adicione uma nova unit ao projeto e a chame de uClasses. Declare as classes TEndereco e TCliente
como abaixo:


t ype
{$M+}
TEnder eco = cl ass
pr i vat e
FLogr adour o: st r i ng;
FBai r r o: st r i ng;
FNumer o: i nt eger ;
FCompl ement o: st r i ng;
pr ocedur e set _Bai r r o( const Val ue: st r i ng) ;
pr ocedur e set _Compl ement o( const Val ue: st r i ng) ;
pr ocedur e set _Logr adour o( const Val ue: st r i ng) ;
pr ocedur e set _Numer o( const Val ue: i nt eger ) ;
publ i shed
pr oper t y Logr adour o: st r i ng r ead FLogr adour o wr i t e set _Logr adour o;
pr oper t y Numer o: i nt eger r ead FNumer o wr i t e set _Numer o;
pr oper t y Compl ement o: st r i ng r ead FCompl ement o wr i t e set _Compl ement o;
pr oper t y Bai r r o: st r i ng r ead FBai r r o wr i t e set _Bai r r o;
end;

{$METHODI NFO ON}
TCl i ent e = cl ass
pr i vat e
FSobr eNome: st r i ng;
FNome: st r i ng;
FEnder eco: TEnder eco;
pr ocedur e set _Nome( const Val ue: st r i ng) ;
pr ocedur e set _Sobr eNome( const Val ue: st r i ng) ;
pr ocedur e set _Ender eco( const Val ue: TEnder eco) ;
publ i c
const r uct or Cr eat e; vi r t ual ;
publ i shed
f unct i on NomeCompl et o: st r i ng;
pr oper t y Nome: st r i ng r ead FNome wr i t e set _Nome;
pr oper t y Sobr eNome: st r i ng r ead FSobr eNome wr i t e set _Sobr eNome;
pr oper t y Ender eco: TEnder eco r ead FEnder eco wr i t e set _Ender eco;
end;
{$M- }




Adiretiva$METHODINFO

Quando habilitamos RTTI para nossa classe com a diretiva {$M+} ou {$TYPEINFO ON} estamos
efetivamente ordenando ao compilador que gere informaes a respeito dos membros publicados
como vimos anteriormente. No caso de mtodos, a gerao destas informaes limitada, por isso
usamos o $METHODINFO para que o compilador gere informaes mais detalhadas dos mtodos
publicados, como seus parmetros, por exemplo. Use-o com parcimnia, pois seu uso aumenta
consideravelmente o tamanho do executvel.

Implementaes das classes TCliente e TEndereo:

i mpl ement at i on


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 77
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

77 Reflexo
const r uct or TCl i ent e. Cr eat e;
begi n
i nher i t ed;
FEnder eco : = TEnder eco. Cr eat e;
FEnder eco. Logr adour o : = ' Av. Ri o Br anco' ;
FEnder eco. Numer o : = 26;
FEnder eco. Compl ement o: = ' sl 801' ;
FEnder eco. Bai r r o : = ' Cent r o' ;
FNome : = ' Adi l son' ;
FSobr eNome: = ' J r ' ;
end;

f unct i on TCl i ent e. NomeCompl et o: st r i ng;
begi n
r esul t : = FNome + ' ' + FSobr eNome
end;

pr ocedur e TCl i ent e. set _Ender eco( const Val ue: TEnder eco) ;
begi n
FEnder eco : = Val ue;
end;

pr ocedur e TCl i ent e. set _Nome( const Val ue: st r i ng) ;
begi n
FNome : = Val ue;
end;

pr ocedur e TCl i ent e. set _Sobr eNome( const Val ue: st r i ng) ;
begi n
FSobr eNome : = Val ue;
end;

pr ocedur e TEnder eco. set _Bai r r o( const Val ue: st r i ng) ;
begi n
FBai r r o : = Val ue;
end;

pr ocedur e TEnder eco. set _Compl ement o( const Val ue: st r i ng) ;
begi n
FCompl ement o : = Val ue;
end;

pr ocedur e TEnder eco. set _Logr adour o( const Val ue: st r i ng) ;
begi n
FLogr adour o : = Val ue;
end;

pr ocedur e TEnder eco. set _Numer o( const Val ue: i nt eger ) ;
begi n
FNumer o : = Val ue;
end;






Agora na seo Private do formulrio declare o mtodo GenerateNodes como baixo:


pr i vat e

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 78
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

78 Reflexo
pr ocedur e Gener at eNodes( Obj : TObj ect ; Node: TTr eeNode) ;



O mtodo GenerateNodes ir gerar os ns de acordo com a instncia de um objeto passado.

Para usarmos os recursos do RTTI deveremos adiciona ao uses as units TypInfo e ObjAuto;


i mpl ement at i on
uses TypI nf o, Obj Aut o;


Implementao do mtodo GenerateNodes:


pr ocedur e TFor m31. Gener at eNodes( Obj : TObj ect ; Node: TTr eeNode) ;
var
i : byt e;
I nt er nal Node1, I nt er nal Node2, I nt er nal Node3: TTr eeNode;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pr opLi st : PPr opLi st ;
Pr opLi st Count : byt e;
/ / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Met hodI nf o: Poi nt er ;
Met hodLi st Count : byt e;
Met hod: PMet hodI nf oHeader ;
begi n
i f Assi gned( Node) t hen
I nt er nal Node1 : = Node
el se
I nt er nal Node1 : = Tr eeVi ew1. I t ems. Add( ni l , Obj . Cl assName) ;

/ / Pr opr i edades
I nt er nal Node2 : = Tr eeVi ew1. I t ems. AddChi l d( I nt er nal Node1, ' Pr opr i edades' ) ;
Pr opLi st Count : = Get Pr opLi st ( Obj , Pr opLi st ) ;
f or i : = 0 t o Pr ed( Pr opLi st Count ) do
begi n
I nt er nal Node3 : = Tr eeVi ew1. I t ems. AddChi l d( I nt er nal Node2, Pr opLi st [ i ] . Name) ;
i f Pr opType( Obj , Pr opLi st [ i ] . Name) = t kCl ass t hen
Gener at eNodes( Get Obj ect Pr op( Obj , Pr opLi st [ i ] . Name) , I nt er nal Node3) ;
end;

/ / Mt odos
I nt er nal Node2 : = Tr eeVi ew1. I t ems. AddChi l d( I nt er nal Node1, ' Mt odos' ) ;
Met hodI nf o : = PPoi nt er ( I nt eger ( PPoi nt er ( Obj ) ^) + vmt Met hodTabl e) ^;
i f Met hodI nf o <> ni l t hen
begi n
Met hodLi st Count : = PWor d( Met hodI nf o) ^;
I nc( I nt eger ( Met hodI nf o) , 2) ;
met hod : = Met hodI nf o;
f or i : = 0 t o Pr ed( Met hodLi st Count ) do
begi n
Tr eeVi ew1. I t ems. AddChi l d( I nt er nal Node2, Met hod. Name) ;
I nc( i nt eger ( Met hod) , PMet hodI nf oHeader ( Met hod) ^. Len) ;
end;
end;
end;



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 79
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

79 Reflexo
Observe que no momento em que percorro a lista de propriedades, tambm verifico se a mesma
do tipo tkClass, ou seja, se a propriedade faz referncia a um objeto, com isso realizo uma chamada
recursiva a GenerateNodes para que seja tambm extrado os membros deste objeto.


i f Pr opType( Obj , Pr opLi st [ i ] . Name) = t kCl ass t hen
Gener at eNodes( Get Obj ect Pr op( Obj , Pr opLi st [ i ] . Name) , I nt er nal Node3) ;


No trecho onde realizada a extrao dos mtodos, usei a constante vmtMethodTable, pois toda
classe no Delphi armazenada em um ponteiro de 32bits e sua estrutura interna lembra muito um
record. Os primeiros 4 bytes de qualquer objeto um ponteiro pra Virtual Method Table, com isso,
usei esta instruo pra obter esta referncia:

Met hodI nf o : = PPoi nt er ( I nt eger ( PPoi nt er ( Obj ) ^) + vmt Met hodTabl e) ^;

Depois avano na lista de ponteiros pra mtodos, incrementando o ponteiro atual do seu tamanho:

I nc( i nt eger ( Met hod) , PMet hodI nf oHeader ( Met hod) ^. Len


No evento OnClick do boto btnCriar, a chamada ao GenerateNodes, passando a instncia da classe
TCliente.


pr ocedur e TFor m31. bt nCr i ar Cl i ck( Sender : TObj ect ) ;
begi n
Gener at eNodes( TCl i ent e. Cr eat e, ni l ) ;
end;







___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 80
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

80 Reflexo


E claro, no caso de um duplo clique em um n que representa um mtodo, execut-lo:


pr ocedur e TFor m31. Tr eeVi ew1Dbl Cl i ck( Sender : TObj ect ) ;
var
st r NomeCompl et o: st r i ng;
Met hod: PMet hodI nf oHeader ;
Obj : TObj ect ;
begi n
Obj : = TCl i ent e. Cr eat e;
Met hod : = Get Met hodI nf o( TCl i ent e. Cr eat e, Tr eeVi ew1. Sel ect ed. Text ) ;
st r NomeCompl et o : = Obj ect I nvoke( Obj , Met hod, [ ] , [ ] ) ;
ShowMessage( st r NomeCompl et o) ;
end;



Observe que primeiramente obtive o ponteiro para o mtodo:


Met hod : = Get Met hodI nf o( TCl i ent e. Cr eat e, Tr eeVi ew1. Sel ect ed. Text ) ;


De posse deste endereo, o mtodo ObjectInvoke executa o mtodo armazenado no endereo,
passando parmetros caso necessrio. O ObjectInvoke retorna um Variant com o valor resultante
de funes.

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 81
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

81 Reflexo





Reflection.NET


Para usarmos reflexo no Delphi .NET necessrio adicionar o namespace System.Reflection.
Este namespace possui uma classe chamada Type, que a base da reflexo na framework.
Atravs desta possvel obter mtodos, campos, propriedades e eventos de um objeto.

Como Type para o Delphi palavra reservada, vamos usar o & para sinalizar que iremos usar o
literal da palavra.

Ento vamos ao exemplo pratico. Crie uma nova aplicao Windows Forms:


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 82
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

82 Reflexo



Adicione uma TreeView onde como no exemplo anterior, extrair do objeto da classe TCliente, seus
membros publicados.

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 83
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

83 Reflexo
Adicione uma unit ao projeto e a chame de uClasses.pas. Declare as classes TEndereco e TCliente
como abaixo:

t ype
TEnder eco = cl ass
pr i vat e
FLogr adour o: Syst em. &st r i ng;
FBai r r o: Syst em. &st r i ng;
FNumer o: i nt eger ;
FCompl ement o: Syst em. &st r i ng;
pr ocedur e set _Bai r r o( const Val ue: Syst em. &st r i ng) ;
pr ocedur e set _Compl ement o( const Val ue: Syst em. &st r i ng) ;
pr ocedur e set _Logr adour o( const Val ue: Syst em. &st r i ng) ;
pr ocedur e set _Numer o( const Val ue: i nt eger ) ;
publ i shed
pr oper t y Logr adour o: Syst em. &st r i ng r ead FLogr adour o wr i t e set _Logr adour o;
pr oper t y Numer o: i nt eger r ead FNumer o wr i t e set _Numer o;
pr oper t y Compl ement o: Syst em. &st r i ng r ead FCompl ement o wr i t e
set _Compl ement o;
pr oper t y Bai r r o: Syst em. &st r i ng r ead FBai r r o wr i t e set _Bai r r o;
end;

TCl i ent e = cl ass
pr i vat e
FSobr eNome: Syst em. &st r i ng;
FNome: Syst em. &st r i ng;
FEnder eco: TEnder eco;
pr ocedur e set _Nome( const Val ue: Syst em. &st r i ng) ;
pr ocedur e set _Sobr eNome( const Val ue: Syst em. &st r i ng) ;
publ i c
f unct i on NomeCompl et o: Syst em. &st r i ng;
pr ocedur e set _Ender eco( const Val ue: TEnder eco) ;
const r uct or Cr eat e; vi r t ual ;
publ i shed
pr oper t y Nome: Syst em. &st r i ng r ead FNome wr i t e set _Nome;
pr oper t y Sobr eNome: Syst em. &st r i ng r ead FSobr eNome wr i t e set _Sobr eNome;
pr oper t y Ender eco: TEnder eco r ead FEnder eco wr i t e set _Ender eco;
end;



Observe que no foi necessrio adicionar nenhuma diretiva, a reflexo no .NET nativa.

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 84
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

84 Reflexo
Implementao dos mtodos das classes TCliente e TEndereo:


const r uct or TCl i ent e. Cr eat e;
begi n
i nher i t ed;
FEnder eco : = TEnder eco. Cr eat e;
FEnder eco. Logr adour o : = ' Av. Ri o Br anco' ;
FEnder eco. Numer o : = 26;
FEnder eco. Compl ement o: = ' sl 801' ;
FEnder eco. Bai r r o : = ' Cent r o' ;
FNome : = ' Adi l son' ;
FSobr eNome: = ' J r ' ;
end;

f unct i on TCl i ent e. NomeCompl et o: Syst em. &st r i ng;
begi n
r esul t : = FNome + ' ' + FSobr eNome;
end;

pr ocedur e TCl i ent e. set _Ender eco( const Val ue: TEnder eco) ;
begi n
FEnder eco : = Val ue;
end;

pr ocedur e TCl i ent e. set _Nome( const Val ue: Syst em. &st r i ng) ;
begi n
FNome : = Val ue;
end;

pr ocedur e TCl i ent e. set _Sobr eNome( const Val ue: Syst em. &st r i ng) ;
begi n
FSobr eNome : = Val ue;
end;

pr ocedur e TEnder eco. set _Bai r r o( const Val ue: Syst em. &st r i ng) ;
begi n
FBai r r o : = Val ue;
end;

pr ocedur e TEnder eco. set _Compl ement o( const Val ue: Syst em. &st r i ng) ;
begi n
FCompl ement o : = Val ue;
end;

pr ocedur e TEnder eco. set _Logr adour o( const Val ue: Syst em. &st r i ng) ;
begi n
FLogr adour o : = Val ue;
end;

pr ocedur e TEnder eco. set _Numer o( const Val ue: i nt eger ) ;
begi n
FNumer o : = Val ue;
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 85
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

85 Reflexo
Agora no WinForm, adicione na seo private o mtodo que ir gerar os ns da nossa TreeView
Reflaction:


pr i vat e
pr ocedur e Gener at eNodes( Obj : &Obj ect ; Node: Tr eeNode) ;


Adicione o namespace System.Reflection e declare as variveis que iram receber as informaes da
instncia:


uses uCl asses, Syst em. Ref l ect i on;

var
Member s: Syst em. Type;
Fi el d: Fi el dI nf o;
I nt er nal Node: Tr eeNode;
Met hod: Met hodI nf o;
Pr op: Pr oper t yI nf o;
ACl i ent e: TCl i ent e;



Agora a implementao do mtodo GenerateNodes:


pr ocedur e TWi nFor m3. Gener at eNodes( Obj : &Obj ect ; Node: Tr eeNode) ;
begi n
Member s : = Obj . Get Type;
i f Assi gned( Node) t hen
I nt er nal Node : = Node
el se
I nt er nal Node : = Tr eeVi ew1. Nodes. Add( Obj . Cl assName) ;

wi t h I nt er nal Node. Nodes. Add( ' Campos' ) do
f or Fi el d i n Member s. Get Fi el ds do
Nodes. Add( Fi el d. Name) ;
wi t h I nt er nal Node. Nodes. Add( ' Mt odos' ) do
f or Met hod i n Member s. Get Met hods do
Nodes. Add( Met hod. Name) ;
wi t h I nt er nal Node. Nodes. Add( ' Pr opr i edades' ) do
f or Pr op i n Member s. Get Pr oper t i es do
i f Pr op. Pr oper t yType = TypeI nf o( TEnder eco) t hen
Gener at eNodes( Pr op. Get Val ue( ACl i ent e, [ ] ) , Nodes. Add( Pr op. Name) )
el se
Nodes. Add( Pr op. Name) ;
end;


Observe que precisamos de menos instrues que no Win32 para realizar a mesma tarefa. E mais
uma vez, uso de recursividade quando encontro uma propriedade que seja referncia a um objeto,
de forma a criar uma sub-rvore de membros deste objeto.
Implementao do boto Criar:

pr ocedur e TWi nFor m3. But t on1_Cl i ck( sender : Syst em. Obj ect ; e: Syst em. Event Ar gs) ;
begi n
ACl i ent e : = TCl i ent e. Cr eat e;
Gener at eNodes( ACl i ent e, ni l ) ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 86
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

86 Reflexo
end;


No evento DoubleClick, codifique como abaixo:


pr ocedur e TWi nFor m3. Tr eeVi ew1_Doubl eCl i ck( sender : Syst em. Obj ect ; e:
Syst em. Event Ar gs) ;
begi n
MessageBox. Show(
ACl i ent e. Get Type. Get Met hod
( Tr eeVi ew1. Sel ect edNode. Text ) . I nvoke( ACl i ent e, [ ] ) . ToSt r i ng) ;
end;


Isto far com que seja executado o mtodo que sofreu o evento na TreeView.
























___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 87
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

87 Object Persistence Framework - OPF
Object Persistence Framework - OPF

Object Persistence Framework, ou OPFs so arquiteturas OO que fornecem um mecanismo
eficiente para armazenamento de objetos em disco, seja em um arquivo ou em banco de dados.

OPFs so um alternativa as camadas de persistncia DAO, de forma a automatizar o processo de
persistncia, agregrando produtividade e robustez.

Existem algumas solues disponveis no mercado:


DePODelphiPersistentObjects(Win32)

Delphi Persistent Objects encapsula todo o comportamento necessrio para se comunicar com
fontes de dados. DePO utiliza um esquema de mapeamento para determinar que campos e tabelas
da fonte de dados sero mapeados para as propriedades dos objetos. O que significa que campos e
tabelas sero utilizados para persistir dados dos objetos, e sero utilizados para popular as
propriedades dos objetos recuperados das fontes de dados.

DePO foi implementado com base no modelo apresentado por Scott Ambler no documento "The
Design of a Robust Persistent Layer for relational Databases" disponvel junto com outros
documentos relacionados em http://www.ambysoft.com.

InstalandooDePO

Faa o download do DePO atravs do link http://sourceforge.net/projects/depo.

1) Descompacte o arquivo DePO031.zip.

2) Abra o pacote Depo.dpk no Delphi

3) Clique em Compile

4) Clique em Install

5) Os componentes estaro na paleta DePO

6) Para compilar projetos com DePO inclua o diretrio onde descompactou os arquivos no menu
Tools | Options | Environment Options | Delphi Options | Library Win32, Library Path.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 88
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

88 Object Persistence Framework - OPF
Exemplo DePO no Delphi 2006





t ype
{$M+}
TCl i ent e = cl ass
pr i vat e
FEmai l : st r i ng;
FNome: st r i ng;
FOI D: i nt eger ;
pr ocedur e Set Emai l ( const Val ue: st r i ng) ;
pr ocedur e Set Nome( const Val ue: st r i ng) ;
pr ocedur e Set OI D( const Val ue: i nt eger ) ;
publ i shed
pr oper t y OI D: i nt eger r ead FOI D wr i t e Set OI D;
pr oper t y Nome: st r i ng r ead FNome wr i t e Set Nome;
pr oper t y Emai l : st r i ng r ead FEmai l wr i t e Set Emai l ;
end;
{$M- }

i mpl ement at i on

pr ocedur e TCl i ent e. Set Emai l ( const Val ue: st r i ng) ;
begi n
FEmai l : = Val ue;
end;

pr ocedur e TCl i ent e. Set Nome( const Val ue: st r i ng) ;
begi n
FNome : = Val ue;
end;

pr ocedur e TCl i ent e. Set OI D( const Val ue: i nt eger ) ;
begi n
FOI D : = Val ue;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 89
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

89 Object Persistence Framework - OPF
end.





pr ocedur e TDM. Dat aModul eCr eat e( Sender : TObj ect ) ;
begi n
ADOConnect i on1. Connect i onSt r i ng : =
For mat ( ' Pr ovi der =Mi cr osof t . J et . OLEDB. 4. 0; Dat a Sour ce=%s\ DePO. mdb; Per si st
Secur i t y I nf o=Fal se' , [ Ext r act Fi l ePat h( Appl i cat i on. ExeName) ] ) ;
ADOConnect i on1. Connect ed : = Tr ue;

wi t h dpoDBMappi ngManager 1. Cl asses. Add do
begi n
Cl assObj ect : = TCl i ent e;
St or ageName : = ' Cl i ent e' ;
wi t h At t r i but esMappi ng. Add do
begi n
At t r i but eName : = ' OI D' ;
Col umnName : = ' I D' ;
Si ze : = 0;
I ndexType : = i dxNone;
I sOI D : = Tr ue;
end;
wi t h At t r i but esMappi ng. Add do
begi n
At t r i but eName : = ' Nome' ;
Col umnName : = ' Nome' ;
Si ze : = 50;
I ndexType : = i dxNone;
I sOI D : = Fal se;
end;
wi t h At t r i but esMappi ng. Add do
begi n
At t r i but eName : = ' Emai l ' ;
Col umnName : = ' Emai l ' ;
Si ze : = 30;
I ndexType : = i dxNone;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 90
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

90 Object Persistence Framework - OPF
I sOI D : = Fal se;
end;
end;
end;


pr ocedur e TFor m33. bt nSal var Cl i ck( Sender : TObj ect ) ;
var
ACl i ent e: TCl i ent e;
i : byt e;
begi n
t r y
ACl i ent e : = TCl i ent e. Cr eat e;
ACl i ent e. Nome : = edt Nome. Text ;
ACl i ent e. Emai l : = edt Emai l . Text ;
DM. dpoADOMechani sm1. SaveObj ect ( ACl i ent e) ;
f or i : = 0 t o Pr ed( Cont r ol Count ) do
i f Cont r ol s[ i ] i s TEdi t t hen
TEdi t ( Cont r ol s[ i ] ) . Cl ear ;
f i nal l y
Fr eeAndNi l ( ACl i ent e) ;
end;
end;



ECOEnterpriseCoreObjects(.NET)

O projeto ECO - Enterprise Core Objects da CodeGear, foi uma evoluo natural da tecnologia
Bold (Delphi Win32) para o mundo .NET. Longe de profecias, mas, acredito que a mdio prazo os
esforos no desenvolvimento, mais precisamente na codificao, ser reduzida devido a tecnologias
MDA e UML.

A principal misso do ECO como tecnologia , aplicar o conceito, o modelo MDA de forma a
abstrair banco de dados relacionais, aumentando significativamente a produtividade reduzindo a
codificao.

Se tratando de projetos ECO, h diferenas significativas entre Windows Forms e ASP.NET,
conforme o os itens abaixo:

Em aplicaes ASP.NET no h CurrencyManagerHandler como em Windows Forms, no
entanto, temos o recurso dos ExternalIDs.

Os AutoForms um poderoso instrumento de operacionalizao do modelo.

Vrios EcoSpaces atravs de pooling.

com isso, o uso PersistenceMapperSharer necessrio.


O EcoSpaceProvider

Aplicaes ASP.NET esto suscetveis a mltiplas requisies, cada requisio precisa ter sua
prpria instncia do EcoSpace.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 91
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

91 Object Persistence Framework - OPF
Iria demandar muito recurso de processamento e memria para criar uma instncia do EcoSpace
para cada request. Para minimizar esse impacto o ECO usa um pool de EcoSpaces.

O EcoSpaceProvider pode ser usado por qualquer pgina em uma aplicao ASP.NET para obter
uma instncia de um EcoSpace do pool, assim como retorn-lo ao pool com modificaes ou no.

Existem trs opes de uso do pool de EcoSpaces, Always , IfDirty e Never.

Never

Nunca armazena o EcoSpace na sesso, invs
disso, retorna-o ao pool, perdendo todas as
modificaes no salvas (stateless).

Always

Mantm um EcoSpace na sesso, retornando-
o ao pool ao expirar a sesso.

IfDirty Mantm o EcoSpace na sesso se houver
objetos sujos.



uni t EcoSpacePr ovi der ;
. . .
const
/ / ToDo: Conf i gur e t he st r at egy f or t he pr ovi der by changi ng t he const ant
MODE: EcoSpaceSt r at egyHandl er . Sessi onSt at eMode =
EcoSpaceSt r at egyHandl er . Sessi onSt at eMode. I f Di r t y;
. . .




Configurao do Pooling de EcoSpaces

possvel configurar o nmero mximo de EcoSpaces e o tempo de permanncia no pool:


<appSet t i ngs>
<add key = " Bor l and. Eco. Web. MaxPool " val ue = " 0" / >
<add key = " Bor l and. Eco. Web. MaxAge" val ue = " 600" / >
</ appSet t i ngs>


Observe que valor para o MaxPool 0, isto significa que o pooling no est habilitado, com isso,
toda requisio criar sua prpria instncia do EcoSpace.

A razo do pooling est desligado por default porque ele s trabalha corretamente se usar um
PersistenceMapperProvider e um PersistenceMapperBDP, que veremos a seguir.


Sincronizao

O PersistenceMapperProvider mantm uma nica instncia de um PersistenceMapper, que pode ser
usado por mliplos EcoSpaces.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 92
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

92 Object Persistence Framework - OPF
Conecta os EcoSpaces ao PersistenceMapper. Veja o esquema abaixo:






Ento vamos prtica:

Em File | New | Other, Delphi for .NET Projects, ECO ASP.NET Web Application:




Entendendo algumas estruturas bsicas


O Model View

Usando o Model View possvel navegar no projeto baseado nos relacionamentos lgicos entre as
classes e outros elementos no cdigo fonte. O LiveSource verifica o cdigo fonte e deriva seus
elementos como namespaces e classes e o relacionamento entre eles.

ECO UML packages aparecem sob o n raiz do projeto no Model View (voc pode tambm aninhar
pacotes dentro de outros pacotes). O nome default de um novo ECO UML package Package_N
onde N um inteiro. No Model View, um n ECO UML package (e todos os ECO UML packages
debaixo dele) distiguido de um namespace .NET por um cone. Este cone representa um ECO
UML package.


P Pe e
r rs si i
s st t
e en n
c ce e
ECO
PMa
pper
Syn
chro
nizer
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi

II
S
A
S
P.
N
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi
ECO-Space
E
C
O

F
r
a
m
e
w
o
r
k
or der = t r ue; or der = t r ue; or der = t r ue;
Model: Model:
UML & OCL UML & OCL
Logic: C# / Delphi Logic: C# / Delphi

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 93
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

93 Object Persistence Framework - OPF



O uso de menus de contexto no ECO e TogetherLiveSource esto disponveis no Model View e
sobre os diagramas. Os menus so sensveis ao contexto, ou seja, eles refletem somente aquelas
operaes vlidas sob o elemento selecionado. Por exemplo, se voc pressionar o boto direito
sobre uma classe no Model View ou no diagrama, o menu de contexto exibir escolhas para
adicionar atributos e mtodos. Estes itens no sero exibidos no caso de um ECO UML package, o
menu para um pacote contm seu prprio conjunto de opes.



Uma vez que se tenha criado um diagrama no Model View, voc pode tambm adicionar elementos
arrastando da Tool Palette.



Voc pode configurar propriedades de qualquer elemento, selecionando-o e editando sua
propriedade no Object Inspector.



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 94
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

94 Object Persistence Framework - OPF
Object Inspector Model View


Voc pode selecionar o elemento no Model View, ou no diagrama. A medida em que voc trabalha
com elementos no Model View, diagramas e Object Inspector, a IDE gera o cdigo-fonte de
implementao do modelo.

Bom, agora com estas informaes poderemos construir nosso modelo. Abra o diagrama primrio
Package_1 e determine as seguintes classes:



Diagrama de Classes


Use a Tool Palette para adicionar classes determinar generalizaes e associaes.
Uma vez concludo o diagrama, faa um build do projeto (Shift+F9) para a gerao/concluso do
cdigo necessrio a execuo do modelo.

Para a persistncia, vamos utilizar o Borland Interbase. Abra o IBConsole e crie um banco
chamado ECODB.gdb, veja:


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 95
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

95 Object Persistence Framework - OPF

Criao do banco de dados ECODB no Interbase.


Aps a criao do banco de dados, necessrio configurar o PersistenceMapperProvider com os
componentes de mapeamento e conexo ao banco.

Na Tool Palette, selecione um PersistenceMapperBDP e um BdpConnection:




O PersistenceMapperProvider com
os componentes
PersistenceMapperBdp e
BdpConnection.
Configurao de conexo ao banco de
dados (Boto direito no BdpConnection,
Connection Editor)



O PersistenceMapperBDP dever ser configurado de forma a determinar que dialeto ser usado na
criao das tabelas no banco de dados:



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 96
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

96 Object Persistence Framework - OPF

Ao pousar o mouse sobre o
PersistenceMapperBdp e exibida um
checklist de configuraes.
Com o direito do mouse sobre o
PersistenceMapperBdp, as alternativas de
dialeto para a gerao das entidades do banco
De acordo com a ordem em que adicionou os componentes no designer do
PersistenceMapperProvider, as propriedades PersistenceMapper do PersistenceMapperProvider
apontar para o PersistenceMapperBdp1, assim como a propriedade Connection do
PersistenceMapperBdp1 que aponta para o BdpConnection1.

Agora precisamos informar ao PersistenceMapperProvider qual EcoSpace ter seus objetos
persistidos. Aponte a propriedade EcoSpaceType para o EcoSpace desejado, no nosso caso o
ExemploEco3AspNetEcoSpace.TExemploEco3AspNetEcoSpace. Isto tudo informa ao
PersistenceMapperProvider que todos os objetos manipulados no EcoSpace selecionado sero
persistidos usando o Borland Data Provider e o banco Interbase.

Verifique se todas as propriedades esto devidamente configuradas, faa um build (Shift+F9) e
execute a gerao automtica das tabelas utilizando a barra de funes no canto inferior direito do
PersistenceMapperProvider, como na imagem abaixo:







Dilogo de gerao de tabelas. Tabelas criadas no Interbase.



O dilogo Generate Schema ser apresentado, exibindo as tabelas que sero criadas. Pressione o
boto OK para executar o procedimento.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 97
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

97 Object Persistence Framework - OPF


No painel Messages sinalizado o sucesso
na gerao do schema.














Uma vez que o modelo esteja pronto e as tabelas geradas, vamos criar a interface visual para os
objetos do EcoSpace. Insira ao WebForm1 um ExpressionHandle e uma DataGrid. Renomeie o
ExpressionHandle para ehTurma.



Interface: WebForm1.aspx com rhRoot, ehTurma e DataGrid.


O componente rhRoot estabelece um contexto inicial para a pgina, ou seja, realiza a conexo
entre o componentes visuais e o EcoSpace.



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 98
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

98 Object Persistence Framework - OPF

Configurao do EcoSpaceType do rhRoot.

Configure a propriedade Expression do ehTurma conforme abaixo:


Expresso OCL para ehTurma. Turma.allInstances indica que todas as instncias do objeto ser
obtida. Fazendo uma analogia, semelhante a uma expresso SQL como SELECT * FROM
TABELA.


Com o boto direito no ehTurma, acione a opo Create Default Columns. Isto far com que seja
preenchida a propriedade Columns do ehTurma.



Isto extremamente til para personalizao das informaes que sero exibidas. Modifique a
expresso do membro Instrutor de self.Instrutor para self.Instrutor.Nome e Nested para
false.

Modifique a expresso do membro Treinamento de self.Treinamento para
self.Treinamento.Descricao e Nested para false.


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 99
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

99 Object Persistence Framework - OPF


Configure as propriedades AddExternalId para True, que far com que o ExpressionHandle
obtenha o ID dos objetos e AddDefaultProprerties para false.






Na DataGrid, informe a propriedade DataSource para ehTurma e DataKeyField para ExternalID.
Desta forma poderemos usar o ExternalID como parmetros, como por exemplo, em
HyperLinkColumns.



Configurao das
propriedades DataKeyfField
e DataSource.
A DataGrid.


No Property Builder da DataGrid, remova a coluna ExternalID, pois no vai nos interessar exibi-la.




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 100
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

100 Object Persistence Framework - OPF
claro, um pouco de designer com AutoFormat .




Enfim, vamos adicionar um boto Adicionar Turma ao WebForm1:



Implementao do boto:

var
t : Tur ma;
begi n
t : = Tur ma. Cr eat e( EcoSpace) ;
t . Dat a : = Dat eTi me. Now;
t . Hor ar i o : = Dat eTi me. Now;
t . Descr i cao : = ' ASP. NET ECO I I I Rocks ! ! ! ' ;
Updat eDat abase;
Dat aBi nd;
end;

Execuo no browser:




Vamos adicionar a DataGrid um boto para excluso de objetos. Acesse o Property Builder e
insira um Button Column e configure conforme abaixo:



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 101
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

101 Object Persistence Framework - OPF



O fato de informar Delete ao campo Command Name far com que o evento DeleteCommand
da DataGrid seja invocado caso este boto seja acionado.

Neste evento vamos determinar o cdigo que ir excluir o objeto do EcoSpace e do banco de dados.

pr ocedur e TWebFor m1. Dat aGr i d1_Del et eCommand( sour ce: Syst em. Obj ect ; e:
Syst em. Web. UI . WebCont r ol s. Dat aGr i dCommandEvent Ar gs) ;
begi n
Obj ect For I d( Dat aGr i d1. Dat aKeys[ e. I t em. I t emI ndex] . ToSt r i ng) . Del et e;
Updat eDat abase;
Dat aBi nd;
end;


Utility Methods

Todo WebForm de um projeto ECO trs alguns mtodos implementados chamados de Utility
Method. Estes mtodos tornam o trabalho de referenciar objetos mais fcil e prtico. No cdigo
acima usamos o ObjectForID, que retorna um objeto com base em seu ID. Este mecanismo se faz
necessrio devido a projetos ECO/ASP.NET no possurem CurrencyManagerHandlers. Usamos a
propriedade DataKeys da DataGrid que nos informa o valor do ExternalID para o objeto em
questo em e.Item.ItemIndex.



Execuo no browser.


Nesta estapa, vamos colocar um HyperLinkColumn na DataGrid que ir exibir em outra pgina
(Alunos.aspx) os alunos da turma.



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 102
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

102 Object Persistence Framework - OPF



Renomeie a pgina de Webform2.aspx para Alunos.aspx:



Agora insira os componentes, Textboxes, Button e DataGrid como disposto abaixo:




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 103
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

103 Object Persistence Framework - OPF
O RootID

No evento Page_Load de cada WebForm existe uma implementao que verifica o valor de um
parmetro chamado RootID. Uma vez que este parmetro contenha um valor de um ExternalID,
o ObjectForId utilizado para obter a instncia do objeto correspondente, associando este resultado
ao rhRootId. Esta implementao torna fcil a transio de objetos entre pginas.


pr ocedur e TWebFor m2. Page_Load( sender : Syst em. Obj ect ; e: Syst em. Event Ar gs) ;
var
I d: st r i ng;
begi n
EcoSpace. Act i ve : = Tr ue;
I d : = Request . Par ams[ ' Root I d' ] ;
i f Assi gned( I d) and ( I d <> ' ' ) t hen
r hRoot . Set El ement ( Obj ect For I d( I d) ) ;
i f not I sPost Back t hen
Dat aBi nd;
/ / TODO: Put user code t o i ni t i al i ze t he page her e
end;


O componente rhRoot dever absorver as seguintes configuraes:

EcoSpaceType = Exempl oEco3AspNet EcoSpace. TExempl oEco3AspNet EcoSpace;
St at i cVal ueTypeName = Tur ma;

Para os TextBoxes da Turma, dever ser configurada a propriedade DataBindings que apontar
para para o rhRoot como na figura abaixo:




Isto far com que os dados da turma sejam exibidos nos Textboxes ao carregar a pgina, veja:



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 104
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

104 Object Persistence Framework - OPF




Agora, vamos adicionar um componente ExpressionHandle que ter a expresso OCL para retornar
a coleo de alunos:

Nome = ehAl uno;
Root Handl e = r hRoot ;
Expr essi on = sel f . Al unos;

Conecte a propriedade DataSource da DataGrid ao ehAluno.



Finalmente, implementar o boto Adicionar. Identifiquei os TextBoxes como tbxNome e
tbxEmail:

var
a: Al uno;
begi n
a : = Al uno. Cr eat e( EcoSpace) ;
a. Nome : = t bxNome. Text ;
a. Emai l : = t bxEmai l . Text ;
( r hRoot . El ement . AsObj ect as Tur ma) . Al unos. Add( a) ;
Updat eDat abase;
Dat aBi nd;
end;














___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 105
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

105 Object Persistence Framework - OPF



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 106
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

106 Colocando Tudo Junto
Colocando Tudo Junto

Neste projeto iremos por em prtico todo o conhecimento visto nos captulos deste material.
Usaremos a framework de persistncia da TDS, o Baltazar Object Data Service, por isso, toda
classe no nosso modelo dever herdar de TObjectDataService;

OModel
Nosso modelo ter as classes TCliente, TTelefone e TFuncionario.




TTelefone

t ype
TTel ef one = cl ass( TObj ect Dat aSer vi ce)
pr i vat e
FDDD: byt e;
FCl i ent e: TCl i ent e;
FNumer o: st r i ng;
FRamal : i nt eger ;
pr ocedur e Set Cl i ent e( const Val ue: TCl i ent e) ;
pr ocedur e Set DDD( const Val ue: byt e) ;
pr ocedur e Set Numer o( const Val ue: st r i ng) ;
pr ocedur e Set Ramal ( const Val ue: i nt eger ) ;
publ i c
const r uct or Cr eat e; over r i de;
publ i shed
pr oper t y Cl i ent e: TCl i ent e r ead FCl i ent e wr i t e Set Cl i ent e; / / t r ansi ent e
pr oper t y DDD: byt e r ead FDDD wr i t e Set DDD;
pr oper t y Numer o: st r i ng r ead FNumer o wr i t e Set Numer o;
pr oper t y Ramal : i nt eger r ead FRamal wr i t e Set Ramal ;
TObjectDataSer vice
att r ibutes
* Email: string
* Nome: string
* Telefones: IODSCollectionObject
oper at ions
+Create
+GetState: IState
TClient e
att r ibutes
* Email: string
* Nome: string
TFuncionar io
att r ibutes
* Cliente: TCliente
* DDD: Byte
* Numero: string
* Ramal: Integer
oper at ions
+Create(..)
TTelefone
Cliente
0..*
1

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 107
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

107 Colocando Tudo Junto
end;

i mpl ement at i on

{ TTel ef one }

const r uct or TTel ef one. Cr eat e;
begi n
i nher i t ed;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' DDD' ;
end;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' Numer o' ;
end;
end;

pr ocedur e TTel ef one. Set Cl i ent e( const Val ue: TCl i ent e) ;
begi n
FCl i ent e : = Val ue;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' Cl i ent e' ;
Val ue : = FCl i ent e. OI D;
Rel at i on : = Tr ue;
end;
end;

pr ocedur e TTel ef one. Set DDD( const Val ue: byt e) ;
begi n
FDDD : = Val ue;
end;

pr ocedur e TTel ef one. Set Numer o( const Val ue: st r i ng) ;
begi n
FNumer o : = Val ue;
end;

pr ocedur e TTel ef one. Set Ramal ( const Val ue: i nt eger ) ;
begi n
FRamal : = Val ue;
end;

end.


TCliente

t ype
TCl i ent e = cl ass( TObj ect Dat aSer vi ce)
pr i vat e
FEmai l : st r i ng;
FTel ef ones: I ODSCol l ect i onObj ect ;
FNome: st r i ng;
FCPF: st r i ng;
FCi dade: st r i ng;
pr ocedur e Set Emai l ( const Val ue: st r i ng) ;
pr ocedur e Set Nome( const Val ue: st r i ng) ;
pr ocedur e Set Tel ef ones( const Val ue: I ODSCol l ect i onObj ect ) ;
f unct i on Get Emai l : st r i ng;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 108
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

108 Colocando Tudo Junto
f unct i on Get Nome: st r i ng;
f unct i on Get Tel ef ones: I ODSCol l ect i onObj ect ;
pr ocedur e Set Ci dade( const Val ue: st r i ng) ;
pr ocedur e Set CPF( const Val ue: st r i ng) ;
publ i c
const r uct or Cr eat e; over r i de;
f unct i on Get St at e: I St at e;
publ i shed
pr oper t y Nome: st r i ng r ead Get Nome wr i t e Set Nome;
pr oper t y Emai l : st r i ng r ead Get Emai l wr i t e Set Emai l ;
pr oper t y CPF: st r i ng r ead FCPF wr i t e Set CPF;
pr oper t y Ci dade: st r i ng r ead FCi dade wr i t e Set Ci dade;
pr oper t y Tel ef ones: I ODSCol l ect i onObj ect r ead Get Tel ef ones wr i t e
Set Tel ef ones;
end;


i mpl ement at i on

uses uMappi ngBal t azar , Tel ef one;


{ TCl i ent Model }

const r uct or TCl i ent e. Cr eat e;
begi n
i nher i t ed;
FTel ef ones : = TODSCol l ect i onObj ect . Cr eat e( TTel ef one) ;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' Nome' ;
end;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' CPF' ;
end;
end;

f unct i on TCl i ent e. Get Emai l : st r i ng;
begi n
r esul t : = FEmai l ;
end;

f unct i on TCl i ent e. Get Nome: st r i ng;
begi n
r esul t : = FNome;
end;

f unct i on TCl i ent e. Get St at e: I St at e;
begi n
r esul t : = St at e;
end;

f unct i on TCl i ent e. Get Tel ef ones: I ODSCol l ect i onObj ect ;
begi n
r esul t : = FTel ef ones;
end;

pr ocedur e TCl i ent e. Set Ci dade( const Val ue: st r i ng) ;
begi n
FCi dade : = Val ue;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 109
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

109 Colocando Tudo Junto
pr ocedur e TCl i ent e. Set CPF( const Val ue: st r i ng) ;
begi n
FCPF : = Val ue;
end;

pr ocedur e TCl i ent e. Set Emai l ( const Val ue: st r i ng) ;
begi n
FEmai l : = Val ue;
end;

pr ocedur e TCl i ent e. Set Nome( const Val ue: st r i ng) ;
begi n
FNome : = Val ue;
end;

pr ocedur e TCl i ent e. Set Tel ef ones( const Val ue: I ODSCol l ect i onObj ect ) ;
begi n
FTel ef ones : = Val ue;
end;

end.


TFuncionario

t ype
TFunci onar i o = cl ass( TObj ect Dat aSer vi ce)
pr i vat e
FNome: st r i ng;
FEmai l : st r i ng;
FCl i ent e: TCl i ent e;
f unct i on Get Emai l : st r i ng;
f unct i on Get Nome: st r i ng;
pr ocedur e Set Emai l ( const Val ue: st r i ng) ;
pr ocedur e Set Nome( const Val ue: st r i ng) ;
pr ocedur e Set Cl i ent e( const Val ue: TCl i ent e) ;
publ i c
const r uct or Cr eat e; over r i de;
publ i shed
pr oper t y Nome: st r i ng r ead Get Nome wr i t e Set Nome;
pr oper t y Emai l : st r i ng r ead Get Emai l wr i t e Set Emai l ;
pr oper t y Cl i ent e: TCl i ent e r ead FCl i ent e wr i t e Set Cl i ent e;
end;

i mpl ement at i on

const r uct or TFunci onar i o. Cr eat e;
begi n
i nher i t ed;
wi t h Pr oxyAt t r i but es. Add do
begi n
Name : = ' Nome' ;
end;
end;

f unct i on TFunci onar i o. Get Emai l : st r i ng;
begi n
r esul t : = FEmai l ;
end;

f unct i on TFunci onar i o. Get Nome: st r i ng;
begi n
r esul t : = FNome;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 110
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

110 Colocando Tudo Junto
end;

pr ocedur e TFunci onar i o. Set Cl i ent e( const Val ue: TCl i ent e) ;
begi n
FCl i ent e : = Val ue;
end;

pr ocedur e TFunci onar i o. Set Emai l ( const Val ue: st r i ng) ;
begi n
FEmai l : = Val ue;
end;

pr ocedur e TFunci onar i o. Set Nome( const Val ue: st r i ng) ;
begi n
FNome : = Val ue;
end;

end.


Controllers


ICrudController

t ype
I Cr udCont r ol l er = i nt er f ace / / Cont r ol l er par a i nt er f aces de CRUD
[ ' {8970656C- 7995- 4DBE- AB08- 2B6F8364888F}' ]
f unct i on Appl y: bool ean;
f unct i on New: bool ean;
f unct i on Del et e: bool ean;
pr ocedur e Edi t ;
pr ocedur e Sear ch;
f unct i on Fet ch( Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
f unct i on Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
pr ocedur e Show;
pr ocedur e Pr i nt ;
end;



TClienteController

t ype
TCl i ent eCont r ol l er = cl ass( TI nt er f acedObj ect , I Cr udCont r ol l er )
st r i ct pr i vat e
FModel : TCl i ent e;
FVi ew: Tf r mCl i ent e;
pr ocedur e Enabl eCont r ol s;
pr ocedur e Di sabl eCont r ol s;
pr ocedur e Cl ear Cont r ol s;
pr ocedur e ShowDat a;
pr ocedur e AddCol l ect i on( Sender : TObj ect ) ;
publ i c
const r uct or Cr eat e( Model : TCl i ent e) ;
f unct i on Appl y: Bool ean;
f unct i on New: bool ean;
f unct i on Del et e: bool ean;
pr ocedur e Edi t ;
pr ocedur e Sear ch;
pr ocedur e Show;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 111
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

111 Colocando Tudo Junto
f unct i on Fet ch( Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
f unct i on Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
pr ocedur e Pr i nt ;
end;

i mpl ement at i on

uses
St dCt r l s, uMai n, uPesqui sar , SysUt i l s, Tel ef one, Gr aphi cs, uMappi ngBal t azar ;

{ TCr udCont r ol l er }

pr ocedur e TCl i ent eCont r ol l er . AddCol l ect i on( Sender : TObj ect ) ;
var
Tel ef one: TTel ef one;
begi n
Tel ef one : = TTel ef one. Cr eat e;
Tel ef one. DDD : = St r ToI nt ( FVi ew. edt DDD. Text ) ;
Tel ef one. Numer o : = FVi ew. edt Numer o. Text ;
Tel ef one. Ramal : = St r ToI nt ( FVi ew. edt Ramal . Text ) ;
Tel ef one. Cl i ent e : = FModel ;
FModel . Tel ef ones. Add( Tel ef one) ;
end;

f unct i on TCl i ent eCont r ol l er . Appl y: Bool ean;
begi n
FModel . Nome : = FVi ew. edt Nome. Text ;
FModel . Emai l : = FVi ew. edt Emai l . Text ;
FModel . CPF : = FVi ew. edt CPF. Text ;
FModel . Ci dade: = FVi ew. edt Ci dade. Text ;
/ /
i f FModel . Appl y t hen
Di sabl eCont r ol s;
end;

pr ocedur e TCl i ent eCont r ol l er . Cl ear Cont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Cont r ol Count ) do
i f FVi ew. Cont r ol s[ i ] i s TEdi t t hen
TEdi t ( FVi ew. Cont r ol s[ i ] ) . Cl ear ;
end;

const r uct or TCl i ent eCont r ol l er . Cr eat e( Model : TCl i ent e) ;
begi n
i nher i t ed Cr eat e;
FModel : = Model ;
FVi ew : = Tf r mCl i ent e. Cr eat e( ni l ) ;
FVi ew. Par ent : = Mai n. sbxLayer ;
FVi ew. Li st Vi ew1. Li st Sour ce : = FModel . Tel ef ones;
FVi ew. bt nAdi ci onar . OnCl i ck : = AddCol l ect i on;
FVi ew. Show;
ShowDat a;
FVi ew. edt Nome. Set Focus;
end;

f unct i on TCl i ent eCont r ol l er . Del et e: bool ean;
begi n

end;

pr ocedur e TCl i ent eCont r ol l er . Di sabl eCont r ol s;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 112
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

112 Colocando Tudo Junto
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Component Count ) do
i f FVi ew. Component s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Component s[ i ] ) . Col or : = $00F0F0F0;
TEdi t ( FVi ew. Component s[ i ] ) . ReadOnl y : = Tr ue;
end;
end;

pr ocedur e TCl i ent eCont r ol l er . Edi t ;
begi n
FModel . Edi t ;
Enabl eCont r ol s;
end;

pr ocedur e TCl i ent eCont r ol l er . Enabl eCont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Component Count ) do
begi n
i f FVi ew. Component s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Component s[ i ] ) . Col or : = cl Whi t e;
TEdi t ( FVi ew. Component s[ i ] ) . ReadOnl y : = Fal se;
end;
end;
end;

f unct i on TCl i ent eCont r ol l er . Fet ch( Obj Dat a: TObj ect Dat aSer vi ce) :
I ODSCol l ect i onObj ect ;
begi n
r esul t : = FModel . Fet ch( Obj Dat a) ;
end;

f unct i on TCl i ent eCont r ol l er . Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
begi n
r esul t : = FModel . Fet chByI d( OI D) as TCl i ent e;
end;

f unct i on TCl i ent eCont r ol l er . New: bool ean;
begi n
Enabl eCont r ol s;
Cl ear Cont r ol s;
FModel : = TCl i ent e. Cr eat e;
FVi ew. Li st Vi ew1. Li st Sour ce : = FModel . Tel ef ones;
FVi ew. edt Nome. Set Focus;
end;

pr ocedur e TCl i ent eCont r ol l er . Pr i nt ;
begi n
Mappi ngBal t azar . odsCl i ent es. Obj ect Dat aSer vi ce : = FModel ;
Mappi ngBal t azar . odsTel ef ones. Li st Sour ce : = FModel . Tel ef ones;
Mappi ngBal t azar . RvPr oj ect 1. Execut eRepor t ( ' Repor t 1' ) ;
end;

pr ocedur e TCl i ent eCont r ol l er . Sear ch;
begi n
f r mPesqui sar : = Tf r mPesqui sar . Cr eat e( ni l , FModel ) ;
FModel : = f r mPesqui sar . ShowModal as TCl i ent e;
ShowDat a;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 113
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

113 Colocando Tudo Junto
end;

pr ocedur e TCl i ent eCont r ol l er . Show;
begi n
FVi ew. Show;
end;

pr ocedur e TCl i ent eCont r ol l er . ShowDat a;
begi n
wi t h FVi ew do
begi n
edt Nome. Text : = FModel . Nome;
edt Emai l . Text : = FModel . Emai l ;
edt CPF. Text : = FModel . CPF;
edt Ci dade. Text : = FModel . Ci dade;
Li st Vi ew1. Li st Sour ce : = FModel . Tel ef ones;
end;
Di sabl eCont r ol s;
end;

end.


TFuncionarioController

t ype
TFunci onar i oCont r ol l er = cl ass( TI nt er f acedObj ect , I Cr udCont r ol l er )
st r i ct pr i vat e
FModel : TFunci onar i o;
FVi ew: Tf r mFunci onar i o;
pr ocedur e Enabl eCont r ol s;
pr ocedur e Di sabl eCont r ol s;
pr ocedur e Cl ear Cont r ol s;
pr ocedur e ShowDat a;
pr ocedur e Sear chCl i ent e( Sender : TObj ect ) ;
publ i c
const r uct or Cr eat e( Model : TFunci onar i o) ;
f unct i on Appl y: Bool ean;
f unct i on New: bool ean;
f unct i on Del et e: bool ean;
pr ocedur e Edi t ;
pr ocedur e Sear ch;
f unct i on Fet ch( Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
f unct i on Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
pr ocedur e Show;
pr ocedur e Pr i nt ;
end;

i mpl ement at i on

uses
uPesqui sar , Cl i ent e, St dCt r l s, Gr aphi cs, uMappi ngBal t azar ;

{ TFunci onar i oCont r ol l er }

pr ocedur e TFunci onar i oCont r ol l er . Sear chCl i ent e( Sender : TObj ect ) ;
begi n
f r mPesqui sar : = Tf r mPesqui sar . Cr eat e( ni l , TCl i ent e. Cr eat e) ;
FModel . Cl i ent e : = f r mPesqui sar . ShowModal as TCl i ent e;
end;

f unct i on TFunci onar i oCont r ol l er . Appl y: Bool ean;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 114
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

114 Colocando Tudo Junto
FModel . Nome : = FVi ew. edt Nome. Text ;
FModel . Emai l : = FVi ew. edt Emai l . Text ;
i f FModel . Appl y t hen
Di sabl eCont r ol s;
end;

pr ocedur e TFunci onar i oCont r ol l er . Cl ear Cont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Cont r ol Count ) do
i f FVi ew. Cont r ol s[ i ] i s TEdi t t hen
TEdi t ( FVi ew. Cont r ol s[ i ] ) . Cl ear ;
end;

const r uct or TFunci onar i oCont r ol l er . Cr eat e( Model : TFunci onar i o) ;
begi n
FModel : = Model ;
FVi ew : = Tf r mFunci onar i o. Cr eat e( ni l ) ;
FVi ew. Par ent : = Mai n. sbxLayer ;
FVi ew. Show;
FVi ew. edt Nome. Set Focus;
/ /
FVi ew. bt nSear chCl i ent e. OnCl i ck : = Sear chCl i ent e;
FVi ew. edt Cl i ent e. ReadOnl y : = Fal se;
end;

f unct i on TFunci onar i oCont r ol l er . Del et e: bool ean;
begi n

end;

pr ocedur e TFunci onar i oCont r ol l er . Di sabl eCont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Cont r ol Count ) do
i f FVi ew. Cont r ol s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Cont r ol s[ i ] ) . Par ent Col or : = Tr ue;
TEdi t ( FVi ew. Cont r ol s[ i ] ) . ReadOnl y : = Tr ue;
end;
end;

pr ocedur e TFunci onar i oCont r ol l er . Edi t ;
begi n
FModel . Edi t ;
Enabl eCont r ol s;
end;

pr ocedur e TFunci onar i oCont r ol l er . Enabl eCont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Cont r ol Count ) do
i f FVi ew. Cont r ol s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Cont r ol s[ i ] ) . Col or : = cl Whi t e;
TEdi t ( FVi ew. Cont r ol s[ i ] ) . ReadOnl y : = Fal se;
end;
end;

f unct i on TFunci onar i oCont r ol l er . Fet ch(

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 115
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

115 Colocando Tudo Junto
Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
begi n
r esul t : = FModel . Fet ch( Obj Dat a) ;
end;

f unct i on TFunci onar i oCont r ol l er . Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
begi n
r esul t : = FModel . Fet chByI d( OI D) as TFunci onar i o;
end;

f unct i on TFunci onar i oCont r ol l er . New: bool ean;
begi n
Enabl eCont r ol s;
Cl ear Cont r ol s;
FModel : = TFunci onar i o. Cr eat e;
FVi ew. edt Nome. Set Focus;
end;

pr ocedur e TFunci onar i oCont r ol l er . Pr i nt ;
begi n
Mappi ngBal t azar . odsFunci onar i o. Obj ect Dat aSer vi ce : = FModel ;
/ / Mappi ngBal t azar . RvPr oj ect 1. Execut eRepor t ( ' Repor t 1' ) ;
end;

pr ocedur e TFunci onar i oCont r ol l er . Sear ch;
begi n
f r mPesqui sar : = Tf r mPesqui sar . Cr eat e( ni l , FModel ) ;
FModel : = f r mPesqui sar . ShowModal as TFunci onar i o;
ShowDat a;
end;

pr ocedur e TFunci onar i oCont r ol l er . Show;
begi n
FVi ew. Show;
end;

pr ocedur e TFunci onar i oCont r ol l er . ShowDat a;
begi n
wi t h FVi ew do
begi n
edt Nome. Text : = FModel . Nome;
edt Emai l . Text : = FModel . Emai l ;
i f Assi gned( FModel . Cl i ent e) t hen
edt Cl i ent e. Text : = FModel . Cl i ent e. Nome;
end;
Di sabl eCont r ol s;
end;

end.



TTelefoneController


t ype
TTel ef oneCont r ol l er = cl ass( TI nt er f acedObj ect , I Cr udCont r ol l er , I ODSObser ver )
st r i ct pr i vat e
FModel : TTel ef one;
FVi ew: Tf r mTel ef one;
pr ocedur e Enabl eCont r ol s;
pr ocedur e Di sabl eCont r ol s;
pr ocedur e Cl ear Cont r ol s;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 116
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

116 Colocando Tudo Junto
pr ocedur e ShowDat a;
pr ocedur e Sear chCl i ent e( Sender : TObj ect ) ;
pr ocedur e ShowCl i ent ( Sender : TObj ect ) ;
publ i c
const r uct or Cr eat e( Model : TTel ef one) ;
f unct i on Appl y: Bool ean;
f unct i on New: bool ean;
f unct i on Del et e: bool ean;
pr ocedur e Edi t ;
pr ocedur e Sear ch;
f unct i on Fet ch( Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
f unct i on Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
pr ocedur e Show;
pr ocedur e Pr i nt ;
pr ocedur e Updat e( Obser vabl e: I ODSObser vabl e) ;
end;

i mpl ement at i on

uses
uPesqui sar , Cl i ent e, St dCt r l s, Gr aphi cs, SysUt i l s, But t ons;

{ TTel ef oneCont r ol l er }

pr ocedur e TTel ef oneCont r ol l er . Sear chCl i ent e( Sender : TObj ect ) ;
begi n
f r mPesqui sar : = Tf r mPesqui sar . Cr eat e( ni l , TCl i ent e. Cr eat e) ;
FModel . Cl i ent e : = f r mPesqui sar . ShowModal as TCl i ent e;
FVi ew. edt Cl i ent e. Text : = FModel . Cl i ent e. Nome;
end;

f unct i on TTel ef oneCont r ol l er . Appl y: Bool ean;
begi n
FModel . DDD : = St r ToI nt ( FVi ew. edt DDD. Text ) ;
FModel . Numer o : = FVi ew. edt Numer o. Text ;
FModel . Ramal : = St r ToI nt ( FVi ew. edt Ramal . Text ) ;
i f FModel . Appl y t hen
Di sabl eCont r ol s;
end;

pr ocedur e TTel ef oneCont r ol l er . Cl ear Cont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Cont r ol Count ) do
i f FVi ew. Cont r ol s[ i ] i s TEdi t t hen
TEdi t ( FVi ew. Cont r ol s[ i ] ) . Cl ear ;
end;

const r uct or TTel ef oneCont r ol l er . Cr eat e( Model : TTel ef one) ;
begi n
FModel : = Model ;
FVi ew : = Tf r mTel ef one. Cr eat e( ni l ) ;
FVi ew. Par ent : = Mai n. sbxLayer ;
FVi ew. Show;
FVi ew. edt DDD. Set Focus;
/ /
FVi ew. bt nSear chCl i ent e. OnCl i ck : = Sear chCl i ent e;
FVi ew. edt Cl i ent e. ReadOnl y : = Tr ue;
/ /
FVi ew. edt Cl i ent e. OnCl i ck : = ShowCl i ent ;
end;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 117
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

117 Colocando Tudo Junto
f unct i on TTel ef oneCont r ol l er . Del et e: bool ean;
begi n

end;

pr ocedur e TTel ef oneCont r ol l er . Di sabl eCont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Component Count ) do
i f FVi ew. Component s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Component s[ i ] ) . Col or : = $00F0F0F0;
TEdi t ( FVi ew. Component s[ i ] ) . ReadOnl y : = Tr ue;
end;
FVi ew. bt nSear chCl i ent e. Enabl ed : = Fal se;
end;

pr ocedur e TTel ef oneCont r ol l er . Edi t ;
begi n
FModel . Edi t ;
Enabl eCont r ol s;
end;

pr ocedur e TTel ef oneCont r ol l er . Enabl eCont r ol s;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FVi ew. Component Count ) do
i f FVi ew. Component s[ i ] i s TEdi t t hen
begi n
TEdi t ( FVi ew. Component s[ i ] ) . Col or : = cl Whi t e;
TEdi t ( FVi ew. Component s[ i ] ) . ReadOnl y : = Fal se;
end;
FVi ew. bt nSear chCl i ent e. Enabl ed : = Tr ue;
end;

f unct i on TTel ef oneCont r ol l er . Fet ch(
Obj Dat a: TObj ect Dat aSer vi ce) : I ODSCol l ect i onObj ect ;
begi n
r esul t : = FModel . Fet ch( Obj Dat a) ;
end;

f unct i on TTel ef oneCont r ol l er . Fet chByI D( OI D: st r i ng) : TObj ect Dat aSer vi ce;
begi n
r esul t : = FModel . Fet chByI d( OI D) as TTel ef one;
end;

f unct i on TTel ef oneCont r ol l er . New: bool ean;
begi n
Enabl eCont r ol s;
Cl ear Cont r ol s;
FModel : = TTel ef one. Cr eat e;
FVi ew. edt DDD. Set Focus;
end;

pr ocedur e TTel ef oneCont r ol l er . Pr i nt ;
begi n

end;

pr ocedur e TTel ef oneCont r ol l er . Sear ch;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 118
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

118 Colocando Tudo Junto
f r mPesqui sar : = Tf r mPesqui sar . Cr eat e( ni l , FModel ) ;
FModel : = f r mPesqui sar . ShowModal as TTel ef one;
FModel . Cl i ent e. Subscr i be( Sel f ) ;
ShowDat a;
Di sabl eCont r ol s;
end;

pr ocedur e TTel ef oneCont r ol l er . Show;
begi n
FVi ew. Show;
end;

pr ocedur e TTel ef oneCont r ol l er . ShowCl i ent ( Sender : TObj ect ) ;
var
Cont r ol l er : I Cr udCont r ol l er ;
begi n
i nher i t ed;
Cont r ol l er : = TCl i ent eCont r ol l er . Cr eat e( FModel . Cl i ent e) ;
Mai n. I t emI ndex : = Mai n. FCr udCont r ol l er . Add( Cont r ol l er ) ;
Mai n. AddVi ew( ' Cl i ent es' , Mai n. I t emI ndex) ;
end;

pr ocedur e TTel ef oneCont r ol l er . ShowDat a;
begi n
wi t h FVi ew do
begi n
edt DDD. Text : = I nt ToSt r ( FModel . DDD) ;
edt Numer o. Text : = FModel . Numer o;
edt Ramal . Text : = I nt ToSt r ( FModel . Ramal ) ;
edt Cl i ent e. Text : = FModel . Cl i ent e. Nome;
end;
end;

pr ocedur e TTel ef oneCont r ol l er . Updat e( Obser vabl e: I ODSObser vabl e) ;
begi n
ShowDat a;
end;

end.



Views


Main


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 119
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

119 Colocando Tudo Junto



t ype
TMai n = cl ass( TFor m)
St at usBar 1: TSt at usBar ;
Cool Bar 1: TCool Bar ;
Tool Bar 1: TTool Bar ;
Act i onMai nMenuBar 1: TAct i onMai nMenuBar ;
Act i onManager 1: TAct i onManager ;
act Ar qui vo: TAct i on;
act Aj uda: TAct i on;
sbxLayer : TScr ol l Box;
Tr ayI con1: TTr ayI con;
Appl i cat i onEvent s1: TAppl i cat i onEvent s;
act Ent i dades: TAct i on;
I mageLi st 1: TI mageLi st ;
Tool But t on1: TTool But t on;
Tool But t on2: TTool But t on;
Tool But t on3: TTool But t on;
Tool But t on5: TTool But t on;
Tool But t on6: TTool But t on;
Tool But t on9: TTool But t on;
XPCol or Map1: TXPCol or Map;
act Cl i ent es: TAct i on;
act Pesqui sar : TAct i on;
PopupMenu1: TPopupMenu;
Exi bi r 1: TMenuI t em;
Ocul t ar 1: TMenuI t em;
act Sal var : TAct i on;
act Novo: TAct i on;
act Excl ui r : TAct i on;
Shape1: TShape;
act Funci onar i os: TAct i on;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 120
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

120 Colocando Tudo Junto
PopupMenu2: TPopupMenu;
Fechar 1: TMenuI t em;
At i var 1: TMenuI t em;
Fechar Todos1: TMenuI t em;
Tool But t on4: TTool But t on;
act Edi t ar : TAct i on;
act Tel ef one: TAct i on;
Tool But t on7: TTool But t on;
act I mpr i mi r : TAct i on;
Tool Bar 2: TTool Bar ;
Tool But t on8: TTool But t on;
Tool But t on10: TTool But t on;
act Ant er i or : TAct i on;
act Pr oxi mo: TAct i on;
pr ocedur e act Ar qui voExecut e( Sender : TObj ect ) ;
pr ocedur e act Cl i ent esExecut e( Sender : TObj ect ) ;
pr ocedur e act Ent i dadesExecut e( Sender : TObj ect ) ;
pr ocedur e act Edi t ar Execut e( Sender : TObj ect ) ;
pr ocedur e act Aj udaExecut e( Sender : TObj ect ) ;
pr ocedur e Appl i cat i onEvent s1Mi ni mi ze( Sender : TObj ect ) ;
pr ocedur e Exi bi r 1Cl i ck( Sender : TObj ect ) ;
pr ocedur e Ocul t ar 1Cl i ck( Sender : TObj ect ) ;
pr ocedur e Tr ayI con1Dbl Cl i ck( Sender : TObj ect ) ;
pr ocedur e act Sal var Execut e( Sender : TObj ect ) ;
pr ocedur e act NovoExecut e( Sender : TObj ect ) ;
pr ocedur e act Excl ui r Execut e( Sender : TObj ect ) ;
pr ocedur e act Funci onar i osExecut e( Sender : TObj ect ) ;
pr ocedur e act Pesqui sar Execut e( Sender : TObj ect ) ;
pr ocedur e act Tel ef oneExecut e( Sender : TObj ect ) ;
pr ocedur e Fechar 1Cl i ck( Sender : TObj ect ) ;
pr ocedur e act I mpr i mi r Execut e( Sender : TObj ect ) ;
pr ocedur e Li st Vi ew1Changi ng( Sender : TObj ect ; I t em: TLi st I t em;
Change: TI t emChange; var Al l owChange: Bool ean) ;
pr ocedur e act Ant er i or Execut e( Sender : TObj ect ) ;
pr ocedur e act Pr oxi moExecut e( Sender : TObj ect ) ;
pr ocedur e act Ant er i or Updat e( Sender : TObj ect ) ;
pr ocedur e act Pr oxi moUpdat e( Sender : TObj ect ) ;
pr i vat e
FI t emI ndex: I nt eger ; / / l i st a de cont r ol l er s das vi ews!
f unct i on Get Cr udCont r ol l er ( I ndex: i nt eger ) : I Cr udCont r ol l er ;
pr ocedur e Set I t emI ndex( const Val ue: I nt eger ) ;
publ i c
FCr udCont r ol l er : I I nt er f aceLi st ;
pr oper t y Cr udCont r ol l er [ I ndex: i nt eger ] : I Cr udCont r ol l er r ead
Get Cr udCont r ol l er ;
const r uct or Cr eat e( AOwner : TComponent ) ; over r i de;
f unct i on Act i veCont r ol l er : I Cr udCont r ol l er ;
pr oper t y I t emI ndex: I nt eger r ead FI t emI ndex wr i t e Set I t emI ndex;
pr ocedur e RemoveCont r ol l er ;
end;

var
Mai n: TMai n;

i mpl ement at i on

uses uCl i ent e, uPesqui sar , uFunci onar i o, Cl i ent e, uMappi ngBal t azar ,
Funci onar i o, Funci onar i oCont r ol l er , Tel ef one, Tel ef oneCont r ol l er ;

{$R *. df m}

pr ocedur e TMai n. act Aj udaExecut e( Sender : TObj ect ) ;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 121
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

121 Colocando Tudo Junto
;
end;

pr ocedur e TMai n. act Ant er i or Execut e( Sender : TObj ect ) ;
begi n
( FCr udCont r ol l er . I t ems[ I t emI ndex - 1] as I Cr udCont r ol l er ) . Show;
Dec( FI t emI ndex) ;
end;

pr ocedur e TMai n. act Ant er i or Updat e( Sender : TObj ect ) ;
begi n
TAct i on( Sender ) . Enabl ed : = FI t emI ndex > 0;
end;

pr ocedur e TMai n. act Ar qui voExecut e( Sender : TObj ect ) ;
begi n
;
end;

pr ocedur e TMai n. act Cl i ent esExecut e( Sender : TObj ect ) ;
var
Cont r ol l er : I Cr udCont r ol l er ;
Cl i ent e: TCl i ent e;
begi n
Cl i ent e : = TCl i ent e. Cr eat e;
Cont r ol l er : = TCl i ent eCont r ol l er . Cr eat e( Cl i ent e) ;
I t emI ndex : = FCr udCont r ol l er . Add( Cont r ol l er ) ;
end;

pr ocedur e TMai n. act Edi t ar Execut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . Edi t ;
end;

pr ocedur e TMai n. act Ent i dadesExecut e( Sender : TObj ect ) ;
begi n
;
end;

pr ocedur e TMai n. act Excl ui r Execut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . Del et e;
end;

pr ocedur e TMai n. act Funci onar i osExecut e( Sender : TObj ect ) ;
var
Cont r ol l er : I Cr udCont r ol l er ;
Funci onar i o: TFunci onar i o;
begi n
Funci onar i o : = TFunci onar i o. Cr eat e;
Cont r ol l er : = TFunci onar i oCont r ol l er . Cr eat e( Funci onar i o) ;
I t emI ndex : = FCr udCont r ol l er . Add( Cont r ol l er ) ;
end;

pr ocedur e TMai n. act I mpr i mi r Execut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . Pr i nt ;
end;

f unct i on TMai n. Act i veCont r ol l er : I Cr udCont r ol l er ;
begi n
r esul t : = I Cr udCont r ol l er ( FCr udCont r ol l er . I t ems[ FI t emI ndex] )
end;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 122
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

122 Colocando Tudo Junto

pr ocedur e TMai n. act NovoExecut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . New;
end;

pr ocedur e TMai n. act Pesqui sar Execut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . Sear ch;
end;

pr ocedur e TMai n. act Pr oxi moExecut e( Sender : TObj ect ) ;
begi n
( FCr udCont r ol l er . I t ems[ I t emI ndex +1] as I Cr udCont r ol l er ) . Show;
I nc( FI t emI ndex) ;
end;

pr ocedur e TMai n. act Pr oxi moUpdat e( Sender : TObj ect ) ;
begi n
TAct i on( Sender ) . Enabl ed : = FI t emI ndex < FCr udCont r ol l er . Count - 1;
end;

pr ocedur e TMai n. act Sal var Execut e( Sender : TObj ect ) ;
begi n
Act i veCont r ol l er . Appl y;
end;

pr ocedur e TMai n. act Tel ef oneExecut e( Sender : TObj ect ) ;
var
Cont r ol l er : I Cr udCont r ol l er ;
Tel ef one: TTel ef one;
begi n
Tel ef one : = TTel ef one. Cr eat e;
Cont r ol l er : = TTel ef oneCont r ol l er . Cr eat e( Tel ef one) ;
I t emI ndex : = FCr udCont r ol l er . Add( Cont r ol l er ) ;
end;

pr ocedur e TMai n. Appl i cat i onEvent s1Mi ni mi ze( Sender : TObj ect ) ;
begi n
Tr ayI con1. Vi si bl e : = t r ue;
Hi de;
end;

const r uct or TMai n. Cr eat e( AOwner : TComponent ) ;
begi n
i nher i t ed;
FCr udCont r ol l er : = TI nt er f aceLi st . Cr eat e;
end;

pr ocedur e TMai n. Exi bi r 1Cl i ck( Sender : TObj ect ) ;
begi n
Show;
Tr ayI con1. Vi si bl e : = f al se;
end;

pr ocedur e TMai n. Fechar 1Cl i ck( Sender : TObj ect ) ;
begi n
RemoveCont r ol l er ;
end;

f unct i on TMai n. Get Cr udCont r ol l er ( I ndex: i nt eger ) : I Cr udCont r ol l er ;
begi n
r esul t : = FCr udCont r ol l er [ I ndex] as I Cr udCont r ol l er

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 123
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

123 Colocando Tudo Junto
end;

pr ocedur e TMai n. Li st Vi ew1Changi ng( Sender : TObj ect ; I t em: TLi st I t em;
Change: TI t emChange; var Al l owChange: Bool ean) ;
begi n
I t emI ndex : = St r ToI nt ( I t em. Capt i on) ;
Act i veCont r ol l er . Show;
end;

pr ocedur e TMai n. Ocul t ar 1Cl i ck( Sender : TObj ect ) ;
begi n
Hi de;
end;

pr ocedur e TMai n. RemoveCont r ol l er ;
begi n
I t emI ndex : = FCr udCont r ol l er . Remove( Act i veCont r ol l er ) - 1;
end;

pr ocedur e TMai n. Set I t emI ndex( const Val ue: I nt eger ) ;
begi n
FI t emI ndex : = Val ue;
end;

pr ocedur e TMai n. Tr ayI con1Dbl Cl i ck( Sender : TObj ect ) ;
begi n
Show;
end;

end.













TChildForm



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 124
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

124 Colocando Tudo Junto


t ype
TChi l dFor m= cl ass( TFor m)
Shape1: TShape;
Panel 1: TPanel ;
Shape2: TShape;
bt nFechar : TSpeedBut t on;
bt nOcul t ar : TSpeedBut t on;
pr ocedur e bt nFechar Cl i ck( Sender : TObj ect ) ;
pr ocedur e bt nOcul t ar Cl i ck( Sender : TObj ect ) ;
end;

var
Chi l dFor m: TChi l dFor m;

i mpl ement at i on

uses uMai n;

{$R *. df m}


pr ocedur e TChi l dFor m. bt nFechar Cl i ck( Sender : TObj ect ) ;
begi n
Cl ose;
Mai n. RemoveCont r ol l er ;
end;

pr ocedur e TChi l dFor m. bt nOcul t ar Cl i ck( Sender : TObj ect ) ;
begi n
Hi de;
end;

end.




TfrmModal


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 125
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

125 Colocando Tudo Junto


t ype
Tf r mModal = cl ass( TFor m)
pr ocedur e For mKeyDown( Sender : TObj ect ; var Key: Wor d; Shi f t : TShi f t St at e) ;
pr i vat e
{ Pr i vat e decl ar at i ons }
publ i c
{ Publ i c decl ar at i ons }
end;

var
f r mModal : Tf r mModal ;

i mpl ement at i on

{$R *. df m}

pr ocedur e Tf r mModal . For mKeyDown( Sender : TObj ect ; var Key: Wor d;
Shi f t : TShi f t St at e) ;
begi n
i f key = vk_escape t hen
Cl ose;
end;

end.







TfrmPreview


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 126
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

126 Colocando Tudo Junto



t ype
Tf r mPr evi ew = cl ass( TChi l dFor m)
Scr ol l Box1: TScr ol l Box;
RvRender Pr evi ew1: TRvRender Pr evi ew;
RvRender Pr i nt er 1: TRvRender Pr i nt er ;
pr ocedur e For mCr eat e( Sender : TObj ect ) ;
pr i vat e
FI nput St r eam: TSt r eam;
FPageNum: i nt eger ;
FOnAf t er Pr evi ewPr i nt : TNot i f yEvent ;
FI nput Fi l eName: St r i ng;
FOnGener at e: TNot i f yEvent ;
pr ocedur e Set I nput Fi l eName( const Val ue: St r i ng) ;
pr ocedur e Set I nput St r eam( const Val ue: TSt r eam) ;
pr ocedur e Set OnAf t er Pr evi ewPr i nt ( const Val ue: TNot i f yEvent ) ;
pr ocedur e Set OnGener at e( const Val ue: TNot i f yEvent ) ;
pr ocedur e Set PageNum( const Val ue: i nt eger ) ;
publ i c
Repor t Syst em: TRvSyst em;
pr ocedur e I ni t Fr omRPSyst em;
pr ocedur e OpenFi l e( const AFi l eName: st r i ng) ;
cl ass Pr ocedur e Pr evi ewFi l e( Const AFi l eName: St r i ng) ;
pr oper t y PageNum: i nt eger r ead FPageNumwr i t e Set PageNum;
Pr oper t y OnGener at e: TNot i f yEvent r ead FOnGener at e wr i t e Set OnGener at e;
Pr oper t y OnAf t er Pr evi ewPr i nt : TNot i f yEvent r ead FOnAf t er Pr evi ewPr i nt wr i t e
Set OnAf t er Pr evi ewPr i nt ;
Pr oper t y I nput Fi l eName: St r i ng r ead FI nput Fi l eName wr i t e Set I nput Fi l eName;
Pr oper t y I nput St r eam: TSt r eamr ead FI nput St r eamwr i t e Set I nput St r eam;
end;

var
f r mPr evi ew: Tf r mPr evi ew;


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 127
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

127 Colocando Tudo Junto
i mpl ement at i on

{$R *. df m}

pr ocedur e Tf r mPr evi ew. For mCr eat e( Sender : TObj ect ) ;
begi n
i nher i t ed;
FPageNum: = 1;
wi t h RvRender Pr evi ew1 do
begi n
ShadowDept h : = 2;
Mar gi nPer cent : = 0;
ZoomFact or : = 100;
Scr ol l Box : = Scr ol l Box1;
end; { wi t h }
wi t h RvRender Pr i nt er 1 do begi n
end; { wi t h }
end;

pr ocedur e Tf r mPr evi ew. I ni t Fr omRPSyst em;
begi n
I f I nput Fi l eName <> ' ' Then Begi n
RvRender Pr evi ew1. NDRSt r eam: = TFi l eSt r eam. Cr eat e( I nput Fi l eName, f mOpenRead
Or f mShar eDenyWr i t e) ;
End El se Begi n
RvRender Pr evi ew1. NDRSt r eam: = I nput St r eam;
End; { el se }
RvRender Pr evi ew1. Render ;
Repor t Syst em. Pr evi ewShowEvent ( RvRender Pr evi ew1) ;
end;

pr ocedur e Tf r mPr evi ew. OpenFi l e( const AFi l eName: st r i ng) ;
begi n
wi t h RvRender Pr evi ew1 do begi n
I nput Fi l eName : = AFi l eName;
NDRSt r eam. Fr ee;
Render ( I nput Fi l eName) ;
Capt i on : = Appl i cat i on. Ti t l e + {Tr ans- }' - [ ' +
Ext r act Fi l eName( I nput Fi l eName) + {Tr ans- }' ] ' ;
end; { wi t h }
end;

cl ass pr ocedur e Tf r mPr evi ew. Pr evi ewFi l e( const AFi l eName: St r i ng) ;
begi n

end;

pr ocedur e Tf r mPr evi ew. Set I nput Fi l eName( const Val ue: St r i ng) ;
begi n
FI nput Fi l eName : = Val ue;
end;

pr ocedur e Tf r mPr evi ew. Set I nput St r eam( const Val ue: TSt r eam) ;
begi n
FI nput St r eam: = Val ue;
end;

pr ocedur e Tf r mPr evi ew. Set OnAf t er Pr evi ewPr i nt ( const Val ue: TNot i f yEvent ) ;
begi n
FOnAf t er Pr evi ewPr i nt : = Val ue;
end;

pr ocedur e Tf r mPr evi ew. Set OnGener at e( const Val ue: TNot i f yEvent ) ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 128
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

128 Colocando Tudo Junto
begi n
FOnGener at e : = Val ue;
end;

pr ocedur e Tf r mPr evi ew. Set PageNum( const Val ue: i nt eger ) ;
begi n
FPageNum: = Val ue;
end;

end.


TfrmPesquisar





t ype
Tf r mPesqui sar = cl ass( Tf r mModal )
Li st Vi ew1: TLi st Vi ew;
St at usBar 1: TSt at usBar ;
Panel 2: TPanel ;
But t on3: TBut t on;
But t on4: TBut t on;
Val ueLi st Edi t or 1: TVal ueLi st Edi t or ;
TabSet 1: TTabSet ;
SpeedBut t on1: TSpeedBut t on;
SpeedBut t on2: TSpeedBut t on;
SpeedBut t on3: TSpeedBut t on;
SpeedBut t on4: TSpeedBut t on;
pr ocedur e But t on1Cl i ck( Sender : TObj ect ) ;
pr ocedur e But t on2Cl i ck( Sender : TObj ect ) ;
pr ocedur e Li st Vi ew1Dbl Cl i ck( Sender : TObj ect ) ;
st r i ct pr i vat e
FModel : TObj ect Dat aSer vi ce;
pr ocedur e Set Pr oxyVal ues;
pr ocedur e Cr eat eCol umns( Obj Dat a: TObj ect Dat aSer vi ce) ;
publ i c

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 129
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

129 Colocando Tudo Junto
const r uct or Cr eat e( AOwner : TComponent ; Obj Dat a: TObj ect Dat aSer vi ce) ;
r ei nt r oduce;
f unct i on ShowModal : TObj ect Dat aSer vi ce;
end;

var
f r mPesqui sar : Tf r mPesqui sar ;

i mpl ement at i on

uses
Cl i ent e, uMappi ngBal t azar , ODSDat aSpace;

{$R *. df m}

pr ocedur e Tf r mPesqui sar . But t on1Cl i ck( Sender : TObj ect ) ;
begi n
i nher i t ed;
Cl ose;
end;

pr ocedur e Tf r mPesqui sar . But t on2Cl i ck( Sender : TObj ect ) ;
var
Col l ect i on: TODSCol l ect i onObj ect ;
begi n
i nher i t ed;
Set Pr oxyVal ues;
Li st Vi ew1. Li st Sour ce : = Mappi ngBal t azar . ODSDat aSpace1. Fet ch( FModel ) ; / /
St at usBar 1. Si mpl eText : =
For mat ( ' Regi st r os encont r ados: %d' , [ Li st Vi ew1. Li st Sour ce. Count ] ) ;
end;

const r uct or Tf r mPesqui sar . Cr eat e( AOwner : TComponent ; Obj Dat a:
TObj ect Dat aSer vi ce) ;
var
i : byt e;
begi n
i nher i t ed Cr eat e( AOwner ) ;
FModel : = Obj Dat a;
Cr eat eCol umns( FModel ) ;
end;

pr ocedur e Tf r mPesqui sar . Cr eat eCol umns( Obj Dat a: TObj ect Dat aSer vi ce) ;
var
i : byt e;
begi n
f or i : = 0 t o Obj Dat a. Pr oxyAt t r i but es. Count - 1 do
begi n
wi t h Li st Vi ew1. Col umns. Add do
begi n
Aut oSi ze: = Tr ue;
Capt i on : = Obj Dat a. Pr oxyAt t r i but es. I t ems[ i ] . Name;
end;
Val ueLi st Edi t or 1. I nser t Row( Obj Dat a. Pr oxyAt t r i but es. I t ems[ i ] . Name, ' ' , Tr ue) ;
end;
end;

pr ocedur e Tf r mPesqui sar . Li st Vi ew1Dbl Cl i ck( Sender : TObj ect ) ;
begi n
i nher i t ed;
FModel : = Mappi ngBal t azar . ODSDat aSpace1. Fet chByI D
( Li st Vi ew1. Sel ect ed. Capt i on, TObj ect Met aSer vi ce( FModel . Cl assType) ) ;
Cl ose;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 130
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

130 Colocando Tudo Junto
end;

pr ocedur e Tf r mPesqui sar . Set Pr oxyVal ues;
var
i : byt e;
begi n
f or i : = 0 t o Pr ed( FModel . Pr oxyAt t r i but es. Count ) do
FModel . Pr oxyAt t r i but es. I t ems[ i ] . Val ue : =
Val ueLi st Edi t or 1. Val ues[ FModel . Pr oxyAt t r i but es. I t ems[ i ] . Name]
end;

f unct i on Tf r mPesqui sar . ShowModal : TObj ect Dat aSer vi ce;
begi n
i nher i t ed ShowModal ;
r esul t : = FModel ;
end;

end.


TfrmCliente




t ype
Tf r mCl i ent e = cl ass( TChi l dFor m)
Panel 3: TPanel ;
Panel 2: TPanel ;
Label 1: TLabel ;
Label 3: TLabel ;
Label 5: TLabel ;

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 131
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

131 Colocando Tudo Junto
edt Nome: TEdi t ;
edt Emai l : TEdi t ;
Panel 4: TPanel ;
Panel 5: TPanel ;
Label 6: TLabel ;
Label 7: TLabel ;
Label 8: TLabel ;
bt nAdi ci onar : TSpeedBut t on;
edt DDD: TEdi t ;
Li st Vi ew1: TLi st Vi ew;
edt Numer o: TEdi t ;
edt Ramal : TEdi t ;
edt CPF: TEdi t ;
edt Ci dade: TEdi t ;
Panel 6: TPanel ;
Panel 7: TPanel ;
end;

var
f r mCl i ent e: Tf r mCl i ent e;

i mpl ement at i on

{$R *. df m}

end.


TfrmTelefone


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 132
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

132 Colocando Tudo Junto


t ype
Tf r mTel ef one = cl ass( TChi l dFor m)
Panel 3: TPanel ;
Panel 2: TPanel ;
Label 5: TLabel ;
Label 6: TLabel ;
Label 7: TLabel ;
Label 8: TLabel ;
bt nSear chCl i ent e: TSpeedBut t on;
edt DDD: TEdi t ;
edt Numer o: TEdi t ;
edt Ramal : TEdi t ;
edt Cl i ent e: TEdi t ;
Panel 6: TPanel ;
pr i vat e
{ Pr i vat e decl ar at i ons }
publ i c
{ Publ i c decl ar at i ons }
end;

var
f r mTel ef one: Tf r mTel ef one;

i mpl ement at i on



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 133
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

133 Colocando Tudo Junto
{$R *. df m}

end.


TfrmFuncionario




t ype
Tf r mFunci onar i o = cl ass( TChi l dFor m)
Panel 3: TPanel ;
Panel 2: TPanel ;
Label 6: TLabel ;
Label 7: TLabel ;
Label 8: TLabel ;
bt nSear chCl i ent e: TSpeedBut t on;
edt Nome: TEdi t ;
edt Emai l : TEdi t ;
edt Cl i ent e: TEdi t ;
Panel 6: TPanel ;
end;

var
f r mFunci onar i o: Tf r mFunci onar i o;

i mpl ement at i on

{$R *. df m}

{ Tf r mFunci onar i o }


end.




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 134
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

134 Colocando Tudo Junto
MappingBaltazar



Componentes:

TODSDataBaseMapping realiza o mapeamento da conexo dbExpress para a engine do Baltazar.

TODSDataSpace Mantm as lista de objetos criandos ao longo da execuo da aplicao e
tambm possui mtodos importantes a requisio de objetos como o Fetch e o FetchById.

TODSRaveAdapter usado para adaptar um objeto TObjectDataService de forma que o Rave
entenda seus membros.

TODSRaveListAdapter - usado para adaptar as lista IODSCollectionObject de forma que o Rave
entenda como campos.


t ype
TMappi ngBal t azar = cl ass( TDat aModul e)
SQLConnect i on1: TSQLConnect i on;
ODSDat aBaseMappi ng1: TODSDat aBaseMappi ng;
ODSDat aSpace1: TODSDat aSpace;
r vCl i ent es: TRvCust omConnect i on;
odsCl i ent es: TODSRaveAdapt er ;
RvPr oj ect 1: TRvPr oj ect ;
odsTel ef ones: TODSRaveLi st Adapt er ;
r vTel ef ones: TRvCust omConnect i on;
RvSyst em1: TRvSyst em;
r vFunci onar i o: TRvCust omConnect i on;
odsFunci onar i o: TODSRaveAdapt er ;
pr ocedur e RvSyst em1Over r i dePr evi ew( Repor t Syst em: TRvSyst em;
Over r i deMode: TOver r i deMode; var Over r i deFor m: TFor m) ;
pr i vat e
{ Pr i vat e decl ar at i ons }
publ i c
{ Publ i c decl ar at i ons }
end;

var

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 135
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

135 Colocando Tudo Junto
Mappi ngBal t azar : TMappi ngBal t azar ;

i mpl ement at i on

uses uPr evi ew, uMai n;

{$R *. df m}

pr ocedur e TMappi ngBal t azar . RvSyst em1Over r i dePr evi ew( Repor t Syst em: TRvSyst em;
Over r i deMode: TOver r i deMode; var Over r i deFor m: TFor m) ;
begi n
i nher i t ed;
case Over r i deMode of
omCr eat e:
begi n
f r mPr evi ew : = Tf r mPr evi ew. Cr eat e( Sel f ) ;
f r mPr evi ew. Par ent : = Mai n. sbxLayer ;
Over r i deFor m: = f r mPr evi ew;
Over r i deFor m. Capt i on : = Repor t Syst em. Ti t l ePr evi ew;
( Over r i deFor mas Tf r mPr evi ew) . Repor t Syst em: = Repor t Syst em;
end;
omShow:
begi n
Repor t Syst em. Syst emPr evi ew. I ni t Pr evi ew( ( Over r i deFor mas
Tf r mPr evi ew) . RvRender Pr evi ew1) ;
i f Assi gned( Repor t Syst em. OnPr evi ewSet up) t hen
Repor t Syst em. OnPr evi ewSet up( ( Over r i deFor mas
Tf r mPr evi ew) . RvRender Pr evi ew1) ;
( Over r i deFor mas Tf r mPr evi ew) . I nput Fi l eName : =
Repor t Syst em. Syst emFi l er . Fi l ename;
( Over r i deFor mas Tf r mPr evi ew) . I nput St r eam: =
Repor t Syst em. Syst emFi l er . St r eam;
( Over r i deFor mas Tf r mPr evi ew) . I ni t Fr omRPSyst em;
Over r i deFor m. Show;
end;
end;
end;

end.


Script Banco de Dados

i f exi st s ( sel ect * f r omdbo. sysobj ect s wher e i d = obj ect _i d( N' [ dbo] . [ Cl i ent e] ' )
and OBJ ECTPROPERTY( i d, N' I sUser Tabl e' ) = 1)
dr op t abl e [ dbo] . [ Cl i ent e]
GO

i f exi st s ( sel ect * f r omdbo. sysobj ect s wher e i d =
obj ect _i d( N' [ dbo] . [ Funci onar i o] ' ) and OBJ ECTPROPERTY( i d, N' I sUser Tabl e' ) = 1)
dr op t abl e [ dbo] . [ Funci onar i o]
GO

i f exi st s ( sel ect * f r omdbo. sysobj ect s wher e i d =
obj ect _i d( N' [ dbo] . [ Obj ect I d] ' ) and OBJ ECTPROPERTY( i d, N' I sUser Tabl e' ) = 1)
dr op t abl e [ dbo] . [ Obj ect I d]
GO

i f exi st s ( sel ect * f r omdbo. sysobj ect s wher e i d =
obj ect _i d( N' [ dbo] . [ Tel ef one] ' ) and OBJ ECTPROPERTY( i d, N' I sUser Tabl e' ) = 1)
dr op t abl e [ dbo] . [ Tel ef one]
GO


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 136
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

136 Colocando Tudo Junto
CREATE TABLE [ dbo] . [ Cl i ent e] (
[ Cl i ent eI D] [ i nt ] NOT NULL ,
[ Nome] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ Emai l ] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ CPF] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ Ci dade] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL
) ON [ PRI MARY]
GO

CREATE TABLE [ dbo] . [ Funci onar i o] (
[ Funci onar i oI D] [ i nt ] NOT NULL ,
[ Cl i ent e] [ i nt ] NULL ,
[ Nome] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ Emai l ] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL
) ON [ PRI MARY]
GO

CREATE TABLE [ dbo] . [ Obj ect I d] (
[ oi d] [ i nt ] NULL
) ON [ PRI MARY]
GO

CREATE TABLE [ dbo] . [ Tel ef one] (
[ Tel ef oneI D] [ i nt ] NOT NULL ,
[ Cl i ent e] [ i nt ] NULL ,
[ DDD] [ char ] ( 2) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ Numer o] [ var char ] ( 50) COLLATE SQL_Lat i n1_Gener al _CP1_CI _AS NULL ,
[ Ramal ] [ numer i c] ( 18, 0) NULL
) ON [ PRI MARY]
GO



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 137
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

137 Apendices
Apendices

BancodedadosOrientadosaObjetos

Cach o nico banco de dados ps-relacional que oferece trs opes integradas de acesso que
podem ser usadas simultaneamente pelo mesmo dado: um robusto banco de dados orientado a
objetos, alta performance com SQL, e um rico acesso multidimensional. Mapeamento no
necessrio entre acessos de views de dados objetos, relacionais e multidimensionais, resultando em
ampla economia tanto em tempo de desenvolvimento como de processamento. O Cach permite um
rpido desenvolvimento de aplicaes Web, extraordinria velocidade em processamento de
transaes, escabalidade macia, e consultas em tempo-real de dados transacionais.

Criando classes no Cach

Para criar as classes no Cach inicie o Studio, isso pode ser feito pelo grupo de programas ou
clicando no cone do Cach na barra de tarefas.




ou



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 138
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

138 Apendices

O Studio ser iniciado.
O Cach trabalha com classes dentro de pacotes, pacotes dentro de projetos e projetos dentro de
namespaces, porm, no necessrio criar estes elementos nesta ordem j que o wizard nos
possibilitar a criao simultnea.
Supondo que voc acabou de instalar o Cach, o namespace padro ser (LOCALTCP:USER) e o
projeto Default__system, caso no seja, alterne para este namespace atravs do menu Arquivo |
Change Namespace...



Observe se voc est trabalhando neste namespace



Neste namespace criaremos nosso projeto, nosso pacote e nossas classes.
Clique em Arquivo | Novo Projeto
Clique em Arquivo | Salvar Projeto, salve como Exemplo, observe o novo projeto




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 139
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

139 Apendices
Clique com o boto direito do mouse sobre Classes e selecione Criar Nova Classe



Na janela que se abre informe o nome do pacote (Exemplo em nosso caso), o nome da classe
(Telefone) e se desejar, uma descrio tambm.



Clique Next (em algumas instalaes no aparece o boto Next, se for este o caso, clique em
Concluir, isto pode acontecer em outros casos, esteja avisado, daqui pra frente se no vir o boto
Next clique em Concluir), Na janela que se abre selecione Serial (isto quer dizer que as instancias
de Telefone sero embutidas em outras classes como Cliente, Empregado, Fornecedor, etc.), clique
em Next


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 140
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

140 Apendices


Vamos fazer uma breve parada para entender as opes desta tela.
Sugiro uma consulta documentao do Cach, mas vamos a uma breve descrio:
Persistente: opo para objetos que devem ter seus atributos persistidos no banco;
Serial: cria objetos que podem ser embutidos em outros objetos permitindo assim a criao
de tipos complexos;
Registrada: objetos registrados, mas que no sero gravados no banco;
Abstrata: classe utilizada para a derivao de novas classes, no devero existir objetos deste
tipo;
Tipo de Dados: cria uma definio de tipo;
CSP: objetos que respondero a eventos http;
Derivada: classe que herda de outra classe, usada em conjunto com a propriedade a seguir;
Nome da superclasse: caso a classe seja derivada, informamos nesta janela o nome da classe
ancestral (clicando no boto procurar ser aberta uma janela com as classes existentes para
que uma seja selecionada, veja a figura).



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 141
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

141 Apendices


Reiterando, neste caso selecione Serial e Clique Next

A janela que se abre questiona se a classe possui suporte a XML e se a classe suportar populao
automtica de dados (neste caso ser criado um mtodo que insere valores aleatrios nos objetos
para teste). Deixe tudo como est (no marque nada) e clique em Finish.



Neste ponto a classe foi criada e o arquivo aberto na rea principal do programa. A seguir a
definio da classe:
cl ass Exempl o. Tel ef one Ext ends %Ser i al Obj ect
{
}

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 142
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

142 Apendices


Precisamos agora inserir os atributos desta classe. Isto pode ser feito tanto diretamente no cdigo,
quanto utilizando wizards.
Antes de prosseguir vamos dar uma olhada no modelo que pretendemos implementar:





Como visto, a classe Telefone ter trs atributos do tipo String (Numero, Ramal e Prefixo) e a
classe Cliente ter trs atributos do tipo String (Nome, Sobrenome e CPF).
Para inserir as propriedades na classe Telefone certifique-se de que o arquivo aberto no editor o
arquivo que contem a classe Telefone.

Podemos usar o menu Classe, ou os speedbuttons da barra de tarefas para inserir as propriedades:

ou

O wizard ser iniciado e na primeira tela informaremos o nome da propriedade


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 143
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

143 Apendices


Clique Next

Nesta tela podemos escolher o tipo da propriedade, selecione Um nico valor do tipo: e escolha
%String, caso deseje outro tipo clique no boto Procurar




___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 144
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

144 Apendices
Existem outros tipos mais complexos disposio, sugiro uma consulta na documentao para
entendimento de todas as opes.

Clique Next

Na janela que se abre podemos ajustar parmetros para especificar se a propriedade Obrigatria
(NOT NULL), Indexada, Chave, ou calculada, podemos ainda dar um nome opcional para ser
exibido no acesso usando SQL.

Deixe tudo conforme o padro e Clique Next;




Na janela que se abre podemos ajustar diversos parmetros da propriedade, mais uma vez
aceitaremos o padro, Clique Next


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 145
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

145 Apendices


Na janela que se abre podemos escolher sobrescrever os mtodos Get e Set da propriedade. Estes
mtodos no devem ser novidade para os Analistas, j que um padro da Engenharia de Software,
e nem para programadores Delphi, j que o Delphi segue este padro quando criamos properties em
nossas classes; de qualquer forma, uma rpida explicao: para respeitar o encapsulamento
(principio de information hide neste caso), todos os campos de uma classe so privados ou
protegidos e fornecemos mtodos chamados Getters para leitura e Setters para escrita, alem de
ocultar a implementao (black box) estes mtodos permitem, por exemplo, que se faa alguma
validao antes de ler ou escrever no campo especifico. Em nosso exemplo no desejamos
sobrescrever os mtodos. Clique Finish.



___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 146
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

146 Apendices


A propriedade foi criada e nosso cdigo deve estar como a seguir:


Cl ass Exempl o. Tel ef one Ext ends %Ser i al Obj ect
{
Pr oper t y Numer o As %St r i ng;
}


Siga em frente e crie as outras duas propriedades (Ramal e Prefixo).

Definio final da classe Telefone:


Cl ass Exempl o. Tel ef one Ext ends %Ser i al Obj ect
{
Pr oper t y Numer o As %St r i ng;
Pr oper t y Pr ef i xo As %St r i ng;
Pr oper t y Ramal As %St r i ng;
}











Salve o projeto.

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 147
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

147 Apendices

Para ter certeza de que tudo est bem precisamos compilar a classe (ou diretamente o pacote, o que
implica em compilar todas as classes dentro dele). Para isso, clique com o boto direito do mouse
no nome do pacote e selecione a opo Compilar Pacote Exemplo.

Obs. Existem duas janelas que exibem informaes muito parecidas no Workspace, uma a aba
Projeto, outra a aba Namespace, para compilar o pacote necessrio que voc esteja na aba Projeto.



Se tudo estiver bem, ser dada mensagem de sucesso e apresentada uma tela sugerindo a releitura
do arquivo, aceite clicando em Yes



Vamos agora criar a classe Cliente, siga em frente e crie a classe (esta classe dever ser do tipo
Persistent e no Serial como Telefone), depois adicione as propriedades, Nome, Sobrenome e CPF.

Sua nova classe dever estar como a seguir:


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 148
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

148 Apendices
Cl ass Exempl o. Cl i ent e Ext ends %Per si st ent
{
Pr oper t y CPF As %St r i ng;
Pr oper t y Nome As %St r i ng;
Pr oper t y Sobr enome As %St r i ng;
}

Inserindo a propriedade Telefone em Cliente

O prximo passo inserir uma ou mais propriedades do tipo Telefone na classe Cliente.
Adicione uma nova propriedade, informe TelResidencial no nome e clique Next



Em Um nico valor do tipo: clique no boto Procurar, expanda o n Other depois expanda o pacote
Exemplo e selecione Telefone


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 149
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

149 Apendices


Clique Finish

Salve tudo e compile o pacote.

Cdigo final das classes sem os comentrios:


Cl ass Exempl o. Cl i ent e Ext ends %Per si st ent
{
Pr oper t y CPF As %St r i ng;
Pr oper t y Nome As %St r i ng;
Pr oper t y Sobr enome As %St r i ng;
Pr oper t y Tel ef oneResi denci al As Tel ef one;
}


Cl ass Exempl o. Tel ef one Ext ends %Ser i al Obj ect
{
Pr oper t y Numer o As %St r i ng;
Pr oper t y Pr ef i xo As %St r i ng;
Pr oper t y Ramal As %St r i ng;
}


___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 150
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

150 Apendices
Acessando os objetos usando COM
Vamos construir agora a aplicao que acessa diretamente os objetos do Cach usando COM. para
isso, crie uma nova aplicao Win32 e monte o form como a figura a seguir:





Para podermos acessar o servidor COM do Cach vamos importar a Type Library dele.
Menu Component | Import Component, selecione Import a Type Library e clique em Next



Em Description localize CacheObject, selecione-o e clique Next

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 151
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

151 Apendices



Na janela que se abre em Unit dir Name, aponte para a pasta do seu projeto ou para uma pasta que
esteja no Browsing Path do Delphi, clique Next, na janela seguinte, deixe marcada a opo Create
Unit e clique em Finish. O Delphi importou a Type Library e criou uma unit
(CacheObject_TLB.pas) para ela.

Precisamos adicionar esta unit clusula uses de nosso form, adicione no uses da Interface j que
usaremos um tipo contido nesta unit ainda na declarao da classe do nosso form. Adicione tambm
a unit ComObj clusula uses (Interface ou Implementation).

Sugiro que voc d uma boa olhada nesta unit para se familiarizar com as interfaces e mtodos
exportados pela TLB.
Adicione um campo chamado Factory do tipo IFactory na seo private da classe do form

t ype
TFor m6 = cl ass( TFor m)
bt nConect ar : TBut t on;
bt nI nser i r : TBut t on;
Gr oupBox1: TGr oupBox;
edt Nome: TLabel edEdi t ;
edt Sobr enome: TLabel edEdi t ;
edt CPF: TLabel edEdi t ;
edt Numer o: TLabel edEdi t ;
edt Pr ef i xo: TLabel edEdi t ;
edt Ramal : TLabel edEdi t ;
Gr oupBox2: TGr oupBox;
bt nLocal i zar : TBut t on;
edt I D: TLabel edEdi t ;
pr ocedur e bt nConect ar Cl i ck( Sender : TObj ect ) ;
pr ocedur e bt nLocal i zar Cl i ck( Sender : TObj ect ) ;
pr ocedur e bt nI nser i r Cl i ck( Sender : TObj ect ) ;
pr i vat e
Fact or y: I Fact or y;
publ i c
{ Publ i c decl ar at i ons }

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 152
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

152 Apendices
end;



Vamos agora programar o manipulador de evento do click do boto btConectar


pr ocedur e TFor m6. bt nConect ar Cl i ck( Sender : TObj ect ) ;
begi n
Fact or y : = Cr eat eComObj ect ( CLASS_Fact or y) as I Fact or y;
i f not Fact or y. Connect ( ' cn_i pt cp: 127. 0. 0. 1[ 1972] : USER' ) t hen
ShowMessage( ' No f oi poss vel est abel ecer conexo' ) ;
end;


Na primeira linha ns nos conectamos ao servidor COM e podemos a partir de agora invocar os
mtodos declarados na interface IFactory.
Na segunda linha invocamos o mtodo Connect passando para ele uma string que contem o socket
da conexo mais a base com a qual desejamos estabelecer a conexo.
Neste momento j estamos conectados e com acesso a base User do Cach, podemos agora acessar
seus objetos.

No click do boto btLocalizar invocaremos o mtodo OpenID que recebe como parmetro o nome
da classe, o ID do objeto e o tipo de concorrncia que ser usado nesta consulta (0: sem bloqueio, 1:
atmico, 2: compartilhado, 3: compartilhado, mas retido, 4: acesso exclusivo, veja a documentao
para mais detalhes).


pr ocedur e TFor m6. bt nLocal i zar Cl i ck( Sender : TObj ect ) ;
var
Cl i ent e: Var i ant ;
begi n
t r y
Cl i ent e : = Fact or y. OpenI d( ' Exempl o. Cl i ent e' , edt I D. Text , 1) ;
except
on e: Except i on do
ShowMessage( e. message) ;
end;

i f Var I sNul l ( Cl i ent e) or Var I sCl ear ( Cl i ent e) t hen
Exi t ;

ShowMessage( ' Nome: ' + Cl i ent e. Nome + #13 +
' Sobr enome: ' + Cl i ent e. Sobr enome + #13 +
' CPF: ' + Cl i ent e. CPF + #13 +
' Tel Res Numer o: ' + Cl i ent e. Tel ef oneResi denci al . Numer o + #13 +
' Tel Res Ramal : ' + Cl i ent e. Tel ef oneResi denci al . Ramal + #13 +
' Tel Res Pr ef i xo: ' + Cl i ent e. Tel ef oneResi denci al . Pr ef i xo) ;

end;

Cdigo do boto Salvar:


pr ocedur e TFor m6. bt nI nser i r Cl i ck( Sender : TObj ect ) ;
var
Cl i ent e: Var i ant ;
begi n

___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 153
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

153 Apendices
Cl i ent e : = Fact or y. New( ' Exempl o. Cl i ent e' , Tr ue) ;
Cl i ent e. Nome : = edt Nome. Text ;
Cl i ent e. Sobr enome : = edt Sobr enome. Text ;
Cl i ent e. CPF : = edt CPF. Text ;
Cl i ent e. Tel ef oneResi denci al . Numer o : = edt Numer o. Text ;
Cl i ent e. Tel ef oneResi denci al . Pr ef i xo : = edt Pr ef i xo. Text ;
Cl i ent e. Tel ef oneResi denci al . Ramal : = edt Ramal . Text ;
Cl i ent e. Sys_Save;
Cl i ent e. Sys_Cl ose;
Cl i ent e : = Nul l ;
end;


Pronto, isto tudo, execute o programa, clique em Conectar, depois, digite um ID valido no edit e
clique em Localizar ID.





___________________________________________________________________________________________________________
Programao Orientada a Objetos Avanada 154
TDS Tecnologia Copyright 2008 Todos os direitos reservados. http://www.tdstecnologia.com.br

154 Apendices

Você também pode gostar