Como criar uma classe em Delphi?

05/04/2017

0

Opa pessoal,

Estou com uma dúvida em saber como criar uma classe em Delphi, eu vejo diversos métodos, propriedades, mas eu acho mt difícil e complexo de entender principalmente aqueles FDescricao, FTipo, Property, SetDescricao, Read, write, etc.

Alguém poderia me explicar como funciona?? Tipo uma classe pequena...

[]'
Joaquim C.

Joaquim C.

Responder

Post mais votado

05/04/2017

Boa tarde meu caro,
Você tem conhecimento com alguma outra linguagem ?
Se sim será mais facil.
Vou tentar te explicar de uma forma rapida.

A estrutura simples de uma classe e´

T<NomeClasse> = class(<herança>)

end;


T é uma forma de identificar um tipo no delphi é apenas uma convenção suas classe pode se chamar Cliente ao inves de TCliente. o ruim disso que como o delphi não é case sensitive você não vai poder ter uma classe chamada cliente, por isso aconselhável o uso do T.

Sua classe precisa herdar de alguma, por padrão se vc não ifnormar nada ela herdara de TObject.
Entao seria isso

TMinhaClasse = class 

End;


para criar alguma coisa vc precisa de variaves para manipular os dados, esses são chamados de fields, são os F, que por sua vez tambem são convenção. tipo se uma variavel vai ter um escopo publico ela terá um field e tera um get e set para acesso.
Em uma estrutura java você teria :

pubic MinhaClasse {
   private string minhaVar;

   public String getMinhaVar(){}
   public void setMinhaVar(String value ){}
}


Em delphi será semelhante, porem o delphi te obriga você declar os metodos para depois implementar, então teremos. Alem disso todos
TMinhaClasse = class
  private MinhaVar : String;
  public function getMinhaVar : String;
  public procedure setMinhaVar : String;
end;

implementation
function TMinhaClasse.getMinhaVar : String;
begin end;

procedure TMinhaClasse.setMinhaVar(value : String);
begin end;



Dessa forma se quiser pegar um valor vc usar o get se quiser setar o set, blz. ;)

Mas o delphi tem uma forma mais elegante para fazer isso, você pode usar dessa forma, mas vc pode fazer assim

meuObjeto.MinhaVar := 'NovoValor'; ou
showMessage(meuObjeto.MInhaVar )

ao inves disso

meuObjeto.setMinhaVar(''NovoValor'); ou
showMessage(meuObjeto.GetMInhaVar )

Para isso você utiliza os properties o property é uma especicie de apontamento que vc diz que para aquela chamanda quando for uma leitura ira utilizar o metodo x e para escrita o meto y , dessa forma você troca a exibição dos metodos para private e apenas as property são publicas. assim as demais classe não sabem coomo isso foi implementado e se quiser trocar a forma como uma property implementa um metodo ou o nome desse metodo ara as demais classe isso não afetara

TMinhaClasse = class
  private fMinhaVar : String;
  private function getMinhaVar : String;
  private procedure setMinhaVar : String;´
  public minhaVar read getMinhaVar  write setMinhaVar ; 
end;


Utilizando a mesma classe acima, podemos perceber que apenas troquei o nome da variavel para fMInhaVar para dessa forma conseguir utilizar minhaVar como propriedade
informe com o uso do read que para leitura da proriedade minhaVar será utilizado o metodo geMinhaVar. Com o uso do write informo que para escrever será utilizado o metodo setMinhaVar.
Como a propriedade é apenas uma "apontamento" o seu valor de fato é armazenado em fMinhaVar e os metodos de get e set que irão fazer essa inserção de pegar o valor e alterar.

Simples né. :D hehehehe
outra coisa que bão precisa ficar colocando private e public para cada metodo ou variavel.
apenas coloque uma vez e todos abaixo dele pertenceram aquele escopo.
Exemplo
TMinhaClasse = class
  private 
      fMinhaVar : String;
      
      function getMinhaVar : String;
      procedure setMinhaVar : String;´
  public 
      minhaVar read getMinhaVar  write setMinhaVar ; 
end;



Espero ter ajudado.

Qualquer coisa estou a disposição.

Abraços.

Gutierry Pereira

Gutierry Pereira
Responder

Mais Posts

05/04/2017

Huidemar Costa

Responder

10/04/2017

Joaquim C.

Opa Gutierry, vlw pela explicação! ficou show! entendi perfeitamente :).. eu to aprendendo front-end.. mas to engatinhando ainda kkkk

Li os artigos que o amigo Huidemar passou, agora sim, já posso criar as minhas classes, vlw mesmo! :)

Esse artigo aqui está bem completo [url]https://www.devmedia.com.br/class-read-e-write-no-delphi/22696[/url]

vlw galera, obg! :).. mt bom contar c vcs
Responder

12/01/2021

Jefferson

Boa noite Emerson!
Cara deu super certo, me ajudou demais, muito obrigado!

Tive que colocar na variável private FNome_cid, FCEP pois estava dando erro ao copilar o projeto.
E no Double click da Grid da tela de consulta coloquei a mesma função onkeypress, pois quero que o usuário utilize as 2 opções.


Código:

unit UnitConsulCidade;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, FireDAC.Stan.Intf,
FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS,
FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.Imaging.pngimage, Vcl.ExtCtrls,
Vcl.StdCtrls, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids;

type
TRetCidade = record
Nome: string;
CEP: string;
end;

TFrmConsulCidade = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
DBGridConsulCidade: TDBGrid;
SpeedButton1: TSpeedButton;
EdtConsultaCidade: TEdit;
Image1: TImage;
Label1: TLabel;
procedure SpeedButton1Click(Sender: TObject);
procedure DBGridConsulCidadeDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure EdtConsultaCidadeChange(Sender: TObject);
procedure DBGridConsulCidadeKeyPress(Sender: TObject; var Key: Char);
procedure DBGridConsulCidadeDblClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EdtConsultaCidadeKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
FNome_cid: string; // retorna o nome da cidade
FCEP: string; // retorna o CEP da cidade
public
{ Public declarations }
class function Abre: TRetCidade; // função que deverá ser chamada onde se pretender utilizar a consulta de cidades
end;

// não precisa declarar a variável abaixo. todo o tratamento será feito pelo médoto Abre (class function Abre)
//var
// FrmConsulCidade: TFrmConsulCidade;

implementation

{$R *.dfm}

// abaixo deveria ter somente a UnitDataModule, porque o dataset deveria estar na própria tela de consulta
// ** a tela de consulta precisa ser auto-suficiente, precisando somente do datamodulo **
uses
UnitDataModule, UnitCadCidade;

class function TFrmConsulCidade.Abre: TRetCidade;
var
FrmConsulta: TFrmConsulCidade;
begin
FrmConsulta := TFrmConsulCidade.Create(nil);
if FrmConsulta.ShowModal = mrOk then // se finalizou com Ok
begin
Result.Nome := FrmConsulta.FNome_Cid;
Result.CEP := FrmConsulta.FCEP;
end
else
begin
Result.Nome := EmptyStr;
Result.CEP := EmptyStr;
end;
FreeAndNil(FrmConsulta); // finaliza o objeto e libera a memória utilizada
end;

procedure TFrmConsulCidade.FormCreate(Sender: TObject);
begin
// inicializa os campos de retorno com conteúdo vazio
FNome_cid := EmptyStr;
FCep := EmptyStr;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeDblClick(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FNome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
FCEP := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
ModalResult := mrOk; // fecha a tela com Ok
end;

procedure TFrmConsulCidade.DBGridConsulCidadeDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if not odd(FrmCadasCidade.FDQryCidade.RecNo) then
if not (gdSelected in State) then
begin
DBGridConsulCidade.Canvas.Brush.Color := clGradientInactiveCaption;
DBGridConsulCidade.Canvas.FillRect(Rect);
DBGridConsulCidade.DefaultDrawDataCell(rect,Column.Field,state);
end;
end;

procedure TFrmConsulCidade.DBGridConsulCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FNome_cid := FrmCadasCidade.FDQryCidade.FieldByName('NOME_CID').AsString;
FCEP := FrmCadasCidade.FDQryCidade.FieldByName('CEP').AsString;
ModalResult := mrOk; // fecha a tela com Ok
end;
end;


procedure TFrmConsulCidade.EdtConsultaCidadeChange(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FrmCadasCidade.FDQryCidade.close;
FrmCadasCidade.FDQryCidade.sql.clear;
FrmCadasCidade.FDQryCidade.sql.add('select * from cidade where nome_cid like ''%'+ EdtConsultaCidade.text+'%''');
FrmCadasCidade.FDQryCidade.open;
end;

procedure TFrmConsulCidade.EdtConsultaCidadeKeyPress(Sender: TObject;
var Key: Char);
begin
if key = #13 then
DBGridConsulCidade.SetFocus;
end;

procedure TFrmConsulCidade.FormShow(Sender: TObject);
begin
EdtConsultaCidade.SetFocus;
end;

procedure TFrmConsulCidade.SpeedButton1Click(Sender: TObject);
begin
// o dataset deveria estar na própria tela de consulta, e não usar o dataset de outra tela
FrmCadasCidade.FDQryCidade.Open;
end;

end.




Estou quase entendendo o que você fez, ainda não peguei todo código.
Mais muito obrigado...
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar