Olá Galera, vamos ver neste artigo um pouco sobre classes. Vou mostrar como criar uma classe do zero, e explicar o que o Delphi faz quando usamos CTRL + SHIF + C (comando para implementar as propriedades e métodos de uma determinada classe).

Inicialmente vamos criar uma Classe chamada de TCliente e para isso criarmos uma unit chamada uCliente.pas:


unit uCliente;
  interface
  implementation
end.

Criação da classe

Veja no código abaixo como vamos criar a classe no Delphi.


unit uCliente;

interface
  Type

  TCliente = class
  private

  protected

  public

  published

  end;


implementation

end. 

Criaremos agora as propriedades básicas da Classe TCliente: ID, Nome, Sexo, CPF, RG, Telefone, Endereco, Bairro, Cidade, CEP. Veja o código como ficará:


unit uCliente;

interface
  Type

  TCliente = class
  private

  protected

  public

  published

  end;


implementation

end. 

Vamos criar as propriedades básicas da Classe TCliente: ID, Nome, Sexo, CPF, RG, Telefone, Endereco, Bairro, Cidade, CEP. Veja o código como ficará:


unit uCliente;

interface
  Type

  TCliente = class
  private

  protected

  public
    property ID       :String;
    property Nome     :String;
    property Sexo     :String;
    property CPF      :String;
    property RG       :String;
    property Telefone :String;
    property Endereco :String;
    property Bairro   :String;
    property Cidade   :String;
    property CEP      :String;

  published

  end;


implementation

end.

Ao final da digitação da property CEP: String usaremos a combinação de teclas CTRL + SHIFT + C para implementar a classe.

Seu código agora modificará complementamente, incluindo várias procedures e Fields. Vamos analisar como ficou o código.


unit uCliente;

interface
  Type

  TCliente = class
  private
    FNome: String;
    FBairro: String;
    FCEP: String;
    FID: String;
    FCPF: String;
    FSexo: String;
    FCidade: String;
    FEndereco: String;
    FTelefone: String;
    FRG: String;
    procedure SetBairro(const Value: String);
    procedure SetCEP(const Value: String);
    procedure SetCidade(const Value: String);
    procedure SetCPF(const Value: String);
    procedure SetEndereco(const Value: String);
    procedure SetID(const Value: String);
    procedure SetNome(const Value: String);
    procedure SetRG(const Value: String);
    procedure SetSexo(const Value: String);
    procedure SetTelefone(const Value: String);

  protected

  public
    property ID       :String read FID write SetID;
    property Nome     :String read FNome write SetNome;
    property Sexo     :String read FSexo write SetSexo;
    property CPF      :String read FCPF write SetCPF;
    property RG       :String read FRG write SetRG;
    property Telefone :String read FTelefone write SetTelefone;
    property Endereco :String read FEndereco write SetEndereco;
    property Bairro   :String read FBairro write SetBairro;
    property Cidade   :String read FCidade write SetCidade;
    property CEP      :String read FCEP write SetCEP;

  published

  end;


implementation

{ TCliente }

procedure TCliente.SetBairro(const Value: String);
begin
  FBairro := Value;
end;

procedure TCliente.SetCEP(const Value: String);
begin
  FCEP := Value;
end;

procedure TCliente.SetCidade(const Value: String);
begin
  FCidade := Value;
end;

procedure TCliente.SetCPF(const Value: String);
begin
  FCPF := Value;
end;

procedure TCliente.SetEndereco(const Value: String);
begin
  FEndereco := Value;
end;

procedure TCliente.SetID(const Value: String);
begin
  FID := Value;
end;

procedure TCliente.SetNome(const Value: String);
begin
  FNome := Value;
end;

procedure TCliente.SetRG(const Value: String);
begin
  FRG := Value;
end;

procedure TCliente.SetSexo(const Value: String);
begin
  FSexo := Value;
end;

procedure TCliente.SetTelefone(const Value: String);
begin
  FTelefone := Value;
end;

end.

O que houve?

Para cada property criada, por exemplo: property ID :String, o Delphi criou dois métodos de leitura(Read) e escrita(Write): property ID :String read FID write SetID;, onde:

  • FID = Field para armazenar o valor passado para propriedade;
  • SetID = Procedure para validar por exemplo um ID já existe, ou então se o CPF é válido, e logo em seguida atribuir o conteúdo informado para o Field FID, veja como o Delphi implementa o SetID.

procedure TCliente.SetID(const Value: String);
begin
  FID := Value;
end;

Com este método o parâmetro Const (não pode ser alterado dentro do método) Value contém o valor informado quando usamos, por exemplo:


Procedure TFrmCliente.Novo;
begin
   Cliente.ID := 1;
End;

Sendo assim, o que este método SetID faz simplesmente é armazenar o Value em FID, como a linha abaixo mostra:


FID := Value

O código fica bem grande, dando a entender que fizemos muitas implementações e tudo mais. Contudo, fizemos alguma validação com os campos? Fizemos alguma regra de negocio? NÃO!

Vamos implementar uma regra básica para entendermos como fazer e depois adaptar. Supondo que gostaríamos de validar a quantidade de caracteres de um CPF, contando os pontos e traço. Sendo assim, teríamos 14 caracteres, como exemplo: 123.456.789-01.

Usando a função Length encontrada na unit System podemos ver o tamanho de uma string. No código verificamos se foi informado 14 caracteres ou não:


procedure TCliente.SetCPF(const Value: String);
begin
  If Length(Value) = 14 Then
     FCPF := Value
  else
    raise Exception.Create('CPF inválido, número de caracteres maior ou menor que 14'); 
    //Para usar o Exception devemos dar uses em SysUtils;
end;

Com isso temos uma suposta regra de negócios, onde o CPF tem que 14 caracteres, nem a mais, nem a menos.

Voltando então a pergunta inicial, temos regras de negócio nesta nossa classe de Cliente? Inicialmente não, então não precisamos ter procedures SetID, SetNome, SetCPF, Set... O que vou fazer é bem simples, mas requer muita atenção: inicialmente vamos apagar todas as procedures declaradas e implementadas. Feito isso seu código ficará assim:


unit uCliente;

interface
 uses SysUtils;

  Type
  TCliente = class
  private
    FNome: String;
    FBairro: String;
    FCEP: String;
    FID: String;
    FCPF: String;
    FSexo: String;
    FCidade: String;
    FEndereco: String;
    FTelefone: String;
    FRG: String;
{REMOVEMOS AS DECLARAÇÕES DAS PROCEDURES DAQUI }
  protected

  public
    property ID       :String read FID write SetID;
    property Nome     :String read FNome write SetNome;
    property Sexo     :String read FSexo write SetSexo;
    property CPF      :String read FCPF write SetCPF;
    property RG       :String read FRG write SetRG;
    property Telefone :String read FTelefone write SetTelefone;
    property Endereco :String read FEndereco write SetEndereco;
    property Bairro   :String read FBairro write SetBairro;
    property Cidade   :String read FCidade write SetCidade;
    property CEP      :String read FCEP write SetCEP;

  published

  end;

implementation


{REMOVEMOS AS IMPLEMENTAÇÕES DAS PROCEDURES DAQUI }


end.

Já está pronto? Não!! Falta agora remover o método de escrita(Write) nas propertys e modificar para escrever diretamente nos Fields, mas como assim? Veja abaixo o código:


unit uCliente;

interface
  Type

  TCliente = class
  private
    FNome: String;
    FBairro: String;
    FCEP: String;
    FID: String;
    FCPF: String;
    FSexo: String;
    FCidade: String;
    FEndereco: String;
    FTelefone: String;
    FRG: String;
  protected

  public
{Observe que onde esta SetID, SetNome, Set... Foi modificado agora para FID, FNome,F...}

    property ID       :String read FID write FID;
    property Nome     :String read FNome write FNome;
    property Sexo     :String read FSexo write FSexo;
    property CPF      :String read FCPF write FCPF;
    property RG       :String read FRG write FRG;
    property Telefone :String read FTelefone write FTelefone;
    property Endereco :String read FEndereco write FEndereco;
    property Bairro   :String read FBairro write FBairro;
    property Cidade   :String read FCidade write FCidade;
    property CEP      :String read FCEP write FCEP;

  published

  end;

implementation

end.

Como vocês podem ver a Unit fica mais limpa, a classe fica bem mais simples de se visualizar e dar manutenção. Agora atenção: isso é se você não tiver regras de negócio para suas propertys ok? Caso tenha, crie a procedure, associe-a ao Write da property e implemente-a com sua regra de negócio. Ficará então da seguinte forma:


unit uCliente;

interface
  uses SysUtils;

  Type

  TCliente = class
  private
    FNome: String;
    FBairro: String;
    FCEP: String;
    FID: String;
    FCPF: String;
    FSexo: String;
    FCidade: String;
    FEndereco: String;
    FTelefone: String;
    FRG: String;

   {Metodo de validação do CPF}
    procedure SetCPF(const Value: String);

  protected

  public
    property ID       :String read FID write FID;
    property Nome     :String read FNome write FNome;
    property Sexo     :String read FSexo write FSexo;
   {Property CPF agora tem um mecanismo de validação para sua escrita}
    property CPF      :String read FCPF write SetCPF;
    property RG       :String read FRG write FRG;
    property Telefone :String read FTelefone write FTelefone;
    property Endereco :String read FEndereco write FEndereco;
    property Bairro   :String read FBairro write FBairro;
    property Cidade   :String read FCidade write FCidade;
    property CEP      :String read FCEP write FCEP;

  published

  end;

implementation


{ TCliente }


procedure TCliente.SetCPF(const Value: String);
begin
  If Length(Value) = 14 Then
     FCPF := Value
  else
    raise Exception.Create('CPF inválido, número de caracteres maior ou menor que 14');
end;


end.

Para usar sua classe e testar, faça o seguinte: crie um form e coloque um BitBtn.

Precisamos dar Uses em uCliente para poder acessar a Classe TCliente. Feito isso, no evento onClick do BitBtn, implemente o seguinte :


procedure TFrmCliente.BtnNovoClick(Sender: TObject);
Var
  C: TCliente;
Begin
    C := TCliente.Create;
    C.Nome:= 'WESLEY YAMAZACK'  ;
    C.Bairro:= 'CENTRO'  ;
    C.CEP:= '216548-856 '  ;
    C.ID:= '00005'  ;
    C.CPF := '123.456.789-100'  ; // Deste jeito você vera o erro
    C.CPF := '123.456.789-10'  ; // Deste jeito irá funcionar 
    C.Sexo:= 'M'  ;
    C.Cidade:= 'RIO DE JANEIRO '  ;
    C.Endereco:= 'RUA M, N 145, APTO 809'  ;
    C.Telefone:= '(21)3222-1111 '  ;
    C.RG:= '12.313.214-1'  ;
    C.Free;
end;