Vous êtes sur la page 1sur 180

Sistemas de Informao

LABORATRIO DE PROGRAMAO III E PROGRAMAO III


Professor Marcos Antnio Moreira

Ensinar e aprender so tarefas que andam juntas e, para que seja alcanado o objetivo em cada uma delas, necessria muita dedicao e estudo constante. No h mgica no aprendizado, h, sim, muita determinao por parte daquele que quer aprender.
Copyright Agosto / 2012 Marcos Antnio Moreira.
Todos os nomes dos produtos citados so marcas registradas da Microsoft Corp. Outros produtos citados so marcas registradas no respectivo cabealho As vrias Marcas Registradas que aparecem no decorrer desta apostila. Mais do que simplesmente listar esses nomes e informar quem possui seus direitos de explorao, ou ainda imprimir o logotipo das mesmas, o autor declara estar utilizando tais nomes apenas para fins editoriais, em benefcio exclusivo do dono da marca registrada, sem inteno de infringir as regras de sua utilizao.

Professor Marcos Antonio Moreira

Sumrio
Histrico........................................................................................................................................................... 1 Definies ....................................................................................................................................................... 3 Evoluo da POO .......................................................................................................................................... 5 Abstrao ................................................................................................................................................... 7 Compartilhamento .................................................................................................................................. 7 Objeto.......................................................................................................................................................... 8 Classe ........................................................................................................................................................ 12 Herana..................................................................................................................................................... 14 Generalizao e Herana ................................................................................................................... 15 Dicas de Desenvolvimento ................................................................................................................ 16 Polimorfismo ................................................................................................................................................18 Encapsulamento .........................................................................................................................................20 Mtodos .........................................................................................................................................................23 Mtodos Estticos ......................................................................................................................................24 Amarrao (binding) .................................................................................................................................24 Reintroduce ..................................................................................................................................................26 Abstract .........................................................................................................................................................26 Mtodos Virtuais .........................................................................................................................................27 Overload - Sobrecarga de Funes .....................................................................................................27 Construtores ................................................................................................................................................29 Destrutores...................................................................................................................................................30 Opes de Visibilidade .............................................................................................................................31 Criando uma Classe Polgono ................................................................................................................34 Mtodo Free .................................................................................................................................................39 Mtodos Dinmicos ...................................................................................................................................47 Mtodos Abstratos .....................................................................................................................................47 Propriedade (Property) ........................................................................................................................53 Mtodo de Leitura ................................................................................................................................. 55 Mtodo de Escrita ................................................................................................................................. 55 Segundo Exemplo Objeto Carro e Avio .......................................................................................58 Professor Marcos Antonio Moreira

Criando Mtodos.................................................................................................................................... 64 Terceiro Exemplo .......................................................................................................................................70 O que uma Classe? ........................................................................................................................... 71 Herana..................................................................................................................................................... 86 Quarto Exemplo ........................................................................................................................................102 Quinto Exemplo ........................................................................................................................................102 Introduo a Criao de Componentes ...........................................................................................103 Criando a Unit do Componente ..................................................................................................... 104 Adicionando Funcionalidades.......................................................................................................... 108 Usando Procedure para Escrita...................................................................................................... 110 Criando Automatismos...................................................................................................................... 112 Criando outro Componente ..................................................................................................................116 Crie uma nova unit no Delphi e mo obra! ................................................................................116 Estendendo um Componente j Existente .....................................................................................124 Contedo Extra Introduo ao Desenvolvimento de um Sistema ........................................133

Professor Marcos Antonio Moreira

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |1

Histrico
A primeira linguagem a incorporar facilidades para definir classes de objetos genricos na forma de uma hierarquia de classes e subclasses foi idealizada em 1966, na Noruega, como uma extenso da linguagem ALGOL 60. Uma classe em Simula um mdulo englobando a definio da estrutura e do comportamento comuns a todas as suas instncias (objetos). A linguagem Smalltalk foi desenvolvida no Centro de Pesquisas da Xerox durante a dcada de 70 que incorporou ideias de Simula e criou o princpio de objetos ativos, prontos a "reagir" a "mensagens" que ativam "comportamentos" especficos do objeto. A linguagem C++ foi projetada para dar suporte a abstrao de dados e a programao orientada a objetos. Ada uma linguagem de programao criada atravs de um concurso realizado pelo U.S. Departament of Defense (DoD). O principal projetista da equipe foi o francs Jean Ichbiah. Esse concurso foi feito para por ordem na situao, o DoD em 1974 usava cerca de 450 linguagens ou dialetos de programao. A linguagem foi primeiramente padronizada em 1983 pelo ANSI e em 1985 a Organizao Internacional de Padronizao (ISO). Eiffel uma Linguagem de Programao avanada, puramente orientada a objeto que enfatiza o projeto e construo de software reutilizvel e de alta qualidade. Eiffel foi criada por Bertrand Meyer que tinha uma extensa experincia com programao orientada a objeto. O Object Pascal ou Delphi Language uma linguagem orientada a objetos, isto , todas as informaes so tratadas como objetos. Todos estes objetos pertencem a uma classe, que so categorias de objetos.
Ex 001

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |2

O Java ao mesmo tempo um ambiente e uma linguagem de programao desenvolvida pela Sun Microsystems, Inc. Trata-se de mais um representante da nova gerao de linguagens orientadas a objetos e foi projetado para resolver os problemas da rea de programao cliente/servidor. Os aplicativos em Java so compilados em um cdigo de bytes independente de arquitetura. O termo orientao a objetos pressupe uma organizao de software em termos de coleo de objetos discretos incorporando estrutura e comportamento prprios. Esta abordagem de organizao essencialmente diferente do desenvolvimento tradicional de software, onde estruturas de dados e rotinas so desenvolvidas de forma apenas fracamente acopladas.

1967: 1972: 1980: 1983: 1984: 1986: 1995: 1995:

Simula - introduz os primeiros conceitos de OO Smalltalk C++ linguagem hbrida, derivada da linguagem C Ada criada para uso militar nos EUA Eilffel primeiras caractersticas formais de OO Object pascal JAVA - Linguagem puramente orientada a objetos Vrias linguagens agregando conceitos de OO

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |3

Definies
Um objeto uma entidade do mundo real que tem uma identidade. Objetos podem representar entidades concretas (um arquivo no meu computador, uma bicicleta) ou entidades conceituais (uma estratgia de jogo, uma poltica de escalonamento em um sistema operacional). Cada objeto ter sua identidade significa que dois objetos so distintos mesmo que eles apresentem exatamente as mesmas caratersticas. Embora objetos tenham existncia prpria no mundo real, em termos de linguagem de programao um objeto necessita um mecanismo de identificao. Esta identificao de objeto deve ser nica, uniforme e independente do contedo do objeto. Este um dos mecanismos que permite a criao de colees de objetos, as quais so tambm objetos em si. A estrutura de um objeto representada em termos de atributos. O comportamento de um objeto representado pelo conjunto de operaes que podem ser executadas sobre o objeto. Objetos com a mesma estrutura e o mesmo comportamento so agrupados em classes. Uma classe uma abstrao que descreve propriedades importantes para uma aplicao e simplesmente ignora o resto. Cada classe descreve um conjunto (possivelmente infinito) de objetos individuais. Cada objeto dito ser uma instncia de uma classe. Assim, cada instncia de uma classe tem seus prprios valores para cada atributo, mas dividem os nomes dos atributos e mtodos com as outras instncias da classe. Implicitamente, cada objeto contm uma referncia para sua prpria classe -em outras palavras, ele sabe o que ele .
Ex 002

Polimorfismo significa que a mesma operao pode se comportar de forma diferente em classes diferentes. Por exemplo, a operao move quando aplicada a uma janela de um sistema de interfaces tem um comportamento distinto do que quando aplicada a uma pea de um jogo de xadrez.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |4

Um mtodo uma implementao especfica de uma operao para uma certa classe. Polimorfismo tambm implica que uma operao de uma mesma classe pode ser implementada por mais de um mtodo. O usurio no precisa saber quantas implementaes existem para uma operao, ou explicitar qual mtodo deve ser utilizado: a linguagem de programao deve ser capaz de selecionar o mtodo correto a partir do nome da operao, classe do objeto e argumentos para a operao. Desta forma, novas classes podem ser adicionadas sem necessidade de modificao de cdigo j existente, pois cada classe apenas define os seus mtodos e atributos. No mundo real, alguns objetos e classes podem ser descritos como casos especiais, ou especializaes, de outros objetos e classes. Por exemplo, a classe de computadores pessoais com processador da linha 80x86 uma especializao de computadores pessoais, que por sua vez uma especializao de computadores. No desejvel que tudo que j foi descrito para computadores tenha de ser repetido para computadores pessoais ou para computadores pessoais com processador da linha 80x86. Herana o mecanismo do paradigma de orientao a objetos que permite compartilhar atributos e operaes entre classes baseada em um relacionamento hierrquico. Uma classe pode ser definida de forma genrica e depois refinada sucessivamente em termos de subclasses ou classes derivadas. Cada subclasse incorpora, ou superclasse (ou classe base) herda e todas as propriedades propriedades de sua e adiciona suas nicas

particulares. As propriedades da classe base no precisam ser repetidas em cada classe derivada. Esta capacidade de fatorar as propriedades comuns de diversas classes em uma superclasse pode reduzir dramaticamente a repetio de cdigo em um projeto ou programa, sendo uma das principais vantagens da abordagem de orientao a objetos.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |5

Evoluo da POO
No se configura como uma mudana de paradigma abrupta. Evoluiu de ideias j manifestadas h muito tempo. Larry Constantine - (Dcada de 1960) Foi quem primeiro lanou a ideia de que softwares poderiam ser projetados antes que fossem programados. O. J. Dahl e K. Nygaard - (1966) - Foi quem primeiro lanou a ideia de Classes introduzida na linguagem Simula. Alan Klay, Adele Goldberg e outros - (1970) iniciaram o conceito de Mensagem e Herana, usados na linguagem SmallTalk. Programao orientada a objetos uma evoluo da programao estruturada que na programao estruturada temos funes (procedures ou rotinas) e dados (normalmente globais) que podem ser acessados por qualquer funo. Na programao orientada a objetos, temos funes agregadas aos dados em uma unidade chamada objeto, ou seja, os dados no esto separados das funes, mas sim unidos s mesmas. Hoje, a grande maioria das linguagens de programao, baseada em objetos (OO). As bases da Orientao a Objetos na compreenso do mundo, os seres humanos utilizam-se de trs mtodos de organizao dos pensamentos: Diferenciao Distino entre todo e parte Classificao V a orientao a objetos, como tcnica para modelagem de sistemas, utiliza estes mtodos para diminuir a diferena semntica entre a realidade e o modelo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |6

importante observar e compreender que as linguagens orientadas a objeto so aderentes a trs conceitos fundamentais: Classe, Herana e Polimorfismo.

Exemplos de Classes e Objetos Classe PRODUTO Atributos Cdigo Descrio Preo de Custo Preo de Venda Quantidade Operaes Comprar Vender Objetos 1 Vassoura R$ 2,00 Objetos 100 Joo da Silva Rua Fulano, 20 Classe CLIENTE Atributos Cdigo Nome Endereo Data Nascimento Limite de Credito Operaes Alterar limite Classe VEICULO Atributos Marca Modelo Cor Ano fabricao Velocidade mxima Operaes Ligar Desligar Objetos Marca X Neturno Azul

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |7

Abstrao
Abstrao consiste de focalizar nos aspectos essenciais inerentes a uma entidade e ignorar as propriedades acidentais'' Em termos de desenvolvimento de sistemas, isto significa concentrar-se no que um objeto e faz antes de se decidir como ele ser implementado. O uso de abstrao preserva a liberdade para tomar decises de desenvolvimento ou de implementao apenas quando h um melhor entendimento do problema a ser resolvido. Muitas linguagens de programao modernas suportam o conceito de abstrao de dados; porm, o uso de abstrao juntamente com polimorfismo e herana, como suportado em orientao a objetos, um mecanismo muito mais poderoso. O uso apropriado de abstrao permite que um mesmo modelo conceitual (orientao a objetos) seja utilizado para todas as fases de desenvolvimento de um sistema, desde sua anlise at sua documentao.

Compartilhamento
Tcnicas de orientao a objetos promovem compartilhamento em diversos nveis distintos. Herana de estrutura de dados e comportamento permite que estruturas comuns sejam compartilhadas entre diversas classes derivadas similares sem redundncia. O compartilhamento de cdigo usando herana uma das grandes vantagens da orientao a objetos. Ainda mais importante que a economia de cdigo a clareza conceitual de reconhecer que operaes diferentes so na verdade a mesma coisa, o que reduz o nmero de casos distintos que devem ser entendidos e analisados.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |8

O desenvolvimento orientado a objetos no apenas permite que a informao dentro de um projeto seja compartilhada como tambm oferece a possibilidade de reaproveitar projetos e cdigo em projetos futuros. As ferramentas para alcanar este compartilhamento, tais como abstrao, encapsulao e herana, esto presentes na metodologia; uma estratgia de reuso entre projetos a definio de bibliotecas de elementos reusveis. Entretanto, orientao a objetos no uma frmula mgica para alcanar reusabilidade; para tanto, preciso planejamento e disciplina para pensar em termos genricos, no voltados simplesmente para a aplicao corrente.

Objeto
Um objeto denota uma entidade, seja ela de natureza fsica, conceitual ou de software. Um objeto pode ser definido como um mdulo que agrupa um estado e um comportamento. O estado interno de um objeto representado pelos campos que so armazenados na memria primria, e pode ser alterado ao longo da vida do objeto. O comportamento de um objeto definido pelo seus mtodos. Cada mtodo composto por um conjunto de instrues com a capacidade de alterar o estado do objeto. Os mtodos incorporam um conjunto de aes que esto diretamente relacionadas com as estruturas de dados contidas nos campos de dados do objeto.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

Pgina |9

Entidades fsicas: um carro, uma pessoa, uma casa Entidade conceitual: um organograma de uma empresa Entidade de software: um boto em uma GUI

PESSOA
Classe

(PESSOA) Marcos Y

(PESSOA) Gustavo X

(PESSOA)

OBJETOS

Um objeto uma entidade do mundo real que tem uma identidade. Objetos podem representar entidades concretas (um arquivo no meu computador, uma bicicleta) ou entidades conceituais (uma estratgia de jogo, uma poltica de escalonamento em um sistema operacional). Cada objeto ter sua identidade significa que dois objetos so distintos mesmo que eles apresentem exatamente as mesmas caractersticas. Embora objetos tenham existncia prpria no mundo real, em termos de linguagem de programao um objeto necessita um mecanismo de identificao. Esta identificao de objeto deve ser nica, uniforme e independente do contedo do objeto. Este um dos mecanismos que permite a criao de colees de objetos, as quais so tambm objetos em si.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 10

A estrutura de um objeto representada em termos de atributos.

PESSOA
Classe

(PESSOA) Marcos Y

(PESSOA) Gustavo X

(PESSOA)

OBJETOS

PESSOA Nome: String Idade: 25


Classe

(PESSOA) Marcos Y 35

(PESSOA) Marcos Y 27

OBJETOS

A declarao de uma classe pode conter um ou mais atributos. Cada atributo da classe define um campo nos objetos que pertencem a essa classe. Classe possui atributos (declaraes). Objetos cada instncia dessa classe possui um campo correspondente declarao de um atributo. Exemplo classe Pessoa possui um atributo chamado idade, e a instncia X possui um campo chamado idade. O conjunto de campos de um objeto compe o seu estado.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 11

O comportamento de um objeto representado pelo conjunto de operaes que podem ser executadas sobre o objeto (procedimento e funes ). Objetos com a mesma estrutura e o mesmo comportamento so agrupados em classes. Um objeto algo que tem: Estado Comportamento Identidade

O estado de um objeto representa uma das possveis condies em que um objeto pode existir. O estado representado pelos valores das propriedades de um objeto em um determinado instante. O estado do objeto usualmente muda ao longo do tempo: Exemplo (Aluno Maurcio): Nome: Maurcio Matrcula: 105018 Semestre de Ingresso: 2009A

O comportamento determina como um objeto pode responder a interaes mediante ativao de operaes decorrentes de mensagens recebidas de outros objetos. O Comportamento determinado pelo conjunto de operaes que o objeto pode realizar.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 12

Classe
A declarao de uma classe descreve a estrutura de um conjunto ( potencialmente infinito ) de objetos. Na declarao da classe constam todos os mtodos e atributos comuns para todo um conjunto de objetos que pertencem a essa classe. Todo objeto uma instncia da classe qual ele pertence. Uma classe consiste de variveis e mtodos que representam caractersticas de um conjunto de objetos semelhantes. O conceito de classe dos pilares da programao orientada a objetos, por permitir a reutilizao efetiva de cdigo. Na construo de software usado o termo CLASSE, o que na verdade seria o objeto abstrato construdo computacionalmente. Quando o aplicativo executado voc vai utilizar essa classe dando assim "vida" ao objeto. Voc constri a classe onde fica seu cdigo e vai fazer uso dessa classe declarando uma varivel dessa classe que quando executado o programa a varivel ser uma instancia dessa classe onde chamamos de objeto. Em geral "criamos classes" e "instanciamos objetos". A criao de uma classe feita em tempo de projeto, quando voc esta codificando o seu software, o que envolve a escrita do cdigo fonte. O objeto criado em tempo de execuo, quando feita uma instancia da classe criado um objeto. A classe como se fosse um molde, voc constri o molde e depois utiliza para fazer diversos objetos. Uma classe a descrio de um grupo de objetos com propriedades Semelhantes semntica.
Ex 003

(atributos),

mesmo

comportamento

(operaes),

mesmos

relacionamentos com outros objetos (associaes e agregaes), e mesma

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 13

Um objeto uma instncia de uma classe. Exemplos de Classes

Voc, agora pode declarar a varivel do tipo TData criado.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 14

Herana
Assim, como a linguagem Java, a linguagem Delphi Language no implementa herana mltipla. Toda herana simples: Cada subclasse descende de uma nica classe. Uma classe pode dar origem a inmeras classes porem cada classe tem apenas uma classe ancestral. O mecanismo de herana permite declarar uma nova classe a partir de outra j existente. Isto pode ser feito de duas maneiras: por generalizao e por especializao.

CLASSE A

B Descendente de A

A Ancestral de B GENERALIZAO ESPECIALIZAO

CLASSE A

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 15

Neste caso a classe B herda automaticamente todos os atributos e mtodos da classe A. Na declarao da classe descendente B pode-se adicionar novos atributos e mtodos. Pode-se ainda, sobrepor ou redefinir mtodos e atributos herdados da classe ancestral A.

Generalizao e Herana
Generalizao e herana so abstraes poderosas para compartilhar

similaridades entre classes e ao mesmo tempo preservar suas diferenas. Generalizao o relacionamento entre uma classe e um ou mais verses refinadas (especializadas) desta classe. A classe sendo refinada chamada de superclasse ou classe base, enquanto que a verso refinada da classe chamada uma subclasse ou classe derivada. Atributos e operaes comuns a um grupo de classes derivadas so colocados como atributos e operaes da classe base, sendo compartilhados por cada classe derivada. Diz-se que cada classe derivada herda as caractersticas de sua classe base. Algumas vezes, generalizao chamada de relacionamento is-a (-um), porque cada instncia de uma classe derivada tambm uma instncia da classe base. Generalizao e herana so transitivas, isto , podem ser recursivamente aplicadas a um nmero arbitrrio de nveis. Cada classe derivada no apenas herda todas as caractersticas de todos seus ancestrais como tambm pode acrescentar seus atributos e operaes especficos.
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 16

EQUIPAMENTO Nome Fabricante Custo


Tipo de Equipamento

MOTOR Velocidade Potencia

BOMBA Presso de Suco Presso de descarga Taxa de Fluxo

Dicas de Desenvolvimento
Na construo de um modelo para uma aplicao, as seguintes sugestes devem ser observadas a fim de se obter resultados claros e consistentes:

No comece a construir um modelo de objetos simplesmente definindo classes, associaes e heranas. A primeira coisa a se fazer entender o problema a ser resolvido. Tente manter seu modelo simples. Evite complicaes desnecessrias. Escolha nomes cuidadosamente. Nomes so importantes e carregam conotaes poderosas. Nomes devem ser descritivos, claros e no deixar

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 17

ambiguidades. A escolha de bons nomes um dos aspectos mais difceis da modelagem. No enterre apontadores ou outras referncias a objetos dentro de objetos como atributos. Ao invs disto, modele estas referncias como associaes. Isto torna o modelo mais claro e independente da implementao. Tente evitar associaes que envolvam trs ou mais classes de objetos. Muitas vezes, estes tipos de associaes podem ser decompostos em termos de associaes binrias, tornando o modelo mais claro. No transfira os atributos de ligao para dentro de uma das classes. Tente evitar hierarquias de generalizao muito profundas. No se surpreenda se o seu modelo necessitar vrias revises; isto o normal. Sempre documente seus modelos de objetos. O diagrama pode especificar a estrutura do modelo, mas nem sempre suficiente para descrever as razes por trs da definio do modelo. Uma explicao escrita pode clarificar pontos tais como significado de nomes e explicar a razo para cada classe e relacionamento.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 18

Polimorfismo
Polimorfismo significa a capacidade de tomar vrias formas. Em programao orientada a objetos, polimorfismo se refere possibilidade de uma entidade referenciar instncias de vrias classes durante o tempo de execuo. Geralmente isto s possvel se a entidade for declarada em uma classe ancestral, que generaliza uma ou mais classes descendentes. Classe descendentes podem implementar de forma diferente um conjunto de operaes comuns definidas na classe base ( No Delphi, usamos as diretivas virtual e override para aplicar o polimorfismo)O conceito bsico do polimorfismo baseia-se no fato de que voc pode escrever uma chamada a um mtodo aplicando-a a uma varivel, mas o compilador somente poder determinar a verso do mtodo a ser efetivamente utilizada em tempo de execuo, de acordo com o tipo de objeto ao qual a varivel esta relacionada. a capacidade de tratarmos objetos de diferentes tipos de uma mesma maneira desde que eles tenham um ancestral em comum. Objetos de classes diferentes podem ter mtodos com mesmo nome e cada objeto responder adequadamente de acordo com seu mtodo. Mtodos da mesma classe podem ter o mesmo nome, desde que possuam quantidade ou tipo de parmetros diferentes.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 19

Supondo que voc crie um objeto chamado MeuObjeto, qual seria o efeito da chamada MeuObjeto.Voz? O mtodo a ser chamado dependeria da classe ao qual MeuObjeto pertence. Para que tenha a possibilidade de sobrepor um mtodo de ligao tardia em uma classe descendente, preciso que o mtodo seja definido como virtual na classe ancestral. Alm disso, voc deve escrever o novo mtodo com os mesmo parmetros do mtodo original e utilizar a palavra reservada Override. A diretiva Override importante para que o compilador faa a

correspondncia entre os nomes dos mtodos da classe me e da classe filha e verifique se o mtodo da classe me foi efetivamente definido como virtual. Voc, pode sobrepor um mtodo esttico, ou seja, um mtodo definido sem a diretiva virtual na classe bsica. Voc escreve o novo mtodo na classe derivada, sem a diretiva Override, e pode utilizar parmetros completamente diferentes do mtodo original. Como o novo mtodo no esta marcada como Override ele ser considerado como um mtodo qualquer da classe derivada e no como uma nova verso do mtodo da classe ancestral.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 20

Encapsulamento
Quando se deseja criar uma classe, voc precisa se preocupar primeiro com os aspectos essenciais dos objetos da mesma, e no com os detalhes de implementao da classe. Por exemplo: Um objeto da classe Carro tem uma operao Ligar Faris Dianteiros. O fabricante do veiculo pode modificar a fonte de alimentao dos faris, mudarem o tipo dos fios usados para levar os ate a energia necessria para faz-los funcionar, fazer com que eles consumam menos energia, etc. Porem conveniente que se mantenha um boto no painel do veiculo ou junto ao volante para ligar os faris dianteiros. Assim, as alteraes das caractersticas internas no vo prejudicar a interface entre o motorista e os faris. Em POO isso chamado de Encapsulamento. Voc deixa visvel apenas os aspectos externos do seu projeto. Assim, a qualquer momento, podem ser feitas alteraes nos detalhes de implementao para melhorar o desempenho, diminuir o uso de recursos como memria, espao em disco, etc. E essas alteraes no prejudicaro em nada os programas que utilizam aquele objeto. Os programas no precisaro ser alterados, pois a interface entre eles e o objeto nos ser alterada. Quando se defini uma classe, podemos colocar o nvel de acesso que voc deseja para cada um de seus campos e mtodos. Conforme o exemplo acima da classe Carro, um forma de definir o que pode ou no ser acessado atravs dos especificadores de acesso que so Private, Protected, Public e Problished.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 21

Private Sees private restringem o acesso aos campos, propriedades e mtodos nela declarados ao modulo onde esta definida a classe. Dentro do modulo onde est a definio da classe, os identificadores que forem declarados como private funcionaro como se fossem public, porem fora deste modulo eles no sero acessveis. Protected Sees protected restringem o acesso aos identificadores nela declarados somente s classes descendentes daquela. Isso proporciona a capacidade de criar novas classes que utilizam estas caractersticas sem permitir a utilizao destes identificadores por quaisquer outras partes do cdigo. Em outras palavras, um mtodo como protected pode ser chamado, e um campo protected pode ser lido ou escrito a partir da definio de qualquer mtodo pertencente a uma classe que descenda daquela que contem o membro. Public Identificadores declarados como sendo public no sofrem restrio de acesso, ou seja, ser visvel em qualquer lugar onde for declarado.

Published a parte Default de uma classe. Se nenhum especificar for definido, o compilador assume a declarao como Published.Este nvel tem a mesma visibilidade que Public a diferena, que no caso de membro Published gerada informao RTTI. RTTI (Run Time Type Interface) o que permite, entre outras coisas, que eventos e propriedades sejam manipulados atravs do Object Inspector.
Ex 004

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 22

So atravs destes membros ou nveis de visibilidades que encapsulamos nossos objetos.

Outro exemplo No exemplo, a seguir, o atributo Mes tratado pela property pMes, usando um mtodo setMes para tratar a escrita do atributo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 23

Mtodos
Declaraes de mtodos podem usar diretivas que no so usadas por outras funes ou procedimentos. Diretivas devem aparecer somente na declarao da classe, no na implementao do mtodo e deve obedecer sempre a seguinte ordem. Reintroduce; Overload; amarrao(binding); converso de

chamada (calling conversation); abstract Onde amarrao (binding) virtual, dynamic ou override; converso de chamada register, cdecl, stdcall ou safecall; e advertncia e plataform, deprecated ou library.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 24

Mtodos Estticos
Um metodo esttico um metodo declarado normalmente dentro de uma classe sem nenhuma diretiva. Quando um objeto faz uma chamada a um metodo estatico, o compilador resolve esta chamada em tempo de compilaao. Os metodos estaticos so executados mais rapidamente, porem no podem ser sobrescristos de forma a prover polimorfismo.

Ex 005

Amarrao (binding)
Use virtual ou dynamic na classe-pai quando estiver declarando um mtodo que poder ser alterado nas classes descendentes. Na classe descendente o mtodo devera ser redeclarado usando a diretiva Override.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 25

Se, em uma classe descente, uma declarao de mtodo especificar o mesmo identificador de mtodo e a mesma assinatura de parmetros de um mtodo virtual existente na classe-pai, mas no incluir a palavra Override, a nova declarao somente ocultara o mtodo herdado, sem alter-lo. Ou seja, ambos os mtodos existiro na classe descendente.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 26

Reintroduce
A diretiva reintroduce suprime as mensagens do compilador sobre ocultao de mtodos virtuais declarado em classe-pai.

Use reintroduce quando voc quiser que um novo mtodo da classe descendente oculte um mtodo virtual herdado da classe-pai.

Abstract
Um mtodo abstrato um mtodo virtual ou dinmico que no tem implementao na classe onde foi declarado. Sua implementao delegada para a classe descendente. Mtodos abstratos devem ser declarados com a diretiva abstract depois de virtual ou dynamic.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 27

Mtodos Virtuais
Mtodos virtuais so metodos que permitem que classes descendentes os substituam, ou estendam, permitindo assim que uma classe descendente altere a funcionalidade da classe ancestral. Para declararmos um metodo virtual simplesmente indicamos a diretiva Virtual no fim da declarao do mesmo conforme mostrado anteriormente. Mas na classe descendente deve ser acrescentada a diretiva Override aps a declaraao do metodos. Outro detalhe muito importante que o compilador no resolve a chamada a um mtodo virtual em tempo de compilao, mas em tempo de execuo. O resultado prtico disto que o nosso aplicativo ir utilizar o mtodo de acordo com a instncia que a varivel estiver utilizando e no atravs do seu tipo que foi declarado. O mecanismo dos mtodos virtuais junto com a utilizao da herana que nos permitir criar objetos polimrficos.

Overload - Sobrecarga de Funes


Um mtodo pode ser redeclarado usando a diretiva Overload. Nesse caso, se o mtodo redeclarado tiver uma lista de parmetros diferentes daquela do seu ancestral, ele vai sobrecarregar o mtodo herdado, sem ocultar-lo. Chamar o mtodo em uma classe descendente ativa a implementao em que a lista de parmetros combinarem com a lista de parmetros passada. Se voc sobrecarregar um mtodo virtual, use a diretiva reintroduce para redeclar-lo nas classes descendente.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 28

Como pode observar no exemplo acima, a idia de sobrecarga simples: Voc pode definir varias funes e procedimentos com o mesmo nome e parmetros diferentes, utilizando a diretiva Overload. Com base nos parmetros, o compilador determina qual a verso correta da verso a ser chamada em determinado instante.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 29

Construtores
Um construtor um mtodo especial que cria e inicializa objetos. A declarao de um construtor se parece com a declarao de um procedimento. Porem comea com a palavra Constructor. Apesar da declarao do construtor no especificar valor de retorno, um construtor retorna uma referencia ao objeto que ele cria, ou seja, um ponteiro para a mesma. comum o nome o construtor ser Create. Podemos utilizar o construtor de uma classe para inicializar algusn campos internos e ate mesmo conferir alguma funcionalidade bsica mesma. Toda classe possui um Construtor. Para criar um objeto, chame o mtodo construtor para a classe desejada. MeuObjeto := TMinhaClasse.Create;

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 30

Geralmente, a primeira ao em um construtor chamar um construtor herdado da classe-pai para inicializar os dados herdados. Depois, o construtor criado por voc deve inicializar os novos campos introduzidos na classe descendente. J que um construtor sempre limpa a memria para um novo objeto, todos os campos comeam com valores de zero (tipos ordinais), NIL (apontadores e classes), vazios (strings), ou Unassigned (variantes). Ento, no h necessidade de inicializar campos na implementao de um construtor, exceto se voc desejar valores diferentes de zero, nil, vazio e Unassigned.

Destrutores
Um destrutor um mtodo especial que destri o objeto para qual ele chamado e desaloca sua memria. A declarao de um destrutor se parece coma declarao de um procedimento. Porm, ele comea com a palavra reservada Destructor.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 31

Para chamar um Destrutor, voc deve fazer referencia a um objeto. MeuObjeto.Destroy;

Opes de Visibilidade
Nesta fase devemos esconder do ambiente externo nossa classe objetos que so exclusivamente destinados ao funcionamento interno da mesma, ou objetos aos quais desejamos evitar um acesso direto ao seu contedo. Todos os membros, mtodos e propriedades de uma classe tm um atributo chamado visibilidade, que indicado por uma das palavras reservadas: private, public, published ou automated. Published property Cor: TColor read GetColor write SetColor Declaram uma propriedade chamada Cor, com visibilidade published. A visibilidade determina onde e como um membro poder ser acessado, com private representando a menor acessibilidade, protected representando um nvel de acessibilidade intermedirio e public representando o maior nvel de acessibilidade. Membros Private, Protected e Public Novamente Um membro private invisvel fora da unidade ou programa onde sua classe foi declarada. Em outras palavras, um mtodo private no pode ser chamado a
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 32

partir de outro modulo, e um campo ou propriedade private no pode ser lido ou escrito a partir de outro mdulo. Colocando classes relacionadas no mesmo

mdulo, voc pode dar a elas acesso aos membros private das outras sem precisar das aos membros um nvel de acessibilidade maior. Um membro protected visvel em qualquer lugar do mdulo onde sua classe esta declarada e a partir de qualquer classe descendente, no importando o modulo onde a classe descendente aparea. Um mtodo protected pode ser chamado, e um campo protected pode ser lido ou escrito a partir da definio de qualquer mtodo pertencente a uma classe que descenda daquela que contem o membro. Membro que so projetados para uso apenas na implementao de classes derivadas so, geralmente, protected. Um membro public ser visvel em qualquer lugar onde a classe for referenciada. Membros published tm a mesma visibilidade que membros public. A diferena que, no caso de membros published gerada informao de tipo RunTime (RTTI). RTTI permite que uma aplicao consulte os campos e propriedades de um objeto dinamicamente e localize seus mtodos. RTTI usado para acessar os valores de propriedades quando se esta salvando ou lendo arquivos de formulrios, para exibir propriedades no Object Inspector, e para associar mtodos especficos (manipuladores de eventos). Se a declarao de um membro aparece sem especificadores de visibilidade, o membro tem a mesma visibilidade do membro anterior.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 33

Voc pode aumentar a visibilidade de um membro em uma classe descendente redeclarando-o, mas no pode diminuir sua visibilidade. Por exemplo, uma propriedade protected pode se tornar public em uma classe descendente, mas no pode se tornar private. Alm disso, membros published no pode se tornar public em uma classe descendente.

DICA
Ao usar um objeto de uma classe, voc dever:

1. 2. 3. 4.

Declarar o Objeto; Criar o objeto; Usar o objeto; Destruir o objeto

Para podemos melhor compreender todo conhecimento at o momento apresentado, vamos desenvolver uma classe e seus mecanismos em um nvel mais de cdigo do que visual. Vale ressaltar neste momento que este um exemplo mais de baixo nvel para que possamos visualizar claramente os conceitos apresentados. Teremos outro exemplo mais de alto nvel onde utilizaremos a Orientao Objetos em nvel mais visual.
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 34

Exemplo Pratico - Poligono

Criando uma Classe Polgono


1 Passo - Crie uma nova aplicao e adicione uma unit vazia ao nosso projeto.

2 Passo - Nesta nova Unit, declare uma nova classe na seo Interface. 3 Passo Crie uma classe que ter a funcionalidade de desenhar polgonos regulares a partir de um ponto base.
DICA
Polgono: uma figura plana formada por trs ou mais segmentos de reta que se intersectam dois a dois. Os segmentos de reta so denominados lados do polgono. Os pontos de interseco so denominados vrtices do polgono. A regio interior ao polgono muitas vezes tratada como se fosse o prprio polgono.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 35

4 Passo J sabemos que uma classe um conjunto de estruturas de dados e mtodos. Vamos continuar a aplicao definindo, alguns campos para a nossa classe. Declaraes de classes no podem aparecer dentro de procedure ou functions. Elas podem ser declaradas na seo interface ou implementation. Geralmente usamos a seo Interface para a declarao de classes. Como nossa classe representar um polgono, definiremos campos internos a esta classe para armazenar o seu tamanho base e nmeros de lados.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 36

Adicione a Unit Windows clusula uses da seo interface da nossa unit (O tipo TPoint est definindo nesta Unit )

Um construtor um mtodo especial que tem a finalidade de criar uma instancia da classe e retornar um ponteiro para a mesma. Podemos utilizar um construtor de uma classe para inicializar alguns campos internos e at mesmo conferir alguma funcionalidade bsica mesma. Vamos agora declarar e implementar um Construtor para a classe TPoligono e em seguida veremos a relao entre uma classe e um objeto.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 37

Quando um construtor de uma classe chamado, ocorrem as seguintes aes. alocada uma nova rea de memria onde esto armazenados todos os campos do novo objeto. O bloco de memria alocado totalmente preenchido com zeros. Isto significa que campos inteiros so inicializados automaticamente com zeros, os tipos strings contero strings vazios, ponteiros recebero o valor Nil e valores booleanos sero inicializados com falso. Ao fim da execuo do construtor o mesmo retorna uma referencia nova classe criada.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 38

Um destrutor assim como existem mtodos especiais para criao de um objeto, existe um mtodo especial, responsvel por liberar toda a memria utilizada pelo mesmo. Em nosso exemplo o destrutor da nossa classe s precisa liberar a memria alocada pelo construtor, no precisamos implementar nada no destrutor. A classe TObject j define um destrutor com esta finalidade. Quando queremos executar um mtodo da classe ancestral antecedemos o nome do mtodo com a palavra reservada Inherited.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 39

Mtodo Free
A classe TOject define um mtodo chamado Free que sempre deve ser utilizado ao invs de executarmos diretamente o destrutor da classe. Este mtodo possui a caracterstica de no provocar uma exceo se estivermos tentando acessar um objeto invlido (que j foi destrudo, por exemplo). Na verdade, o mtodo free verifica se o valor da varivel, que representa a classe instanciada, diferente de Nil, se for, ele chama o mtodo destroy da classe. Agora vamos declarar um mtodo esttico na classe TPoligono da seguinte forma (adicione clausula uses da seo interface as unit graphics) Declarao do cabealho.

Declarao da implantao.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 40

Para testarmos a nossa Classe TPoligono, adicione ao Form os seguintes componentes.

Acrescente clausula uses da seo implementation a unit da classe TPoligono.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 41

Implemente o seguinte cdigo para o evento onClick do boto Polgono.

Neste ponto compile e execute a aplicao, testando o desenho de polgonos com nmeros de lados variados. Mtodos virtuais so mtodos que permitem que classes descendentes os substituam, ou estendam, permitindo assim que uma classe descendente altere a funcionalidade da classe ancestral. O mecanismo dos mtodos virtuais junto com a utilizao da herana que nos permitir criar objetos polimrficos. Para melhor fixarmos os conceitos, criaremos a seguinte estrutura de classes.

TPoligono TTriangulo
Professor Marcos Antonio Moreira

TQuadrado

Reviso: 08/2012 - Verso: 2.2

P g i n a | 42

Vamos acrescentar a diretiva virtual aps o construtor da classe TPoligono. Devemos declarar as classes descendentes e seus construtores com a diretiva Override (dessa forma sobrescrevemos o construtor da classe ancestral)

Vamos implementar os construtores.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 43

Agora, vamos criar um mtodo virtual na classe TPoligono e sobrescrev-lo na classe descendente TTriangulo. Adicione a seguinte declarao de mtodo na classe TPoligono.

Adicione a declarao do mtodo na classe TTriangulo da seguinte forma.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 44

Vamos implementar o mtodo.

Agora, adicione ao final do mtodo Desenhar da classe TPoligono a seguinte linha de cdigo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 45

Vamos adicionar dois novos botes ao Form da aplicao.

Implemente o event handle onClick dos botes. Primeiro o Button Triangulo e logo em seguida o Quadrado.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 46

Compile e execute a aplicao e observe o resultado. Voc poder concluir que, mesmo quando atribumos uma instancia de TTriangulo a uma varivel TPoligono, o mtodo Preencher a ser executado o da classe descendente. Para poder visualizarmos o funcionamento remova a diretiva virtual do mtodo Preencher da classe TPoligono e a diretiva override do mtodo Preencher da classe TTrangulo. Execute a aplicao novamente e observe o resultado. Depois retorne com as diretivas aos mtodos novamente.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 47

Mtodos Dinmicos
So basicamente idnticos a mtodos virtuais, sendo declarados com uso da diretiva dynamic. A diferena bsica entre um tipo e outro est nos mecanismos utilizado para a resoluo da chamada ao mtodo. A implementao de mtodos dinmicos favorece o tamanho do cdigo enquanto a implementao dos virtuais favorece a velocidade.

Mtodos Abstratos
Existem situaes em que voc quer que vrios objetos descendente de uma classe tenham um mtodo em comum, contudo a classe ou superclasse no tem este mtodo. Nesta situaes, declaramos o mtodo na superclasse e dizemos que um mtodo abstrato. A declarao de um mtodo abstrato feita adicionando as diretivas virtual e abstract aps a declarao do mtodo. Procedure SetX(value: Double); virtual; abstract; A declarao do mtodo SetX acima informa ao compilador que ele no deve esperar encontrar a implementao do mtodo mais adiante. Vamos adicionar classe TPoligono o mtodo abstrato Area e implementar -lo nas classes descendentes TTriangulo e TQuadrado. Na classe TPoligono, adicione o mtodo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 48

Adicione tambm s classes descendentes e implemente em cada uma:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 49

No se esquea de adicionar na Uses na Interface a unit SysUtils. Agora, adicione ao final do cdigo dos eventos dos botes referente ao Tringulo e ao Quadrado o seguinte cdigo. Triangulo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 50

Quadrado.

Vamos compilar nossa aplicao e verificar o resultado.

Como podemos observar, o campo FTamanhoBase da classe TPoligono destinou a mesma a uma funo definida e restrita aos limites da classe. Esta propriedade prov uma valor bsico que, dividido pelo numero de lados do polgono, nos fornece um tamanho de lado que resulte em polgonos da rea semelhante. Isto tem por objetivo impedir que os polgonos desenhados extrapolem os limites da tela. Vamos alterar nossa classe TPoligono. O campo deve ser visvel a classes externas. Entretanto, como posteriormente permitiremos o acesso a esta varivel atravs de uma propriedade vai definir sua visibilidade como private. Veja, nossa classe TPoligono aps alterao.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 51

As classes descendentes no possuem objetos ou mtodos para os quais devemos restringir a visibilidade, porem, como a visibilidade default published, temos que inserir a diretiva public antes dos mesmos.

Como restringindo a visibilidade varivel FNumLados, agora devemos prover mtodos de acesso ao contedo da mesma. Se declararmos estes mtodos como pblicos, o desenvolvedor ter acesso a varivel pela chamada aos mesmos. Isso tira um pouco da elegncia do cdigo, porem atende ao nosso propsito funcional.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 52

Esta era a forma tradicional de se trabalhar at o lanamento do Delphi, que trouxe um recurso novo e muito til na rea de proteo de cdigo: O conceito de Propriedade (Property) Como a porta de acesso nossa varivel ser uma propriedade que implementaremos posteriormente, declararemos nossos mtodos tambm na seo private conforme abaixo.

Em seguida, vamos implementar os mtodos definidos:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 53

Importante: Ao implementar mtodos de escrita de propriedade, cuidado para no cair em recursividade infinita, acessando a propriedade no lugar do campo interno do objeto.

Propriedade (Property)
Propriedade so atributos como nomes como os dos campos e que podem ter aes associadas leitura e escrita. Propriedades uma extenso natural aos campos de uma classe, pois permitem que o desenvolvedor parea estar trabalhando com estas, enquanto na realidade est executando chamadas a mtodos. Uma propriedade, como um campo, define um atributo para um objeto. Mas, enquanto um campo somente um local para armazenamento cujo contedo pode ser examinado e modificado, uma propriedade associa aes especificas a leitura ou alterao de seus dados. Propriedades oferecem controles sobre acesso aos atributos de um objeto e permitem que atributos possam ser calculados. A declarao de uma propriedade especifica um nome e um tipo, e inclui pelo menos um especificador de acesso. Especificadores uma seqncia de Read, Write, Stored, default. Cada propriedade precisa ter pelo menos um especificador Read ou Write.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 54

Read indica como ser obtido o valor da propriedade. Pode ser uma leitura simples do valor de um campo (Read FCampo) ou calculado atravs de uma funo que retorne um valor do mesmo tipo da propriedade. Write indica como ser alterado o valor do campo associado propriedade. Pode ser uma escrita simples no campo ou a execuo de um procedimento que poder, por exemplo, executar testes de validao nos dados e alterar outros campos tambm, se for o caso. Propriedades uma extenso natural aos campos de uma classe, pois permitem que o desenvolvedor sinta estar trabalhando com estas, enquanto na realidade esta executando chamadas a mtodos (Procedure ou Function)

Uma property tambm define um atributo, todavia podendo associar a aes relacionadas leitura ou modificao de sues dados. Assim, ao acessarmos uma property no estaramos acessando diretamente o contedo de um atributo, e sim, um procedimento que seria um intermedirio desse acesso. Esse procedimento permite a escrita de cdigos de validao e formatao dos atributos. Em resumo, propriedades representam um mecanismo, para encapsular os atributos (privates) de uma Classe, sobrecarregando as operaes de leitura e escrita.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 55

Property Nomepropriedade:

TipoPropriedade Read Campo ou mtodo de leitura Write Campo ou mtodo de leitura

Nomepropriedade Qualquer identificador valido na linguagem. Para propriedade do tipo array deve ser declarado como: Nomepropriedade [Index: TipoIndice] Campo Campo que guardar o valor da propriedade quando no quisermos utilizar mtodos de acesso. Por converso, todo e qualquer campo comea com a letra F de Field. Mtodo de Leitura

um mtodo que controla o acesso de leitura da classe. Deve ser uma funo que retorna o mesmo tipo da propriedade, por exemplo:
Private Fcampo: Integer; Funtion GetCampo: Integer; Published Property Campo: Integer Read GetCampo write FCampo;

Mtodo de Escrita

um mtodo que controla o acesso de escrita da classe. Deve ser uma procedure que tem um parmetro do mesmo da propriedade, por exemplo:
Private Fcampo: Integer; Procedure SetCampo Value: Integer; Published Property Campo: Integer Read FCampo write SetCampo;

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 56

Observao: Se um acesso de escrita no for especificado, a propriedade somente para leitura (read-only)

Definindo Propriedades Agora, vamos definir nossas propriedades NumLados da classe TPoligono:

Se tentarmos compilar nossa aplicao neste momento recebemos uma mensagem de erro dizendo que FNumLados um identificador no declarado. Isto ocorreu devido perda de visibilidade ao campo FNumlados por partes de units externas classe TPoligono. Para sanarmos o problema, devemos substituir referencias ao campo

FNumlados externas units da classe TPoligono por referencias propriedade NumLados.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 57

Execute a aplicao e tente sugerir o desenho de um polgono com menos de trs lados. Propriedade do Tipo Array Propriedades do tipo Array permitem a implementao de propriedades indexadas, ou seja, uma propriedade que utiliza mtodos de acesso a um array atravs do seu ndice. Ateno: No iremos entrar no conceito de Propriedades do Tipo Array.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 58

Ateno: Tenha em mente que todos os nossos exemplos devem ser salvos para que sempre que houver a necessidade de utilizar o exemplo novamente, voc o tenha de forma fcil para acessar e continuar seus estudos.

Exemplo Pratico Carro e Aviao

Segundo Exemplo Objeto Carro e Avio


Vamos para o nosso segundo exemplo de Orientao Objeto na prtica. Agora, com um pouco de programao visual para que os conceitos sejam assimilados e fixados.

No Delphi, inicie uma nova aplicao VCL Win32. D o nome de FrmExemplo ao formulrio e salve-o nomeando a unit como uFrmMain.pas. D o nome de ClasseObjetos ao seu projeto. Crie o formulrio mostrado na figura abaixo (o texto dentro dos Edits indica o nome que voc deve dar a eles). Esse formulrio servir para entrarmos com os dados que sero usados para popular os objetos que criaremos a seguir. Observe que ele possui duas sesses, delimitadas por dois GroupBoxes. Os Edits sero usados para o usurio informar os valores para os atributos dos objetos. Os botes vo criar e liberar os objetos da memria.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 59

Vamos agora criar algumas classes, mas especificamente uma classe para representar um carro e uma para representar um avio. Clique em File>New>Unit. Salve a nova unit com o nome de uCarro.pas. Usando o mesmo procedimento crie uma unit chamada uAviao.pas Veja na Listagem 1 o cdigo das units. Observe a forma como declaramos uma classe Delphi. Veja tambm que cada classe define atributos. Por exemplo, um carro tem uma capacidade.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 60

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 61

Boa Prtica Seguindo um padro da maioria das linguagens orientadas a objetos, procure sempre declarar uma classe por Unit. Mas veja, no entanto, que a prpria VCL do Delphi no segue esse padro.

Volte ao formulrio principal e adicione as units uCarro e uAviao clausula uses da interface, para podermos ter acesso s classes definidas. Agora declare duas variveis na seo public do formulrio:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 62

O que est declarado dentro da sesso public pode ser acessado sem restrio em qualquer parte do cdigo. Essas variveis representaro instancias das classes que acabamos de criar, e sero manipuladas pelos controles de tela do formulrio principal. No boto Criar (do objeto Carro) digite o cdigo da imagem abaixo. Como o prprio nome sugere, o boto criara uma instancia do tipo TCarro, atribuindo isso ao objeto chamado Carro. Isso e feito chamando o construtor da classe, um mtodo especial chamado Create. Ainda no cdigo, aps criar o objeto, inicializamos seus atributos com base nos valores digitados na tela.

Agora vamos fazer o mesmo para objetos do tipo TAviao. No boto Criar (do objeto Avio) digite o cdigo da imagem abaixo. O que fazemos aqui e a mesma coisa que fizemos para o carro instanciaram uma classe e inicializamos seus atributos conforme os dados que o usurio digitar na tela.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 63

Quando chamamos o Create, o objeto passa a ocupar um espao na memria. Isso porque um objeto e uma instncia real de uma classe. Aps ser utilizado, ele precisa ser destrudo. J cuidamos da criao dos objetos, usando Create. Agora vamos cuidar da destruio. Isso pode ser feito chamando o mtodo Free do objeto. Ento no boto Liberar (do objeto Carro) digite o cdigo da das imagens abaixo. Da mesma forma, para o avio, no boto Liberar digite.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 64

Pronto! J podemos testar as funcionalidades bsicas implementadas at aqui. Execute a aplicao com F9 e faa os testes. Informe os valores para os atributos do Carro e clique em Criar. Depois libere-o. Criando Mtodos

Como voc pode ter visto, at agora criamos apenas as classes com atributos, ou seja, definimos as caractersticas de um carro, de um avio. No tratamos ainda de outro importante papel de qualquer classe, a funcionalidade, seu comportamento. Enquanto atributos e propriedades definem as caractersticas de uma classe, mtodos servem para definir o que uma classe pode fazer. Por exemplo, um carro pode entrar em movimento. Vamos ento criar um mtodo chamado Mover. Abra a declarao de TCarro e declare o mtodo Mover, como mostrado na imagem abaixo.

Aperte Shift+Ctrl+C para que o Delphi gere o cabealho da implementao para o mtodo que acabamos de definir. Implemente o mtodo como mostrado abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 65

Declare na sesso interface Dialogs na clusula uses da unit uCarro, para que possamos usar a funo ShowMessage. Agora vamos permitir que o usurio, aps criar um objeto Carro usando o formulrio, possa coloc-lo em movimento, chamando seu mtodo Mover. No formulrio principal, nas opes do objeto carro, coloque ento um boto como Caption Mover. No seu evento OnClick digite o cdigo abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 66

Evento de o boto Mover Carro.

Agora repita os mesmos passos para classe TAviao. Na imagem abaixo, veja a implementao do mtodo Mover para TAviao.

Aperte Shift+Ctrl+C para que o Delphi gere o cabealho da implementao para o mtodo que acabamos de definir. Implemente o mtodo como mostrado abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 67

Declare na sesso interface Dialogs na clusula uses da unit uCarro, para que possamos usar a funo ShowMessage. Evento de o boto Mover Avio.

Execute a aplicao. Preencha os Edits com dados para criar os objetos, crie-os e a seguir coloque-os em movimento clicando nos respectivos botes, e veja o resultado obtido at aqui.

Muito bem, isso finaliza a primeira parte deste nosso exemplo. No se esquea de salvar todo o seu projeto que em breve estaremos novamente implementando novas funcionalidades a este exemplo. Ainda pouco sobre

tudo o que ainda vamos ver sobre OO em Delphi. Mas o que foi visto aqui fundamental: Realizamos um exemplo TPoligono totalmente Orientado a Objeto mostrando os conceitos de Herana, Polimorfismo e Encapsulamento de forma prtica e na sua essncia (no brao).

Neste ltimo exemplo, mesclamos um pouco de Orientao Objeto de forma um pouco visual, pois de forma fcil aprendemos a declarar classes, com atributos e mtodos. Vimos como instanciar essas classes, que a partir desse processo, geram objetos. Nos objetos, preenchemos seus atributos com valores para definir suas caractersticas e chamamos mtodos para testar a funcionalidade.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 68

Voc pode notar, por exemplo, que ambas as classe que criamos TCarro e TAviao possuem caractersticas em comum, como a descrio e capacidade. Alm disso, ambas as classes tem comportamentos semelhantes, como a capacidade de se movimentar. Isso nos levar a dois importantes conceitos da orientao a objeto, a Herana e Polimorfismos.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 69

Nota Importante

Ponteiro

um importante conceito de qualquer linguagem de programao,

seja ela Orientada a Objetos ou no. Um objeto uma estrutura que ocupa espao na memria. Quando declaramos uma varivel do tipo integer, por exemplo, um espao alocado na memria imediatamente, dependendo do

escopo desta varivel (se um procedimento, de um unit, de uma classe).


Porem estruturas mais complexas, como classes, que possuem vrios atributos e ocupam mais espao na memria, no so alocados automaticamente na memria. Precisamos criar instancias dessas classes, criar os objetos, em tempo de execuo. Ou seja, a alocao de memria dinmica. Esse conceito surgiu h muito tempo. A idia simples. Declaramos uma estrutura, que guardar informaes sobre um cliente, mas no alocaremos o espao em memria para alimentar essa estrutura at que seja realmente necessria. Ao invs disso, criamos uma varivel que aponta (da o nome ponteiro) para outra varivel que representa essa estrutura. No pascal antigo, usvamos o smbolo ^ para representar um ponteiro. Ento, um ponteiro basicamente um numero, um endereo de memria, que voc pode usar para referenciar outra varivel, que ser realmente criada em outro momento. O verbo referenciar usado na frase anterior no foi por acaso. Variveis que apontam para outras variveis so conhecidas na programao como variveis

de referencia.
No Delphi, ainda existe o conceito de ponteiros, mas no precisamos trabalhar diretamente com eles. Por exemplo, Form1 um Ponteiro. A estrutura da classe TForm1 s vai ser usada quando o mtodo Create for chamado. Antigamente, mtodos como GetMem, AllocMem etc. eram usados para alocar memria reservada por ponteiros. Quando um objeto, que na verdade um ponteiro, no est apontando para nada, ele possui o valor NIL (nulo, ou null, como usado em outras linguagens). FreeAndNil, recurso criado no Delphi 5 e citado no comentrio do cdigo acima, pode ser usado para automaticamente liberar um objeto e fazer com que o ponteiro seja anulado, no apontando para uma posio de memria onde no existe mais objeto real.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 70

Exemplo Pratico Membro

Terceiro Exemplo
Vamos
para o nosso terceiro exemplo de Orientao Objeto na prtica

seguindo a mesma receita do mtodo anterior que a programao visual para que os conceitos sejam reforados e fixados. Vamos entender os detalhes de herana, polimorfismo e classes, utilizao de interface onde iremos abordar os conceitos por traz da parte da programao. Porque a programao Orientada a Objeto muito importante no desenvolvimento de software. Com a Orientao a objeto voc consegue a reutilizao de cdigo. Podemos imaginar a paleta de componentes que so objetos e alguns desses objetos tm a capacidade visual e outros no. Como exemplo o objeto TString, TStringList que utilizado dentro de outro componente. Todos esses objetos/Classes incorporam funcionalidades de tal forma que conseguimos reutiliz-los sem ter que ficar digitando seu cdigo. Imagine se toda vez que for criar uma aplicao ter que digitar um cdigo para colocar um boto ou um Edit no formulrio. Ento alguns objetos que so sempre reutilizveis com capacidade visual ns conseguimos transform-los em componentes. J outros objetos, no tem a necessidade de ser um componente como, por exemplo, a classe TStringList, onde eu no preciso colocar um componente TStringList dentro de um Form e depois utilizar-los como se fosse um componente, pois para meu usurio que esta utilizando o programa, ele no precisa ver os itens da lista mas se ele quiser, eu no vou criar um TStringList, vou colocar no Form um componente ListBox. Ento, dependendo da funcionalidade da sua aplicao ou do objeto ou classe que esta criando, voc pode transform-lo em um componente visual ou em algo que no seja visual, ou seja, uma Classe. Como exemplo, uma classe de produto onde eu no preciso ter um componente Produto no Form, eu
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 71

simplesmente preciso ter que esta classe exista e que ela tenha alguns mtodos como incluir produto, alterar e etc. Vamos comear revendo novamente alguns conceitos da orientao a objeto. O que uma Classe?

Uma classe um aglomerado de funcionalidades. Por exemplo, temos uma classe TPessoa. Essa classe TPessoa, incorpora todas as funcionalidades e atributos de uma Pessoa. (CPF, RG, Nome, Endereo) podemos dizer que uma classe uma coleo e o Objeto um membro dessa coleo. Vamos criar uma classe simples definindo em uma nova unidade (Unit) conforme figura abaixo. A partir desta classe criada, podemos definir vrios membros dessa classe.

Insira um Button no formulrio principal conforme figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 72

Vamos criar uma varivel de nome OBJ do tipo TPessoa conforme imagem. No se esquea de adicionar na uses do formulrio principal, a unit classe.

Voc pode notar que alguns procedimentos e funes, j esto criados e prontos para serem utilizados. Mas, voc deve esta se perguntando, de onde vieram esses mtodos? Toda classe tem um ancestral comum que o TOBJECT. Como no foi definido uma classe para TPessoa, ele herda de forma implcita da classe base que TObject. Lembre se que toda classe herda de TObject. Aps criar, podemos liberar a classe da memria conforme abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 73

Veja que agora criamos um nome na classe TPessoa e podemos utiliz-la em nosso objeto.

importante dizer que as boas prticas de programao, nos dizer que no devemos colocar as propriedades, funcionalidades e as caractersticas dessa classe de maneira conforme mostrada na imagem abaixo, ou seja, de maneira como se fossem variveis globais.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 74

Observe que Nome e uma informao pertencente Classe TPessoa e no pertencente a unit Classe.

Bom, qual a melhor maneira para trabalhar com essa informao? Existem as propriedades, como as cores dos olhos, cabelo, cor da pele e idade. Agora, as classes tambm possuem mtodos como, por exemplo, andar, falar, levantar, ou seja, so aes que sero executadas pela nossa classe. Em nossa primeira classe TPessoa, iremos criar uma propriedade chamada Nome essa propriedade ela pode ser acessada pelos objetos dessa classe ou uma propriedade que pode ser acessada somente dentro da Classe. Veja o escopo de visibilidade abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 75

Private: Tudo que for definindo nesta seo, somente poder ser acessado dentro da minha classe, ele esta protegido. Protected: Tudo que for definindo nesta seo, somente poder ser acessado dentro da minha classe e das minhas classes filha que so filha de TPessoa. Public: Tudo que for definindo nesta seo poder ser acessado dentro da minha classe e dentro das minhas instancias. Published: Tudo que for definindo nesta seo poder ser acessado por qualquer coisa. A diferena entre Public e Published, so que as variveis definidas em published, so acessadas na guia de propriedade e eventos do Object Inspector. Deve se observar que algumas propriedades no ficam como published elas ficam protegidas. Por qu? Porque no h necessidade ainda de se exibir esta propriedade nesse momento. Ento, vamos colocar nossa propriedade conforme abaixo. Uma propriedade pode ser Read-Only onde ela somente tem um mtodo de leitura. O campo deve ser do mesmo tipo da propriedade.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 76

Se realizarmos a compilao agora, no conseguimos atribuir o valor para a minha varivel nome. Porque no podemos atribuir valores para variveis Read-Only, ou seja, somente de leitura. Toda vez que acessamos a propriedade Nome, ele vai dentro do campo FNome, e pega o valor que estar armazenado dentro dele e retorna para a minha propriedade Nome.

Por exemplo: Vamos criar dentro da visibilidade Public, um Constructor conforme imagem abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 77

Pressione as teclas Ctrl + C para montar a estrutura e chamamos o construtor da classe pai e atribuir para o campo FNome o valor Univale.

Vamos para o evento do Button1Click e realizamos a seguinte alterao e em seguida, compile.

Repare que toda vez que algum quiser ler o contedo da propriedade Nome, a minha Classe deve ler o contedo da varivel FNome. Lembre se que esta varivel (campo) foi inicializada no Create. Agora, se nos quisermos permitir que uma instancia possa alterar o contedo de uma propriedade, eu no posso dizer que ela Read-Only e sim Write ou seja ela pode ser escrita. Desta forma podemos alterar sem nenhum problema o valor desta propriedade.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 78

O que estamos fazendo, que antes da varivel ser mostrada, est sendo atribuindo a ela um novo valor. O valor que foi atribudo no evento Create foi substitudo. Vamos observar passo a passo como tudo ocorre depurando nossa aplicao. Ento, nossas propriedades podem ser somente Read-Only, somente Write, ou seja, depois que atribuir no pode ser acessado ou leitura e escrita (Write). Quando eu falo que uma propriedade pode ser de leitura ento eu posso ler o contedo de uma varivel ou o contedo de uma funo. Para ler o contedo de uma varivel, faa conforme figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 79

Para ler o contedo de uma funo, voc deve utilizar conforme cdigo abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 80

Como estamos escrevendo o valor direto na varivel, uma boa prtica escrever o valor atravs de um procedimento.

Faa alterao na property, conforme figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 81

Vamos verificar novamente o comportamento depurando nossa aplicao.

Lembre-se, que a leitura no realizada direto na varivel e sim no campo atravs da funo GetNome e escrevendo via procedimento SetNome. Mas, voc deve estar se perguntando, Marcos, qual a diferena de trabalhar com funes e trabalhar com campos. Quando trabalhamos com funes conseguimos uma organizao e um trabalho encapsulado do nosso cdigo. Mas, o que trabalhar de forma encapsulada? quando no expomos os campos das propriedades. Como por exemplo: Se em determinado momento haja a necessidade de alterar um comportamento, da nossa propriedade Nome em uma classe Filha, existe esta possibilidade. Porque todo o contedo responsvel de gerenciar nossa propriedade, esta dentro de um mtodo de leitura e escrita que pode ser alterado em mtodo de classe filha. importante ressaltar que para que um mtodo ou varivel possa ser acessvel em classes filhas, eles devem estar no mnimo dentro do escopo de visibilidade Protected. Vamos agora, criar outra propriedade (property) chamada usurio.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 82

Nome momento da leitura do Nome feita a seguinte verificao.

Vamos alterar o cdigo do evento Onclick do boto para que se faa uma simples leitura do contedo da varivel.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 83

Voc deve estar se perguntando, no foi inicializada a propriedade usurio. Exatamente, aps compilar e executar o programa, a seguinte mensagem mostrada.

Mas, porque isso ocorreu? Porque agora foi adicionado dentro das minhas propertys, quem pode fazer leitura e quem pode fazer escrita. Podemos fazer da mesma forma para atribuir o Nome.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 84

Vamos alterar o cdigo do evento Onclick do boto.

No momento da leitura do valor Nome, ele vai continuar lendo o valor que foi inicializado pelo construtor da Classe. Por qu? Porque no momento que estou tentado fazer a leitura no Nome vale uma ressalva que no foi possvel nem de fazer a gravao do valor Delphi. No foi possvel gravar a informao Delphi, porque no foi atribudo o Usurio. Como no foi definido o Usurio, e tento fazer a gravao, o usurio est vazio ento no possvel mudar. possvel verificar que desta forma podemos gerenciar o acesso quando trabalhamos com mtodos e no diretamente com o campo.

Como seria se fosse trabalhar com Nome (FNome)? Deveramos impedir que a classe fosse instanciada, pois estamos fazendo a leitura direta da varivel ento no posso impedir. Algumas perguntas quanto trabalhamos com mtodos. Quantas leituras foram realizadas do objeto? Quem leu? Em que momento foi realizado a leitura?
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 85

Ento, muito importante trabalharmos com mtodos, pois desta forma, estamos encapsulando, ou seja, estamos protegendo que as pessoas faam o acesso direto aos campos que so privados e que correspondem as nossas propriedades. Vamos alterar o cdigo do evento Onclick do boto.

Como foi atribudo o valor UNIVALE para Usurio, conseguimos escrever e ler o valor da minha propriedade. Uma tima oportunidade pelo qual devemos trabalhar com Campos.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 86

Herana

Falando um pouco de herana em conjunto com a nossa classe. Vamos criar dois mtodos e alterar a propriedade Usurio conforme figura abaixo.

Pressione as teclas Ctrl + Shift + C para que seja montado o esqueleto das nossas funes declaradas.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 87

Vamos alterar todos os nossos mtodos para o escopo de visibilidade protegida (Protected) caso seja necessrio alterar seu comportamento.

Na funo GetNome e na precedure SetNome, vamos fazer a seguinte alterao.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 88

Agora vamos criar outra classe chamada TPessoFisica que filha da nossa classe criada anteriormente TPessoa.

O que estamos fazendo criar uma nova coleo (TPessoaFisica) que vai herdar todas as caracterstica da classe TPessoa e tendo a vantagem de estender novas funcionalidades para classe filha TPessoaFisica. Para que possamos comprovar o real funcionamento desta herana, faa a seguinte alterao no evento Onclick do boto. Voc pode notar que o programa continua funcionando corretamente mesmo voc alterando para a classe filha (TPessoaFisica). Mas porque isto possvel? Simplesmente a classe filha herdou todas as caracterstica da classe ancestral TPessoa.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 89

Se fizermos uma alterao no escopo de visibilidade em nossas propriedades (Property) retirando elas de Public e passando para Protected, vai ocorrer o seguinte erro.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 90

Este erro ocorreu porque mtodos protegidos somente podem ser acessados por classes filhas. Para que uma instancia possa acessar um mtodo deve estar no escopo de visibilidade Published ou Public. Volte visibilidade public ao normal para que o cdigo funcione corretamente. Vamos agora estender mais duas novas funcionalidades para a nossa classe TPessoaFisica.

Pressione as teclas Ctrl + Shift + C para que seja montado o esqueleto. Repare que o Delphi aps o pressionamento das teclas, j montar a sesso Private com as funes e procedure declaradas.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 91

Vamos alterar o escopo de visibilidade de Private para Protected e criar duas variveis.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 92

Dentro das declaraes digite conforme figura abaixo.

Desta forma, conseguimos implementar novas funcionalidades para nossa classe filha TPessoaFisica. Marcos, e se eu quiser que toda vez que algum for acessar a propriedade Usurio da classe TPessoaFisica, o valor sempre ser um valor fixo ou seja quero alterar o comportamento dessa propriedade. Temos como alterar o comportamento de uma propriedade subscrevendo (Override) seu mtodo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 93

Pressione as teclas Ctrl + Shift + C para que seja montado o esqueleto.

Observe o seguinte erro que ocorrem apos esta alterao.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 94

No podemos sobrescrever alguma coisa que esttica. Devemos sempre pensar que toda vez que desejarmos mudar um comportamento de um mtodo, este mtodo no pode ser esttico. Mas, o que um mtodo esttico?

um mtodo que no pode sofrer Override, ou seja, um mtodo que no pode ter seu comportamento alterado. Para que possamos alterar um comportamento de um mtodo em classes filhas ele deve ser Dinmico (Dynamic) ou Virtual (Virtual). Um mtodo Virtual quando utilizado pelo compilador algo denominado Virtual Memory Table (VMT) onde sero colocados todos esses mtodos dentro de uma tabela. Toda vez que criamos uma classe, criado uma tabela virtual para essa classe. Quando criamos um mtodo nessa classe, criada outra tabela virtual para os mtodos desta classe denominado VMT. Desta forma, conseguimos adquirir velocidade gastando um pouco mais de memria, pois estamos alocando uma tabela para cada classe. J o mtodo Dynamic, consome menos memria do que o mtodo Virtual, mas seu acesso mais lento do que acesso por tabela. Basicamente uma questo de desempenho e numero de transaes que voc vai realizar. Imagine realizando 2.000.000 de transao por segundo em cima de um objeto. Seria mais interessante se preocupar com velocidade do que pela quantidade de memria utilizada. Vamos sempre utilizar nosso mtodos como virtuais. Vamos alterar todos os nossos mtodos para virtuais caso seja necessrio sobrescrever (Override) em classes filhas.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 95

Compile a aplicao e veja o resultado.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 96

Voc deve ter notado, que o valor OBJ.Nome := 'Delphi'; foi desprezado. Marcos, e se eu quiser pegar o valor que foi gravado mais a palavra Pessoa Fsica. Como posso fazer para pegar estes valores? seguinte forma: No cdigo abaixo, estamos atribuindo o valor Delphi para Nome. Mas, onde que Nome foi declarado? Ele foi declarado na classe TPessoa. Bom, devemos fazer da

Lembre-se que uma classe filha consegue acessar os objetos, campos e mtodos de uma classe me (ancestral) utilizando da palavra reservada chamada Inherited. Em nosso constructor, utilizamos desta palavra.

Ns fazemos a seguinte leitura. Herde o construtor da classe pai, ou seja, chame primeiro o construtor do objeto para realizar alocao de memria e o que for necessrio. Depois inicialize minhas variveis.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 97

Desta mesma forma, podemos fazer da seguinte forma. Faa a depurao neste momento para que voc possa visualizar o funcionamento.

Ento que dizer que fazer Override nada mais que fazer uma alterao no comportamento. Mas importante ressaltar que para fazer o Override, devemos ter o encapsulamento definido.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 98

Reviso: Classe: Uma coleo de funcionalidades que sero utilizadas pelos objetos da mesma. Encapsulamento: Proteger os objetos, ou seja, os campos desta classe. Para uma classe esta encapsulada, as variveis ou campos desta classe somente podem ser acessados por meios de mtodos. Lembra que retiramos os campos de dentro das propriedades (property) FNome e Fusuario e passamos a utilizar mtodos.

Sobrecarga

ou

Override

que

capacidade

de

podermos

alterar

comportamento, ou seja, uma funcionalidade em uma classe filha.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 99

Marcos, o que Overload? No confunda Overload com Override, pois Overload no fazer sobrecarga, ou seja, mudar o comportamento. Overload ter o mesmo mtodo com mais de um comportamento. O que vai mudar o comportamento deste mtodo sero os parmetros que vo ser utilizados. Vamos criar um mtodo protegido em TPessoa, conforme imagem abaixo.

Pressione as teclas Ctrl + Shift + C para que seja montado o esqueleto.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 100

Voc deve adicionar a Unit Dialogs na sesso interface para utilizar o comando ShowMessage.

O que muda um mtodo do outro? Simplesmente sua assinatura. Em um, no temos parmetro e em outro temos somente um parmetro e no ltimo, definido com dois parmetros. Observe que no preciso reescreve todo o cdigo novamente. Vamos fazer a seguinte alterao no cdigo do evento Onclick, compilar e verificar o comportamento do programa.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 101

Ento, pessoal o que foi visto at o momento. Classe Herana Polimorfismo (que foi mudar a forma que mtodo foi executado) Override Overload (sobrecarga) Escopo de Visibilidade (Private, Protected, Public e Published )\

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 102

Exemplo Posto de Gasolina

Quarto Exemplo
Vamos para o nosso quarto exemplo de Orientao Objeto na prtica seguindo
a mesma receita do mtodo anterior que a programao visual para que os conceitos sejam reforados e fixados. Agora, vamos fazer um pouco diferente, toda a explicao ser realizada dentro do ambiente de desenvolvimento.

Exemplo Biblioteca

Quinto Exemplo
Vamos para o nosso quarto exemplo de Orientao Objeto na prtica seguindo
a mesma receita do mtodo anterior que a programao visual para que os conceitos sejam reforados e fixados. Agora, vamos fazer um pouco diferente, toda a explicao ser realizada dentro do ambiente de desenvolvimento.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 103

Introduo a Criao de Componentes


Antes de iniciar a construo de um componente voc deve se perguntar sobre a real necessidade da sua construo. Essa necessidade se d quando voc tem algum elemento em sua aplicao, seja grfico ou no, que sempre ter um comportamento padro e ser usado diversas vezes dentro de uma aplicao. Tambm se torna clara a necessidade de criar um novo componente quando existe a possibilidade de us-lo em aplicaes que futuramente voc possa vir a desenvolver. Alias como voc viu nas explicaes anteriores, um dos grandes objetivos do uso de componentes ganhar produtividade atravs do reaproveitamento de cdigo. Outro ponto importante saber por onde comear. Ser que melhor construir um componente do zero ou j aproveitar algum fazendo as melhorias que voc necessita? A VCL (Visual Component Library) do Delphi fornece a voc uma variedade bem grande de componentes. E na maioria das vezes, o que voc vai precisar implementar melhorias aos componentes j existentes. Por outro lado, se o componente a ser construdo no possui nenhuma semelhana com os componentes j existentes, ou seja as caractersticas do novo componente no podem ser herdadas de nenhum outro, voc deve ento iniciar a construo do seu componente a partir do TComponent, o ancestral de todos os componentes . Vamos fazer da seguinte forma: A construo de um componente para verificao de nmeros de CPF, o TVerCPF.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 104

Criando a Unit do Componente


Para facilitar a criao de componente o Delphi oferece uma pequena ferramenta (wizard) que ir lhe auxiliar na criao no s das especificaes como tambm da unit do componente.

Para acessar-la, segui os passos conforme as imagens abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 105

Clique no boto Finish.


Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 106

Na imagem acima, criada a unit contendo a nova classe do componente pronto para ser implementada. As visibilidades conforme j explicadas, seguem os mesmos princpios. Vamos relembrar um pouco de cada uma delas: Private Como o prprio nome indica este escopo contm todas as declaraes de variveis/campos, funes e procedimentos privados do componente, ou seja, apenas o prprio componente pode acessar o que aqui for declarado. Lembre-se que uma procedure declarada nesta seo no pode
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 107

ser entendida como um mtodo, uma vez que somente o prprio componente poder acess-la.

Protected Esta seo um pouco mais avanada que a anterior e muito utilizada no desenvolvimento de componente genricos, aqueles componentes que so usados como base para outros componentes. Para uma aplicao que usa o seu componente, as declaraes desta seo no podem ser acessadas, mas os componentes que sejam herdeiros do seu componente tero acesso total.

Public Nesta seo ser declarada a interface do componente com o mundo externo, ou seja, todas as funes e procedimentos que podero ser acessadas ou solicitadas ao componente. Apenas para lembra, quando anteriormente dissemos quer um TEdit possui um mtodo chamado Clear ou Caption, porque durante a implementao deste componente o procedimento em questo foi declarado na seo public. As nicas coisas que fazem parte da interface do componente e que no devem ser declaradas aqui so as propriedades que aparecero na janela do Object Inspector. Mas, e se voc mesmo assim declarar uma propriedade nesta seo? Isso acontecendo voc ter uma propriedade disponvel apenas em tempo de execuo (run-time), o que tambm tem sua utilidade, como o caso da propriedade Modified do mesmo componente TEdit. Voc no visualiza na janela do Object Inspector, mas pode acess-la via programao. Published Aqui voc deve declarar todas as propriedades que fazem parte da interface do componente e que devem aparecer na janela do Object Inspector.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 108

A declarao da procedure chamada Register, que deve estar presente em todos os componentes, nada mais do que uma solicitao ao Delphi para registrar o componente TVerCPF, na paleta de componentes (toolbox) Univale.

Adicionando Funcionalidades
Nesse ponto voc j poderia compilar e instalar o componente TVerCPF, no entanto ele ainda no possui nenhuma funcionalidade. Ento vamos incluir a primeira propriedade neste componente. Esta propriedade, que se chamar NumeroCPF ser a responsvel por receber e armazenar o numero do CPF que queremos verificar. Como os nmeros de CPF devem ser do tipo 999999999999 necessrio que est propriedade seja do tipo string. Faa algumas alteraes em seu cdigo de forma que a especificaes do componente fique da seguinte forma:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 109

Quando

criamos

uma

propriedade,

na

verdade

estamos

fazendo

uma

referencia a uma varivel (FNumeroCPF) que conter o valor daquela propriedade. Em nosso casso, a varivel FNumeroCPF ser responsvel por armazenar o contedo da propriedade NumeroCPF. Normalmente o nome da varivel o mesmo da propriedade, precedido da letra F.

A declarao

Equivale a dizer o seguinte: A propriedade NumeroCPF do tipo string e o seu valor ser lido (read) da varivel FNumeroCPF. As alteraes nesta propriedade sero escritas (write) na varivel FNumeroCPF.

Vamos criar outra propriedade, s que agora ser do tipo Boolean e dever conter o valor True ou False, informando se o numero do CPF verdadeiro ou falso. Faa as alteraes em seu cdigo de forma que ele fique conforme a imagem abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 110

Usando Procedure para Escrita


As vezes, surge a necessidade de no se escreve o valor da propriedade de forma direta na varivel. quando criamos as chamadas procedure de escrita (write). Para criarmos uma procedure de escrita, devemos fazer uma alterao na declarao da propriedade NumeroCPF, de forma que ela passe a ficar da seguinte forma: (Pressione as teclas Ctrl+Shift+C )

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 111

Como ela ser usada apenas internamente pelo componente, inclumos a sua declarao na seo private. Agora que declaramos a procedure SetNumeroCPF e a definimos como mtodo de escrita, precisamos fazer a sua implementao.

Observe que esta procedure recebe como parmetro a varivel Value que contm o valor da propriedade NumeroCPF e que dever ser escrito na varivel FNumeroCPF. Outro fator importante, que na implementao houve o acrscimo do prefixo TVerCPF ao nome da procedure.
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 112

Isso utilizado para informar ao compilador que a implementao do procedimento SetNumeroCPF pertence classe TVerCPF.

Criando Automatismos
Neste ponto voc deve estar se perguntando: Como fazer para que, ao alterar a propriedade NumeroCPF, a propriedade Valid responda automaticamente se o CPF valido ou no? Esta funcionalidade ns iremos montar, usando a procedure de escrita (write) que acabamos de criar. Ao invs de apenas atribuir o novo valor varivel FNumeroCPF, como foi feito h pouco, vamos aproveitar para verificar a sua validade e ajustar a propriedade Valid para que reflita a validade do CPF. Assim, a implementao da procedure SetNumeroCPF passar a ficar conforme a imagem abaixo:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 113

Como voc pode observar, agora, foi includo um novo elemento. uma chamada a funo ValidadeDoCPF que tem por finalidade avaliar o nmero do CPF que passado como parmetro e retornar os valores True ou False. Esta funo ainda no foi declarada nem implementada, vamos fazer isso agora. Como esta funo ser restrita ao prprio componente, iremos declar-la na seo private. Assim, como para qualquer outro procedimento, a sua implementao tambm deve ser aps a palavra reservada implementation, da mesma forma como foi para a procedure SetNumeroCPF. Aps estas incluses, o cdigo da sua unit dever ficar conforme imagem abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 114

Na funo ValidadeDoCPF, voc deve ter observado a manipulao de uma varivel de nome S. Essa varivel o parmetro recebido pela funo ValidadeDoCPF e contm o nmero do CPF a ser avaliado em forma de uma string. Quando chamamos a funo:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 115

Informamos FNumeroCPF como parmetro da funo ValidadeDoCPF. Dessa forma estamos, implicitamente, atribuindo o valor de FNumeroCPF varivel S. Agora que o cdigo do nosso componente est pronto, vamos salvar todas estas alteraes. Bom, neste momento, devemos criar um PACKAGE (pacote) para realizar a instalao do nosso componente a tool palette do Delphi e testar o novo componente.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 116

Criando outro Componente


Vamos construir um componente baseado no TEdit com diversos recursos, permitindo que o desenvolvedor selecione alguns tipos de entrada de dados e dependendo de cada caracterstica, formataremos o texto e permitiremos ou no a digitao de alguns caracteres.

Crie uma nova unit no Delphi e mo obra! Para desenvolver nosso componente iremos utilizar as Units: Classes, SysUtils, Graphics, StdCtrls, Controls, Messages e Windows, portando, acrescente-as na clausula uses. Primeiro criaremos um tipo que nos auxiliara na escolha do tipo do nosso Edit. Neste vamos utilizar um tipo texto, numrico, CPF e CNPJ.

A classe ir chamar TMeuEdit, que ser um descendente de um TEdit.

Agora iremos declarar dois mtodos na rea privada de nossa Unit. Os mtodos sero utilizados no decorrer da criao do nosso componente. Na construo de cada mtodo irei explicar melhor cada um deles.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 117

Na rea protegida iremos declarar quatro mtodos.

Na rea publica, declare os seguintes mtodos.

Agora as propriedades que sero publicadas no Object Inspector

Aps declarar todos os mtodos, vamos comear a construo do nosso componente. O primeiro passo declarar o procedimento de registro do mesmo e sua implementao.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 118

O mtodo de registro o RegisterComponents, que recebe dois parmetros: o primeiro o nome da paleta que ser criada/utilizada e o segundo um vetor que recebe os componentes que esto sendo criados. Agora, vou explicar o mtodo CREATE, onde passamos um valor default para nossas propriedades.

O mtodo de validao de CPF e CNPJ no entrarei em detalhes. Para melhores esclarecimentos, ningum melhor que o prprio site da receita federal.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 119

O mtodo para ajustar a cor apenas verifica se o componente esta em foco e se estiver, passa a cor com foco ou a propriedade color recebe o valor da cor sem foco.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 120

O mtodo de ajuste do texto tem caractersticas prprias, portanto vamos fazer um passo a passo do mtodo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 121

O mtodo CREATEParans executado sempre quando criamos ou recriamos um componente. Neste momento, vemos qual o tipo de alinhamento que esta setado e ajustamos a cor e o texto.

Quando um componente numrico recebe o foco, retiramos todos os caracteres e deixamos apenas os nmeros e o separador decimal, caso seja um texto nada realizado.

Ao sair do componente ajustamos a cor e o texto.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 122

Sempre que alterar o tipo do dado, faremos algumas alteraes que so fixas em nosso componente, deixando o alinhamento direita quando for numero, ou esquerda quando for um texto.

A propriedade Alignment, quando for alterada, nos obriga a reposicionar o texto conforme o alinhamento escolhido, atravs do mtodo RecreateWnd, o mesmo fazemos para todas nossas propriedades.

O mtodo TextoParaNumero uma maneira simples de retirar de um texto todos os caracteres que no sejam numricos.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 123

Subscrevendo o mtodo WNChar, que uma mensagem do Windows disparada sempre que uma tecla pressionada.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 124

Estendendo um Componente j Existente


Para concluirmos este capitulo de POO e componentes, vamos agora criar um componente que ser herdado de outro componente j existente. Desta forma, voc visualizar todo o poder RAD do Delphi e as vantagens da reutilizao de cdigos. Para este exemplo, vamos estender a funcionalidade de um componente muito utilizado da VCL do Delphi e muito utilizado pelos desenvolvedores. Este componente o TLabel. Vamos criar um relgio atravs do componente Label. Vamos abrir o Delphi e em seguida, Close File All. Lembre se que componentes no Delphi so colocados dentro de pacotes (package). Um pacote pode conter somente um componente ou vrios componentes em um mesmo pacote.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 125

Clique em Save All, de um nome ao arquivo de pkClock e escolha um diretrio onde ser salvo seu arquivo de pacote. Bom, agora podemos colocar um componente dentro deste nosso pacote. Para isso, basta selecionar Contains, e clicar com o boto direito do mouse Add New Other conforme figura abaixo, e em seguida clicar em Componente.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 126

Como nosso relgio na verdade uma label que vai mostrar apenas a hora, e para que eu no precise realizar a pintura do componente do zero, podemos ter como base a classe Tlabel, para que apenas configure seu texto. Ento vamos herdar nosso componente da classe TLabel.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 127

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 128

Bom, agora, vamos fazer algumas alteraes para que o relgio possa funcionar. Precisamos declarar um temporizador interno para que ele possa contar cada segundo. Para que voc possa fazer uma comparao, precisamos de um componente idntico ao Timer, mas como no podemos colocar um componente no cdigo, devemos fazer toda a criao de componente no brao, nada de forma visual tudo no cdigo. Faa alterao no seu cdigo conforme a figurar abaixo.

Precisamos tambm, fazer a criao deste campo (FTimer) no constructor da classe.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 129

Pressione Ctrl+Shith+C.

O que o cdigo acima significa? Quando o relgio (TClock) for criado, automaticamente nos criamos um timer interno que vai ser responsvel pela contagem. Devemos lembrar que se sou responsvel pela criao, tambm sou responsvel pela destruio.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 130

Bom, agora devemos fazer com que o relgio seja disparado a cada segundo. Ento, precisamos criar um mtodo privado de nome DoTimer que vai receber como parmetro, um TObject.

Preesione Ctrl+Shift+C

Caption da nossa Label (lembra que TClock uma TLabel) recebe a hora formatada utilizando a funo FormatDateTime. importante fazer a seguinte alterao no mtodo Create conforme figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 131

Foi por este motivo, que tivemos que declarar Sender no mtodo DoTime acima, para que fosse possvel, atribuir o evento OnTime em tempo de execuo ao mtodo DoTime.

Pessoal, se parece complicado, o que estamos fazendo via cdigo, basicamente o que vocs j esto acostumados a fazer que colocar componentes em um Form e alterar suas propriedade. Como por exemplo, colocar um componente Timer ao formulrio e alterar e programar seus eventos. Acontece que estamos fazendo tudo em tempo de execuo e via cdigo totalmente orientado a objetos. Ns no temos um Object Inspector para alterar propriedades e programar seus eventos de forma visual. Todos os eventos e propriedades devem ser atribudos no brao por ns. Voc deve lembrar que todos os eventos tm esta assinatura (Sender: TOBject). Caso contrrio, no seria possvel realizar a atribuio abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 132

Devemos realizar algumas outras alteraes conforme imagem abaixo. No esquea de declarar na uses da interface a unit Graphics para utilizar as cores.

Bom, nosso componente foi criado. No constructor ns criamos o Timer, inicializamos o evento, pintamos o componente com uma cara de relgio transformando nosso Label. No Destroy, destruamos nosso relgio e no evento DoTimer, um iterao a cada segundo. Pronto, agora faa a instalao do componente no Delphi.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 133

Contedo Extra Introduo ao Desenvolvimento de um Sistema


PROGRAM BASED LEARNING
AUTOR:
MARCOS ANTONIO MOREIRA

O objetivo desta metodologia, destacar o uso de um problema apresentado para o aprendizado, promove o desenvolvimento da habilidade de trabalhar em grupo, e tambm estimula o estudo individual, de acordo com os interesses e o ritmo de cada aluno. O aprendizado passa a ser centrado no aluno, que sai do papel de receptor passivo, para o de agente e principal responsvel pelo seu aprendizado. O professor que atuam como tutor (ou facilitador) nos grupos tm a oportunidade de conhecer bem os estudantes e de manter contato. Como ? A metodologia do PBL enfatiza o aprendizado auto-dirigido, centrado no estudante. Grupos de alunos at 06 divididos em sala/laboratrio com um docente que neste caso ser o tutor ou facilitador). Estaremos desenvolvendo um pequeno sistema onde ser apresentada a voc uma aula extremamente prtica de onde o ensinamento ser diferente da maneira tradicional de aprender. Objetivo deste mdulo apresentar um problema na qual, juntos resolveremos uma soluo desenvolvendo um sistema para atender ao cliente, aplicando os conceitos e prticas ministras nas disciplinas.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 134

importante destacar que o sistema proposto, foi adaptado do original DATACAR publicado e desenvolvido pela Revista ClubeDelphi do ano de 2002. Algumas rotinas foram alteradas e adaptadas para atender ao contexto proposto para esta didtica e ao novo RAD Studio Delphi 2010. Abaixo, segue o descritivo do problema a ser resolvido:

PROBLEMA

Todos ns conhecemos o funcionamento de uma loja de revenda de carros? Certo? simples! Nosso cliente deseja um sistema que atenda sua loja onde os dados do cliente so lanados no sistema, juntamente com o veculo que se deseja vender e as caractersticas do automvel. Cada veculo tem um marca, modelo e uma cor, alm dos seus respectivos atributos e acessrios. J os clientes que desejam realizar uma compra de um veculo, que chamaremos de clientes pretendidos, tambm so cadastrados no sistema, juntamente com o veiculo de sua preferncia. Ele precisa que com base nessas informaes cadastradas, poder efetuar uma busca para localizar um veiculo de acordo com a caracterstica pretendida pelo seu cliente.

Ateno Alunos: Deteremos-nos nos detalhes da linguagem e na analise de dados, sem nos preocuparmos em desenvolver um sistema complexo e seus problemas. Qualquer pergunta ou algo fora do contexto didtico apresentado, no ser respondida.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 135

MODELAGEM DE DADOS Desenvolver uma aplicao slida, rpida e robusta o desejo de qualquer desenvolvedor. O Delphi facilita o processo de desenvolvimento, pois traz uma grande quantidade de recursos e tecnologias, como DBExpress, WebSnap, DataSnap entre outros. Porm, a realidade mostra que muitos alunos se beneficiariam muito se vissem como construir uma aplicao do incio ao fim, utilizando os fundamentos bsicos da linguagem, como acesso a banco de dados SQL, relacionamentos, integridades e cach de dados, utilizando transaes e componentes de acesso a dados como a famlia TDatasets e TFields. Estes conceitos esto presentes em qualquer nvel de desenvolvimento, seja ele desktop, cliente/servidor, muiltcamadas (N-Tier) ou Web, portanto indispensvel domin-lo. O objetivo ensinar voc a construir uma aplicao completa e funcional, observando todos os detalhes da linguagem, e utilizando alguns os recursos do Delphi. Mesmo que voc no tenha nenhuma experincia, poder encontrar muitas dicas e tcnicas que utilizamos em nosso dia-a-dia como desenvolvedor, e que vamos compartilhar.

DECIDINDO PELO SISTEMA Escolher um sistema para desenvolver durante esse projeto no foi uma tarefa fcil. Mas tnhamos uma certeza em mente: o sistema deveria ser simples, pois no queramos que um aluno leigo em anlise tivesse dificuldades logo na modelagem. Algo simples como um sistema de controle de estoque, gerenciamento de biblioteca, contas a pagar e receber ou locadora seria interessante, porm estes sistemas j foram bastante discutidos e existem muito materiais na internet e em livros sobre eles.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 136

Por outro lado, um sistema acadmico, hospitalar ou para concurso de vestibular so grandes para o propsito desta didtica. Optei ento, por um sistema de Revenda de Veculos. Here we go! MODELO DE ENTIDADE E RELACIONAMENTO O primeiro passo para a construo de uma aplicao slida e robusta a modelagem de dados. Existem diversos mtodos de modelagem. Entre eles podemos citar o Modelo de Entidade e Relacionamento(MER), o Diagrama de Fluxo de Dados (DFD) e a Linguagem de Modelagem Unificada(UML). Usaremos aqui o MER, por ser um mtodo simples, eficiente e de fcil aprendizagem. Vale dizer que, antes de usar qualquer uma das metodologias citadas, preciso fazer o levantamento de requisitos do sistema, que composto por entrevistas a funcionrios e direo, visita empresa (no caso de sistemas feitos especificamente para uma empresa) ou pesquisa com empresas do mesmo gnero (no caso de sistemas genricos).

Para entendermos o MER, preciso que tenhamos em mente trs conceitos bsicos: entidades, atributos e relacionamentos. Uma entidade representa um objeto do mundo real, que tenha existncia independente na realidade analisada e que possa ser identificada de forma nica em relao aos demais objetos. Em nosso sistema, Cliente, Modelo e Veculo so exemplos de entidades. Conjuntos de entidades so representados no banco de dados por tabelas (mas estas no sero as nicas tabelas do banco como veremos depois).

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 137

Cada entidade possui um conjunto de atributos. So exemplos de atributos, o nome do cliente (nome_cliente) e sua da de nascimento (data_nasc). Para cada atributo, existe um conjunto de valores validos, chamados domnio. Para nome_cliente o domnio seria qualquer caractere alfanumrico; para data_nasc seria uma data valida.

Para uma entidade ser identificada unicamente no conjunto preciso que ela possua um atributo (ou um conjunto de atributos) que sejam nicos. A este atributo ou conjunto de atributos, chamamos de chave primaria. Um relacionamento uma associao entre duas (ou mais) entidades. Como por exemplo, podemos citar a relao entre as entidades que criaremos: Modelos e Marcas (um modelo esta relacionado a uma determinada marca). Para que este relacionamento seja possvel, preciso que a entidade modelo possua um atributo que faa referencia chave primaria da entidade marca. A este atributo damos o nome de chave estrangeira.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 138

CARDINALIDADE Entre os relacionamentos, existe a cardinalidade, que expressa o numero de entidades, s quais uma entidade pode estar associada. Os relacionamentos podem ter os seguintes tipos de cardinalidade: Um-para-um (1 para 1): uma entidade A pode estar associada a no mximo uma entidade B. Em nosso sistema no temos nenhum relacionamento deste tipo. Uma-para-muitos (1 para n): uma entidade A pode estar associada a varias entidades B, mas B pode estar associada a somente uma entidade A, Por exemplo: uma Marca esta associada a vrios Modelos. Muitos-para-um (n para 1): o inverso do anterior, claro. Uma entidade A pode estar associada a somente uma entidade B, mas B pode estar associado a varias entidades A. Por exemplo: vrios modelos esto associados a uma mesma marca. Muitos-para-muitos(n para n): uma entidade A est associada a qualquer numero de entidades B e vice-versa. Por exemplo: um modelo est associado a vrios tipos de acessrios, e um mesmo tipo de acessrio esta associado a vrios modelos. Sempre que tivermos um relacionamento do tipo muito-para-muitos, termos o surgimento de uma terceira tabela, a qual ir expressar esta relao no banco de dados. Para o caso do relacionamento entre modelos e acessrios no nosso modelo de dados, esta tabela foi chamada de ACESSRIOS_VEICULO.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 139

DIAGRAMA DE ENTIDADE- RELACIONAMENTO Definidos os conceitos, passamos agora a desenhar o diagrama ER do sistema. Para isto preciso que conheamos os smbolos que expressam cada um dos conceitos vistos anteriormente. Retngulos representam os conjuntos de entidades.

Losangos representam os conjuntos de relacionamentos.

Linhas

unem

os

conjuntos

de

entidades

aos

conjuntos

de

relacionamentos. Indicam tambm a cardinalidade dos relacionamentos. Podem ser de dois tipos: Uma linha direcionada do conjunto de relacionamentos A para o conjunto de relacionamentos B, especifica que a cardinalidade um-para-um ou muitos-para-um. Por exemplo: vrios modelos so de uma marca.

Uma linha no-direcionada do conjunto de relacionamentos A para o conjunto de relacionamentos B, especifica que a cardinalidade muitos-para-muitos; ou uma-para-muitos. Por exemplo: vrios veculos possuem o mesmo tipo de acessrio.

Existem ainda outros smbolos que no sero mostrados aqui, pois no so freqentemente utilizados.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 140

DEFINIO DAS TABELAS Para chegar s tabelas finais a partir do modelo de entidade e relacionamento, preciso detalhar mais a anlise, definindo tipos e restries, por exemplo: alm de realizar uma operao importante: a normalizao. Basicamente, a normalizao garante que no haja repetio desnecessria dos dados das tabelas e simplifica a manuteno a integridade das informaes armazenadas. Para nosso sistema, a normalizao resultara na criao de novas tabelas, uma para cada um dos relacionamentos muitos-para-muitos. O diagrama nos mostra que o banco de dados ser composto por nove tabelas principais. Cinco delas so facilmente identificadas a partir das entidades encontradas (os retngulos no diagrama): MARCAS, MODELOS, ACESSORIOS, CLIENTES e CIDADES. As demais tabelas surgem dos relacionamentos do tipo muitos-para-muitos. So elas:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 141

VEICULO_ATUAL surge da relao entre CLIENTES e MODELOS e representa os veculos que o cliente possui atualmente e deseja vender. VEICULO_PRETENDIDO surge da relao entre CLIENTES e MODELOS,

representando os possveis modelos de veculos que o cliente deseja comprar. VEICULO_ADQUIRIDO surge da relao entre CLIENTES e VEICULO_ATUAL, representa os veculos que foram comprados. ACESSORIOS_VEICULO acessrios. surge da relao entre VEICULO_ATUAL e

ACESSORIOS, uma vez que vrios veculos possuem o mesmo tipo de

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 142

SIMPLIFICAO NA MODELAGEM Procurei deixar o modelo de dados o mais simples possvel, para que os alunos com ou sem experincia no tenham dificuldades na implementao. Alguns campos da tabelas foram omitidos por razes didticas. Simplificaes foram feitas tambm para que algumas tcnicas de programao possam ser mostradas com mais facilidade. ESCOLHA DO SGBD Desenvolvido o projeto lgico do banco de dados, ou seja, a definio do conjunto de entidades/tabelas com seus atributos/campos e os respectivos relacionamentos, passamos agora para uma segunda parte a construo do banco de dados. Antes de tudo, preciso escolher o Sistema Gerenciados de Banco de Dados (SGDB) que ser usado. Para o desenvolvimento deste sistema, e conforme foi estudado na disciplina de banco de Dados, ser utilizado o Firebird. A escolha do Firebird se deve principalmente aos seguintes motivos: fcil instalao e configurao, suporte SQL padro ANSI, rpido, robusto (suportando grande quantidade de dados), aceita a criao de domnios para padronizao dos dados e multiplataforma.

CRIAO DO BANCO DE DADOS Executar Script Execute

Registrar o novo banco de dados no IBExpert

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 143

A LINGUAGEM SQL Embora normalmente se faa a referencia linguagem SQL como linguagem de consulta, ela nos fornece outros recursos como, por exemplo, a criao de tabelas e de regras de integridade e de segurana. A linguagem SQL dividida entre a Linguagem de Definio de Dados ( DDL) e Linguagem de Manipulao (DML). A DDL proporciona os comandos para criao, alterao e excluso de tabelas, ndices, relaes de integridade entre tabelas e regras de acesso. Engloba os comandos CREATE, ALTER e DROP, que sero estudados a seguir. A DML proporciona os comandos para insero, modificao e excluso de registros, alem da linguagem de consulta. Engloba os comandos INSERT, UPDATE, DELETE e SELECT. Estes comandos sero estudados mais adiante, durante o desenvolvimento do sistema.

DOMNIOS A linguagem SQL possui uma grande variedade de domnios pr-definidos. Entre eles: CHAR(uma cadeia de caracteres com tamanho (fixo), VARCHAR (uma cadeia de caracteres com tamanho varivel), INTEGER (nmero inteiro de valor longo), SMALLINT (um inteiro de valor pequeno), REAL (nmero de ponto flutuante), DATE (data, com dia, Ms e ano) e TIME (horrio com hora, minuto e segundo). Alm destes domnios, possvel criar outros (baseados nos existentes) conforme a necessidade do usurio. Entre as vantagens de se criar domnio est padronizao e abstrao de dados. A criao de um domnio feita com a seguinte sintaxe:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 144

Sintaxe Seguiremos alguns padres de notao: Palavras em maisculo e negrito so comandos da linguagem; Palavras entre os sinais de maior e menor (< e >) representam nome e valores a serem informados pelo usurio. Expresses ente colchetes so comandos no obrigatrio; Frases entre parnteses so comentrios dos autores.

CRIAO DOS DOMNIOS Vamos criar dois domnios. O primeiro deles para as chaves primrias das tabelas (como cdigo do cliente e do veculo) e o segundo para nomes. Para que um campo chave primria de uma tabela, ele no pode ser nulo (esta regra obrigatria). Alm disso, vamos definir que um cdigo deve sempre ter um nmero inteiro positivo (isso no obrigatrio, mas est padronizado pelo uso). J o campo que guardar o nome no poder estar em branco. Mostrar neste momento os domnios criados atravs do IBExpert.

CRIAO DAS TABELAS Depois de definidos todos os domnios, podemos criar as tabelas. O comando de criao de tabelas possui a seguinte sintaxe bsica: Sintaxe Assim sendo, temos duas formar de criarmos a tabela MARCAS:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 145

Sintaxe A forma anterior no utiliza domnios. Por isso criar a tabela desta maneira no ir estabelecer todas as regras que definimos para os campos (valor maior que zero para cdigo e nome diferente de vazio). J este comando cria a mesma tabela, mas com as regras (utilizando domnios): Mostrar neste momento os comandos de DDL para criao das tabelas e relacionamento atravs do IBExpert. REGRAS DE INTEGRIDADE Freqentemente desejamos garantir que um valor existente em uma tabela esteja presente em outra. Por exemplo, no podemos permitir a existncia de um modelo sem a prvia existncia de uma marca. Esse tipo de condio chamado de integridade referencial. Conforme figura apresentada acima. Observando a tabela MODELOS, apresentada na Figura acima notou a existncia de um campo chamado COD_MARCA que a chave estrangeira (foreign key) para a tabela MARCAS. Precisamos garantir que todos os cdigos inseridos neste campo encontrem relao na tabela MARCAS. Mostrar neste momento os comandos de criao da integridade das tabelas atravs do IBExpert.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 146

Sintaxe As clausulas ON DELETE e ON UPDATE especificam a ao a ser feita pelo banco quando o registro referenciado for excludo ou atualizado respectivamente. Escolhemos a opo NO ACTION para a excluso (no permitindo a excluso de uma marca que possua um ou mais modelos cadastrados), e CASCADE para a atualizao (se o valor do campo cdigo for alterado na tabela MARCAS, ser alterado tambm na tabela MODELOS). O comando que faz a integridade referencial entre a tabela MODELO e a tabela MARCA o seguinte: Sintaxe Todas as tabelas do sistema foram criadas com regras de integridade referencial e com a utilizao de domnios para os campos.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 147

INICIANDO O DESENVOLVIMENTO Neste sistema utilizaremos a plataforma Win32 do Delphi. Para acessar ao banco de dados utilizaremos DBExpress com Firebird. Iniciaremos o desenvolvimento das telas (prottipo) do formulrio principal e dos formulrios de cadastro. Cuidaremos apenas da parte visual, utilizando recursos de herana.

O FORMULRIO PRINCIPAL Comece criando uma nova aplicao Delphi Win32. Atribua o valor

FrmPrincipal para a propriedade Name do formulrio, e d para o Caption o valor de Datacar-Controle de Revenda de Veculos. Como salvamos o banco de dados no diretrio C:\<XXX>\Banco, vamos manter o padro, criando um diretrio Fontes dentro de C:\<XXX>. Salve a unit do formulrio como UPrincipal, e o projeto como DataCar. Para construir o menu principal e a barra de ferramentas formulrio principal utilizaremos os componentes. ActionManager e ImageList, em conjunto com os componentes MainMenu e TollBar, Um ActionManager simplifica e centraliza as caractersticas visuais e a manipulao botes. BOTES E IMAGENS Coloque no formulrio um componentes ImageList que ir armazenas as imagens utilizadas nos botes e menus do formulrio. D um duplo clique neste componente, e clique no boto Add para adicionar as imagens . Adicione ento algumas imagens com tamanho 16x16. Sugiro que voc sempre utilize o formato PNG para no ter problemas ao abrir as imagens. de eventos dos itens de menu e

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 148

As imagens devem representar os menus de Clientes, Marcas, Modelos, Cidade, Acessrios e Sair (tambm colocamos mais duas imagens adicionais para incrementar a barra de status, que criaremos em seguida). Caso voc no tenha as imagens apropriadas no seu computador, poder simplesmente solicitar ao professor ou utilizar as que acompanham o Delphi.

AES EM ACTIONMANAGER Coloque no formulrio um componente ActionManager. Aponte sua propriedade Images para ImageList1. D um duplo clique neste componente para abrir o editor de aes. Clique seis vezes no boto New Action para inserir as aes necessrias para o menu Cadastro. Agora voc deve configurar as propriedades de cada ao como a seguir.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 149

Configurar as propriedades de cada Action (Name, Caption, Hints, ImageIndex e Shortcut) conforme explicao do professor.

Selecione toas s aes e configure a propriedade Category para Cadastro. Futuramente colocaremos aqui aes de relatrios e procuras, que ficaro separadas por categorias. de tecla de atalho. Observe que o e comercial (&) na frente dos Captions indica que a letra a seguir ser sublinhada no menu, podendo servir

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 150

O MENU PRINCIPAL Coloque no FormPrincipal um componente MainMenu. Aponte sua propriedade Image para o ImageList1. D um duplo clique neste componente (MainMenu1) e ser aberto o Menu Designer, utilizado para construir menus. Selecione a de primeira clula de designer (caso esteja selecionada) e configure a propriedade Caption para &Cadastro. Repare que o Menu Designer j exibe o item criado abaixo. Neste novo item, no configure nada. Apenas aponte sua propriedade Action para Cad_ClientesVeiculos. O Delphi automaticamente obtm do ActionList todas das propriedades da ao escolhida e preenche as propriedades do item menu, como Caption, Hint, Image, etc. Repita a mesma operao para todas as aes. Antes do item de menu Sair, insira uma divisria, simplesmente configurando a propriedade Caption do item para -(hfen). Observe o menu na figura abaixo. menu (um TMenuItem). Clique sobre este item e note que outro item ser

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 151

BARRA DE FERRAMENTAS Coloque no formulrio um componente ToolBar. Aponte sua propriedade Images para ImagesList1, Abra a propriedade EdgeBorders e altere a opo ebBottom para True. Clique com o boto direito sobre ToolBar e escolha a opo New Button. Observe que o Delphi j coloca a imagem do ImageList no boto. Repita este processo para todos os cadastros e antes do item Sair, adicione um pequeno separador escolhendo a opo New Separator, tambm dando um clique com o boto direito. Selecione cada um dos botes (que so TToolButtons) e configure a propriedade Action de cada um deles, de forma semelhante ao que fizemos para os itens do menu. Atribua agora o valor True para as propriedades Flat, Autosize e ShowCaptions da ToolBar. Sua ToolBar deve ficar como na Figura abaixo.

BARRA DE STATUS PERSONALIZADA Coloque um componente StatusBar no formulrio principal. D um duplo clique nessa StatusBar e, no editor de painis que se abrira, clique duas vezes no New Item. Selecione os dois componentes TStatusPanel criados e atribua o valor psText para a propriedade Style. Ainda no editor, selecione somente o primeiro Panel, e atribua o valor PBL-Program Base Learning para a propriedade Text, e o valor 160 para a propriedade Width.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 152

Para dar uma mensagem de boas-vindas na StatusBar, faa o seguinte: abra o editor de cdigo (tecle F12 com o formulrio selecionado) e localize o cdigo que est logo abaixo da seo implementation. Digite o seguinte

D um duplo clique na rea do formulrio e digite, no evento OnCreate:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 153

FICHA DE CADASTRO Passaremos agora para a criao dos formulrios de cadastro. O layout dos formulrios - e a parte do cdigo fonte que trata dos dados cadastrais so sempre iguais. Todos eles possuem, entre outros componentes, um panel, uma barra de status e os botes Inserir, Gravar, Excluir, Procurar e Cancelar. O cdigo para estes botes sempre o mesmo: DataSet.Post para gravar, DataSet.Delete para excluir e assim por diante. Se para cada uma das tabelas, fossemos refazer a ficha de cadastro seria preciso incluir e configurar as propriedades de todos os componentes (botes, painis, barra de status, etc), incluir novamente as imagens dos botes (o que faria com que o tamanho do executvel aumentasse significativamente) e reescrever os cdigos correspondentes. Ao invs de refazer estes formulrios podemos usar um dos recursos mais interessante do Delphi, a herana visual de formulrios. (veja vdeo aula em minha pasta na rede) A principal vantagem do uso desses recursos esta no reaproveitamento da interface do cdigo e dos componentes que fazem parte do formulrio o que torna o desenvolvimento mais rpido e menos trabalhoso.

CONSTRUO DO FORMULRIO COM HERANA Para construir este formulrio adicione mais um formulrio ao projeto New Form na barra de ferramentas do Delphi. Configure a propriedade Name do novo formulrio para FrmFichaPai. Salve este formulrio como UFichaPai. Configure a propriedade BorderStyle para fbsSingle e, para BorderIcons, retire Maximize e Minimize alterando estas opes para False. Coloque neste formulrio um componente Panel. Configure sua propriedade Align para alTop e limpe seu Caption. Coloque dentro do Panel um componente DBText. Troque a fonte deste componente como desejar.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 154

Coloque um PageControl. Configure sua propriedade Align para alTop. D um clique de direita sobre o PageControl criado a escolha New Page. Configure a propriedade Name do novo TabSheet criado para Ficha. Coloque agora uma StatusBar e adicione dois Panel da mesma maneira que fizemos no formulrio principal. D o valor de Estado do DataSet e Hint do Cadastro para a propriedade Text dos painis da StatusBar. Coloque no formulrio, logo abaixo da PageControl, uma Painel e dentro deste Painel, cinco BitBtns. Configure os Captions desses botes para Incluir, Gravar, Excluir, Procurar e Cancelar, respectivamente. Troque a fonte dos botes na propriedade Font (Tahoma-negrito) e o name de cada boto da seguinte forma: (btnincluir, btngravar, btnexcluir, btnprocurar e btncancelar). Coloque imagens (na minha pasta na rede, tem algumas imagens) nestes botes configurando sua propriedade Glyph e selecionando um arquivo de imagem BMP e alterando a sua propriedade Layout para blGlyphTop. Coloque alguns Hint nos botes para indicar a sua funo. Por ltimo, coloque no formulrio um componente DataSource. Observe a Figura abaixo, para ter uma idia do layout final do formulrio.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 155

CADASTROS DESCENDENTES Agora criaremos as fichas de cadastro herdando as caractersticas do formulrio base criado. Para isso, chame o comando File|New>Other e na guia DataCar, escolha FrmFichaPai (Figura abaixo). Observe a opo Inherit, que indica que o formulrio ser herdado. D o nome de FrmFichaClientes ao novo formulrio e salve-o como UFichaClientes no diretrio Fonts. Altere a propriedade Caption do formulrio para Clientes. Repita esta operao para cada cadastro do sistema, criando um formulrio novo usando herana e salvando o arquivo. Tome por base o esquema da tabela abaixo, da figura a seguir:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 156

NOME DO FORMULARIO
FrmFichaVeiculoAtual FrmFichaVeiculoPretendido FrmFichaVeiculoAdquerido FrmFichaMarcas FrmFichaModelos FrmFichaCidades FrmFichaAcessorios

NOME DO ARQUIVO (.Pas)


UFichaVeiculoAtual UFichaVeiculoPretendido UFichaVeiculoAdquerido UFichaMarcas UFichaModelos UFichaCidades UFichaAcessorios

Logicamente nem todos estes formulrios sero chamados a partir do menu principal. O cadastro de veculo Atual, por exemplo, ser chamado a partir da ficha do cliente. Agora volte ao formulrio principal e d um duplo clique no ActionManger. (figura abaixo).

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 157

Selecione a ao Cad_Cliente_Veic e no evento OnExecute, digite:

Aperte Alt+F11 e escolha a unit UFichaClientes para ser usada. Repita o mesmo procedimento para as demais aes. Como usamos aes, o mesmo cdigo do evento fica disponvel tanto para o boto na ToolBar como para o item menu. Voc ainda pode apertar a tecla de atalho F2 para chamar o formulrio Clientes, pois configuramos a propriedade Shotcut da ao. (No utilizamos o F1 porque esta a tecla padro para ajuda). No se esquea de colocar os demais formulrios de forma a ser criados em tempo de execuo para que memria no seja utilizada de forma desnecessria conforme figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 158

Por ltimo no evento OnExecute da ao Sair, digite:

Execute a aplicao pressionando F9. Pronto! voc pode ver a tela principal do sistema j rodando. Bom, foi mostrado at o presente momento para voc, caractersticas do sistema a ser desenvolvido, elaboramos o MER baseado na anlise e no levantamento dos dados, e criamos o banco de dados no FireBird. Em seguida, iniciamos o desenvolvimento de um sistema, criamos formulrios de cadastro usando herana visual. Montamos tambm o formulrio principal com aes, menus e uma barra de status.

INICIANDO O ACESSO A DADOS Anteriormente criamos uma interface para as fichas de cadastro, porm, no adicionamos suas funcionalidades. Abra ento o formulrio FrmPichaPai que est na unit UFichaPai para iniciar a codificao. Quando abrir qualquer ficha de cadastro, o usurio dever ter somente a opo de Incluir ou Procurar um registro. Ento, configure a propriedade Enabled dos botes Gravar, Cancelar e Excluir como False. A partir deste momento o sistema dever controlar os botes automaticamente. O fato de o boto estar habilitado ou no dependera do estado da tabela. Uma tabela pode estar em 13 diferentes estados. Apenas quatro so importantes para ns: dsInsert (o usurio est inserindo registro), dsEdit (est alterando), dsBrowse (est consultando ou navegando pelos registros) e dsInactive (a tabela est fechada).
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 159

O componente TDataSource (que chamamos de DTS_Principal) possui uma propriedade chamada State que informa o estado atual da tabela. Possui tambm o evento OnStateChange que chamado a cada vez que o estado da tabela alterado. Podemos controlar a propriedade Enabled dos botes a partir deste evento, com o seguinte cdigo:

Observe que o array de string baseado na enumerao TDataSetState, que contm os possveis estados da tabela. Este array usado na ltima linha de cdigo para preencher o primeiro painel da StatusBar (que chamamos de StatusBar1), Inicialmente este evento no ser chamado, pois a tabela est fechada. Assim, coloque Fechado na propriedade Text do primeiro painel. Outra funcionalidade importante quer adicionamos a de verificar se os campos requeridos foram preenchidos declare, na seo private, a funo Verifica_Campos_Em_Branco, implemente-a da seguinte forma:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 160

Feito isto, vamos aos cdigos dos botes: Boto Incluir

Boto Gravar Adicionar a unit DBClient na interface

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 161

Boto Excluir

Boto Cancelar

Observe o comando que aplica a cach dos dados:

Como estamos criando um ClienteDataSet preciso que faamos TypeCasting do DataSet da ficha para que ele reconhea o mtodo ApplyUpDates (feito com o uso do operador AS). Para que o cdigo seja compilado corretamente no se esquea de acrescentar a unit DBClient na clusula uses desta Unit. O boto Procurar o nico que no possui cdigo, pois a procura ser implementada em cada uma das fichas de cadastro descendentes, conforme veremos mais adiante.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 162

ACESSO A DADOS Construiremos agora a camada de acesso a dados do sistema, o Data Module. Chame File|New>Data Module. Salve o Data Module como UDM, e configure sua propriedade Name para DM. Coloque um componente SQLConnection no Data Module, e configure sua propriedade Name para SQLConnect. D um duplo clique no SQLConnection e, no editor de conexes, clique no sinal (+) para adicionar uma nova conexo. Na janela que aparecer, escolha InterBase para o Drive Name e Datacar para Connection Name. Clique OK e, no editor, preencha as demais opes conforme mostra a seguir: Databse= 127.0.0.1: C:\<caminho do seu banco>\DATACAR.FDB Password=masterkey serverCharset=WIN1252 SQLDialect=3 User_Name=sysdba

Depois clique em OK para sair do editor. Configure a propriedade LoginPrompt do SQLConnection para False e Connected para True.

Criao dos Formulrios e Data Module Criado o Data Module (que chamaremos de DM a partir de agora), vamos otimizar a alocao dos formulrios e do DM na memria. Voc deve criar somente quando for utiliz-lo. Como exemplo, visualize a unit do formulrio principal, e substitua a chamada a ShowModal de FrmFichaMarcas por:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 163

Agora faa o mesmo para os demais formulrios dos sistema chamados a partir do formulrio principal. No se esquea de configurar o Delphi para no criar estes formulrios automaticamente no menu Project|Options|Forms.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 164

Acesso tabela de Marcas Coloque no DM um SQLDataSet . Configure sua propriedade Name para DST_Marcas e SQLConnection para SQLConnect. Abra o editor da propriedade CommandText e digite:

Usamos aqui um recurso conhecido como parametrizao de consultas. Uma consulta (query) parametrizada basicamente uma instruo SQL que contem um parmetro na clausula Where. O valor para o parmetro fornecido em tempo de execuo pelo usurio. Consultas parametrizadas a essncia da programao client/server. O select mostrado retorna somente um registro, de acordo com o parmetro passado, e no todos os registros como comum se observar bem alguns sistemas. Abra a propriedade Params de DST_Marcas e selecione o parmetro no editor, configurando sua propriedade DataType para ftInteger. Coloque no DM um componente DataSetProvider. Configure sua propriedade Name para dsp_Marcas, e aponte sua propriedade DataSet para DST_Marcas. Coloque um ClientDataSet no DM, definindo sua propriedade Name para CDs_Marcas e ProviderName para dsp_Marcas. Agora d um clique com o boto direito em CDs_Marcas e escolha a opo FetchParams, trazendo os parmetros definidos no SQLDataSet para ClientDataSet. Ative o ClientDataSet configurando sua propriedade Active

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 165

para True. D um duplo clique nele. No editor de campos clique com o boto direito e escolha Add All Fields. Configure a propriedade DisplayLabel de cada Tfield para exibir uma descrio para o campo, por exemplo, Nome da Marcapara o campo NOME_MARCA. Configure a propriedade requeried para True do TField NOME_MARCA. Para o TField COD_MARCA configure Required como False, pois este valor fornecido pelo mesmo sistema. Seu DM deve estar como mostra a figura abaixo.

SQL de Atualizao Configurada a busca dos dados com select, precisamos dizer ao

DataSetProvider como ele deve gerar as instrues de Update, Delete e Insert. A propriedade ProviderFlags de um TField pode especificar como cada campo participara das instrues de atualizaes geradas pelo DataSetProvider. No DM, d um duplo clique em dst_marcas. No editor de campos d um clique no boto direito e escolha a opo Add All Fields. Selecione ento todos os TFields, menos COD_MARCA, e configure sua propriedade

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 166

ProviderFlags.pflnWhere

para

False.

Selecione

ento

apenas

TField

COD_MARCA ( que o campo chave da tabela) e configure sua propriedade ProviderFlags.pflnkey para True (pflnWhere j deve ter valor True). Finalmente, configure a propriedade UpdateMode de dsp_Marcas para UpWhereKeyOnly. Uma atualizao no Nome da Marca produzira agora a seguinte instruo de Update:

Formulrio de Marcas Abra o formulrio de marcas e configure o Caption para Marcas. Clique em File|use Unit ou ALT+F11 e escolha a unit UDM (DM). Selecione DTS_Principal e aponte sua propriedade DataSet para DM.cds_Marcas. Coloque no formulrio de marcas um componente DBText e DBEdit e um DBImage. Aponte a propriedade Datasource destes componentes para o DTS_Principal. Agora aponte suas propriedades DataField para COD_MARCA, NOME_MARCA e LOGOTIPO, respectivamente. Adicione trs Labels para indicar a finalidade destes controles configurando sua propriedade Caption, Localize o DBText de destaque, est no painel no topo do formulrio, e configure sua propriedade DataSource pra DTS_Principal. Aponte sua propriedade DataField NOME_MARCA. Para a manipulao do campo LOGOTIPO, coloque no formulrio um componente OpenDialog. Coloque um boto no formulrio com o Caption de Carregar..., e no seu evento digite:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 167

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 168

Acessando a Tabela de Modelos Coloque no DM um SQLDataSet da paleta dbExpress. Configure sua

propriedade Name para dst_modelos e SQLConnection para SQLConnect. Abra o editor da propriedade CommandText e digite:

Repare que o nome da Marca de um Modelo ser obtido atravs de um join no lado servidor, e no usando um DBLoockComboBox no lado cliente. Em aplicaes cliente/servidor voc nunca deve utilizar um campo lookup, pois isto implica nas buscas de todos os registros do servidor para a tabela de lookup. Abra a propriedade Params de dst_Modelos e configure o DataType do parmetro como ftInteger. D um duplo clique em dst_Modelos e, no editor, adicione todos os campos. Selecione ento todos os TFields menos COD_MODELO. Configure as ProviderFlags de pflnWhere como False. Para o TField NOME_MARCA configure pflnUpdate como False. Isso porque esse campo no existe na tabela de

Modelos, ele deve somente ser obtido do banco de dados, mas no atualizado. Finalmente configure o TField COD_MODELO com ProviderFlags pflnkey e pflnWhere como True. Coloque no DM um DataSetProvider. Configure sua propriedade Name para dsp_Modelos. DataSet para dst_Modelos e UpdateMode para upWhereKeyOnly.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 169

Coloque

um

ClientDataSet

configurando

sua

propriedade

Name

para

cds_Modelos e ProviderName para dsp_modelos. Clique com o boto direito e escolha FetchParams. D um duplo clique neste ClientDataSet e, no editor de campos, escolha Add All Fields. Configure a propriedade DisplayLabel de cada TField para exibir uma descrio para o campo por exmplo. Nome do Modelo para o campo NOME_MODELO. Configure a propriedade Required para True do TFiled NOME_MODELO. Para COD_MODELO configure Required como False. Ative o ClientDataSet.

Formulrio de Modelos Abra o formulrio de Modelos. Configure o seu Caption para Modelos. Clique em File|Use Unit e escolha a unit UDM. Selecione ento DTS_Principal e aponte sua propriedade DataSet para DM.cds_Modelos. Coloque no formulrio dois componentes DBText, dois DBEdits e um DBImage. Aponte a propriedade DataSource deste componentes para o DTS_Principal e a propriedade DataField para COD_MODELO, NOME_MARCA, COD_MARCA, NOME_MODELO e FOTO respectivamente. Coloque cinco labels para indicar a finalidade destes controles configurando sua propriedade Caption. Localize o DBText de destaque que est no painel no topo do formulrio e configure sua propriedade DataSource. Aponte sua propriedade Datafield para NOME_MODELO. Utilize a mesma tcnica utilizada no formulrio de Marcas para fazer o carregamento da imagem. Veja o formulrio na Figura abaixo.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 170

Formulrio Padro de Procura Crie um novo formulrio clicando em File| New ->Form. D o nome de FrmProcura para o formulrio e salve-o com o nome de UFormProcurar. Coloque no formulrio uma Label e d o Caption de Procurar por. Coloque um Edit com o nome de EditProce retire seu texto. Adicione tambm um BitBtn com o Caption de Procurar.

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 171

Coloque um DBGrid no centro do formulrio e um DataSource com o nome (novamente) de DTS_Principal. Aponte a propriedade DataSource do DBGrid para DTS_Principal e abra sua propriedade Options, configurando as flags dgRowSelect para True e dgColummResize para False. Escolha tambm uma cor para a propriedade FixedColor do DBGrid. No seu evento OnTitleClick digite:

Coloque no formulrio um StatusBar com o nome StsBr, e tambm dois botes do tipo TBitBtn abaixo do DBGrid. D os nomes de BtnOk e BtnCancel aos botes. Configure a propriedade Kind dos botes para bkOk e bkCancel respectivamente. Configure a propriedade Enabled de BtnOk para False. No evento OnClick do boto Procurar e digite:
Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 172

Utilizaremos agora o prprio construtor virtual da classe bsica para receber o TClientDataSet a ser usado na procura, atravs do uso de polimorfismo. Localize a seo public de TFrmProcurar e redeclare o construtor:

Adicione a unit SimpleDs na Uses Pressione ento Shift+Ctrl+C para o Dephi gerar o cabealho da

implementao e digite e ento:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 173

Procurar por Marcas e Modelos Coloque no DM um SimpleClientDataSet. Defina seu nome para

sds_Procura_Marca e configure sua propriedade connection para SQLConnect. Na sua propriedade DataSet, digite dentro da propriedade CommandText

V at a propriedade Params dentro do DataSet do sds_procura_Marca e configure o nico parmetro com o valor ftString para DataType. D um duplo clique no sds_procura_Marca e no editor de campos adicione todos os TFields. Selecione cada um dos TFields e configure sua propriedade DisplayLabel (por exemplo: Nome da Marca). Agora volte ao formulrio de Marcas e adicione ALT+F11 a unit UFormProcurar. D um duplo clique no boto Procurar e escreva o seguinte no seu evento OnClick:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 174

Realizada abertura do cadastro de marcas usando a procura, utilizaremos o mesmo formulrio para procurar uma marca para o modelo, j que no temos um DBLookUpComboBox para alterar a marca. Abra o formulrio de Modelos e pressione ALT+F11, escolhendo a unit UFormProcurar. Coloque ento um boto com o Caption de ... ao lado do DBText que mostra o Nome da Marca, e no seu evento OnClick digite:

Observe a linha que atribui o Nome da Marca. Mas por que atribuir o Nome da Marca se no existe este campo na tabela de modelos? Fizemos isso somente para efeito de exibio em uma tela, para no ser necessrio realizar uma nova consulta recebendo o novo Nome da Marca. Este campo no ser atualizado, pois desativamos sua ProviderFlag de UpDate, j que sua atualizao causaria um erro. Agora utilize a mesma tcnica para construir uma procura para o cadastro de modelos, criando um novo TSimpleDataSet e passando-o como parmetro para o formulrio de procura. Chame esta procura no boto Procurar do formulrio de modelos. Siga os seguintes passos:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 175

Coloque

no

DM

um

SimpleClientDataSet.

Defina

seu

nome

para

sds_Procura_Modelo e configure sua propriedade connection para SQLConnect. Na sua propriedade DataSet, digite dentro da propriedade CommandText.

V at a propriedade Params dentro do DataSet do sds_Procura_Modelo e configure o nico parmetro com o valor ftString para DataType. D um duplo clique no sds_Procura_Modelo e no editor de campos adicione todos os TFields. Selecione cada um dos TFields e configure sua propriedade DisplayLabel (por exemplo: Nome do Modelo). Agora volte ao formulrio de Modelo e adicione ALT+F11 a unit UFormProcurar. D um duplo clique no boto Procurar e escreva o seguinte no seu evento OnClick:

Professor Marcos Antonio Moreira

Reviso: 08/2012 - Verso: 2.2

P g i n a | 176

Cadastro de Cidades e Acessrios Utilizando os mesmo procedimentos demonstrados, construa agora o acesso a dados para a tabela de cidades e acessrios, as quais so bastante simples j que possuem poucos campos. Adicione um trio de componentes para cada tabela como fizemos anteriormente e ento construa o formulrio de dados e procura.

At este momento, construmos o banco de dados em Firebird, os formulrios padres de cadastros, acesso a dados criando um DataModule e utilizando os componentes das paletas dbExpress. Adicionamos funcionalidades aos formulrios de cadastro e construmos a interface para a entrada de dados, utilizando controles com acesso a dados e toda a codificao com base na programao programao. orientada a objetos e algumas tcnicas avanadas de

Professor Marcos Antonio Moreira