Escolar Documentos
Profissional Documentos
Cultura Documentos
ORIENTAÇÃO À OBJETO
Objetos e Classes
Objetos
Usamos o termo objeto para representar uma determinada entidade do mundo real. Em
um sistema de gerenciamento de biblioteca teríamos como objetos os livros da
biblioteca, os usuários e as movimentações realizadas, como empréstimos e
devoluções.
Um objeto possui propriedades, que são suas características, e métodos, que são as
funções que operam sobre o objeto. Um livro teria como propriedades, por exemplo, o
autor, a editora e o título. Entre os métodos que se aplicam ao livro, estaria o método
catalogar e o método movimentar.
Classes
Uma classe representa um conjunto de objetos que possuem características e
comportamentos comuns. No caso da biblioteca, esta possui além de livros, revistas.
Poderíamos dizer que tanto o objeto livro quanto o objeto revista pertencem a classe
Publicações, já que possuem as mesmas características e comportamentos.
Herança
É o mecanismo pelo qual uma classe obtém - propriedades e os métodos de uma outra
classe, para expandi-Ia ou especializá-Ia de alguma forma. O Delphi permite que você
crie novas classes baseadas em classses pré-existentes. Por exemplo, você pode criar
uma nova caixa de edição baseado em TEdit.
Quando uma classe herda propriedades e métodos de um outra classe, dizemos que a
nova classe é derivada da classe ancestral.
Instanciação
Chamamos o objeto de instância de uma determinada classe, o que significa que ele
possui os métodos e as propriedades definidos pela classe para suas instâncias. A
instanciaçã consiste em criar um novo objeto a partir de uma classe.
“É comum utilizarmos o termo objeto para nos referirmos à classe. Por exemplo, TForm na realidade eu
ma classe que encapsuia propriedades e métodos do formulário. No entanto, utilizamos muitas vezes a
expressão objeto TForm.”
TObject
TPersistent
TComponent
TControl
O Objeto Formulário
Quando você inicia um novo projeto no Delphi, na unit associada ao formulário é
declarado, na seção type, um nova classe de formulário, TForml, derivada do tipo
TForm:
type
private
{Private declarations}
public
{Public declarations}
end;
A classe TForml inicialmente não possui propriedades ou métodos. Isto porque você não
incluiu qualquer componente em seu interior, e não deu origem a nenhum evento. Os
componentes inseridos em seu formulário são na realidade propriedades da classe
TForml. Os eventos gerados são na realidade métodos da classe TForml.
A seção uar da unit ligada ao formulário cria uma instância de TForml, chamada Forml .
Ou seja, cria um objeto Forml, da classe TForml:
var
Form1 : TForm1;
É necessário criar a variável Fonnl porque é nesta hora que criamos o objeto na
memória. Somente após criarmos o objeto na memória é que podemos manipulá-Ia (por
exemplo, mudar uma propriedade deste, ou inserir um componente). Ou seja, nós não
manipulamos a classe, e sim suas instâncias, ou seja, os objetos.
Agora, suponha que você insira um botão Buttonl em seu formulário, com um evento
OnClick associado, que muda o titulo do formulário quando clicado:
begin
end;
Ao inserir o botão e o evento acima, a seção type da unit passa a ter o seguinte
aspecto:
type
{Public declarations}
end;
A classe TForml possui agora uma propriedade chamada Buttonl, do tipo TButton, e um
método, a procedure ButtonlClick. O código do evento está na seção implementation.
<objeto>.propriedade
ou
<objeto>.método
TForml = class(TForm)
Como TForml é derivado de TForm, todos os elementos que pertencem ao tipo TForm
automaticamente se tornam parte do tipo TForml. Ou seja, TForml possui todas as
propriedades, métodos e eventos de TForm. V ocê pode utilizar todos estes elementos
de TForm, em TFõrml. Mas apenas os componentes adicionados a TForm l=e -os
A classe de onde a nova classe é derivada se chama ancestral. A nova classe se chama
descendente. Uma classe possui somente um ancestral, mas pode, possuir muitos
descendentes.
Mas você pode declarar um método com o mesmo nome do método da classe ancestral.
Neste caso, você está sobrepondo (override) o método da classe ancestral.
Você também pode inserir em urna classe propriedades que não componentes, e
métodos que não eventos. Você pode adicionar novas propriedades e métodos na parte
private ou public da declaração da classe.
Use a parte public para declarar propriedades que você quer que sejam acessadas
pelos métodos da classe e por outras units. Use também para declarar métodos que
você queira que objetos de outras units usem.
Use a parte private para restringir o acesso a propriedades e métodos. Por exemplo,
declare nesta parte propriedades que você queira que só os métodos da unit corrente
acesse. Use também para declarar métodos que você queira que só os objetos
definidos na unit corrente acesse.
type
A procedure MudaCor é pública, podendo ser acessada de outra uní t (não esqueça de
acrescentar a unitreferellte a Forml na seção uses da unít que está chamallqo o método
MudaCor de Forml):
Forml.MudaCor;
ou
Por exemplo:
O Operador Is
O operador is é usado para realizar checagem dinâmica de tipos durante a execução da
aplicação. Usando este operador, é possível verificar se um objeto pertence a uma
classe. A sintaxe é:
Exemplo
O exemplo abaixo usa o operador is para criar uma rotina que permite a passagem de
uma caixa de edição para outra através da tecla Enter (ao invés de Tab, padrão do
Windows):
end;
Neste capítulo veremos como criar classes simples, derivadas de TObject ou de outra
classe pré-definida pelo Delphi. No capítulo seguinte veremos como criar classes de
componentes.
Declarando a Classe
Para declarar uma nova classe, inicie um novo projeto e, na seção type da unit, escreva:
type
TNovaClasse = class (TClasseBase)
Suponha que você queira criar uma classe Tl.ívro, que encapsule propriedades e
métodos dos livros manipulados em uma biblioteca.
type TLivro
class(TObject)
type
TLivro = class(TObject)
Nome string[35];
Autor string[35];
Editora string[35];
function Emprestimo: boolean;
end;
Uma função construtora é um método que aloca memória para o novo objeto e aponta
para este, que é chamado de intância da classe.
Toda classe derivada de TObject possui a função construtora Create. Portanto, para
criar uma instancia de classe, use o método Create:
Nome_Objeto := TClasse.Create;
Por exemplo, para criarmos uma instancia da classe TLivro, usaremos o método Create:
Livrol := TLivro.Create;
A partir de agora, você poderá se referir aos campos de TLivro através da variável
Livrol. Por exemplo, para se referir ao campo Nome da classe TLivro, faça:
Livrol.Nome
Você destrói um objeto através de uma função destrutora. O Delphi possui duas funções
destrutoras: Free e Destroy. Você deve sempre usar a função destrutora Free.
Livrol.Free;
TLivro pode utilizar o método Free para destruir uma instância de sua classe porque
herdou este método de TObject.
Exemplo
Vamos criar uma aplicação que armazena dados através de um objeto da classe
TStringList, sem utilizar um componente ListBox ou Combobox.
O formulário contém uma caixa de edição e um botão. O usuário entra o dado na caixa
de edição e, ao clicar no botão, adiciona o dado a uma lista, ou seja, a um objeto do tipo
TStringList. Ao finalizar a aplicação, a lista é salva em um arquivo texto.
A classe TStringList não precisa ser criada porque ela já é oferecida pelo Delphi. Para
utilizar o objeto do tipo TString l.ist, temos que criá-lo através do método Create, e
destruí-Ia através do método Free. Veja o código abaixo:
unit livro_01;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Class_Area;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Lista : TStringList;
implementation
{$R *.DFM}
end;
end.
Agora, basta se referenciar à unit da classe - cláusula uses da seção interface (coloque
a compilada da classe na mesma pasta onde ficar o projeto que a usará). Depois, na
seção var, crie um objeto da classe. A partir daí, basta se refe . às propriedades e
métodos necessários.
Exemplo
Vamos criar agora uma classe chamada T Area, com duas propriedades: Altura e
Largura. A classe TArea possui um método chamado CalculaArea, que calcula a área
da superfície.
Como esta classe não está associada a nenhum formulário, para criá-Ia siga os passos
abaixo:
adicione uma nova unit, através do menu File, opção New, item Unit;
remova a primeira unit oferecida quando você criou a aplicação. Agora, sua
aplicação possui apenas uma unit, que não está associada a nenhum
formulário:
unit Class_Area;
interface
type
TArea = class (TObject)
Altura : integer;
Largura : integer;
function CalculaArea : double;
function CalculaAreaParametro
(vAltura : integer; vLargura : integer)
: double;
end;
implementation
function TArea.CalculaAreaParametro
(vAltura : integer; vLargura : integer) : double;
var
TArea1 : TArea;
begin
TArea1 := TArea.Create;
TArea1.Altura := vAltura;
TArea1.Largura := vLargura;
Result := TArea1.Altura * TArea1.Largura;
end;
end.
A unit é salva com o nome Classe_Area, e o projeto com o nome ClasseArea. Não
esqueça de compilar a unit que declara a classe, através de Project Compile, para dar
origem ao arquivo .DCU correspondente ..
Para testarmos a classe TArea, vamos-criar uma nova aplicação. Nesta aplicação, ao
clicarmos em um botão, chamamos um método da classe TArea para calcular a área, e
o resultado do cálculo é mostrado em uma caixa de edição.
Note que a unit UnitArea, que cria a classe T Area, está inserida na cláusula uses da
unit q e testa a classe.
Por causa disso, antes de executarmos - aplicação, precisamos salvá-Ia, na mesma pas
que está a unit UnitArea compilada. Vamos da! o nome de FrmTestaClasse para o
formulário, e TestaClasse para o projeto. Agora, ao executarmos
Exemplo
Isto é feito através da nova classe TRetangulo, derivada de TObject, que possui como
propriedades as coordenadas do retângulo e como método uma função para desenhar o
retângulo.
unit novc3;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TRetangulo = class(TObject)
x1, y1, x2, y2 : integer;
procedure Desenha(px1, py1, px2,py2 : integer);
end;
var
Form1: TForm1;
Retangulo1 : TRetangulo;
implementation
{$R *.DFM}
var
px1, px2, py1, py2 : integer;
end;
end.