Class: Read e Write no Delphi

Veja neste artigo como usar e pra que serve os métodos usados na criação de uma classe. De maneira bem simples entenderemos para que serve e quando usar.

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:

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;

Artigos relacionados