Como criar uma classe em Delphi?
05/04/2017
0
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.
Post mais votado
05/04/2017
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
Mais Posts
05/04/2017
Huidemar Costa
Segue o link de dois artigos aqui da DevMedia:
https://www.devmedia.com.br/criando-uma-classe-delphi/23517
https://www.devmedia.com.br/class-read-e-write-no-delphi/22696
Veja se ajuda ;)
10/04/2017
Joaquim C.
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
12/01/2021
Jefferson
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...
Clique aqui para fazer login e interagir na Comunidade :)