Type = Procedure - O que é isso?
Quando eu faço assim:
TNotifyValidate = procedure (Documento: TDocumentoNovo) of object;
O que eu estou declarando e qual a finalidade disso e como eu uso isso?
Pjava
Curtidas 0
Respostas
Marco Salles
18/07/2011
È o recurso muito interressante do Delphi , conhecido como Ponteiros de Métodos ...
Vejamos
Type
TNotifyValidate = procedure (Documento: TDocumentoNovo) of object;
Imagine uma classe
TClassA = TClass
procedure FazerAlgo(Documento: TDocumentoNovo) ; // Tipo procedimental
...
end;
Agora definimos um Class B
TClassB = TClass
onFazerAlgo: TNotifyValidate; // DEFINIÇÂO DE UMA VARIAVEL DO TIPO TNotifyValidate
....
end;
ps) A VAriavel definida anteriomente pode receber que valores ???? .. Pode receber Ponteiros de metodos que
contenham a mesma assinatura que o Type TNotifyValidate .
Os objetos da ClassB não tem nada haver com os objetos da ClassA , porém podemos atribuir a variavel
onFazerAlgo um método de um objeto da ClassA , pois esses esses métodos são compativeis em sua
assinatura
Veja a utilização
var
ObjClassA:TClassA;
ObjClassB:TClassB;
Documento: TDocumentoNovo;
begin
ObjClassB:=TObjClassb.create;
ObjClassB.OnFazerAlgo:=ObjClassA.FazerAlgo; // Atribuição do método
ObjClassB.OnFazerAlgo(Documento); //Excecução do Método
ObjClassB.free;
end;
Note que não definimos o método na TClassB , porém exceutamos o método FazerAlgo Definido na TClassA
Este é um exemplo sem pouco valor , na prática é muito utilizado na delegação internamente no Delphi
Vc tem um Botão e seu evento Onclik .. No Form vc tem o método procedure Button1Click(Sender: TObject);
O que nos bastidores o Delphi Faz é :
Button1.onclick := self.Button1Click ; // Atribuição do método
quando vc executa
Button1(sender) ; //Excecução do Método ..o método chamado é o método definido no Formulario
Vejamos
Type
TNotifyValidate = procedure (Documento: TDocumentoNovo) of object;
Imagine uma classe
TClassA = TClass
procedure FazerAlgo(Documento: TDocumentoNovo) ; // Tipo procedimental
...
end;
Agora definimos um Class B
TClassB = TClass
onFazerAlgo: TNotifyValidate; // DEFINIÇÂO DE UMA VARIAVEL DO TIPO TNotifyValidate
....
end;
ps) A VAriavel definida anteriomente pode receber que valores ???? .. Pode receber Ponteiros de metodos que
contenham a mesma assinatura que o Type TNotifyValidate .
Os objetos da ClassB não tem nada haver com os objetos da ClassA , porém podemos atribuir a variavel
onFazerAlgo um método de um objeto da ClassA , pois esses esses métodos são compativeis em sua
assinatura
Veja a utilização
var
ObjClassA:TClassA;
ObjClassB:TClassB;
Documento: TDocumentoNovo;
begin
ObjClassB:=TObjClassb.create;
ObjClassB.OnFazerAlgo:=ObjClassA.FazerAlgo; // Atribuição do método
ObjClassB.OnFazerAlgo(Documento); //Excecução do Método
ObjClassB.free;
end;
Note que não definimos o método na TClassB , porém exceutamos o método FazerAlgo Definido na TClassA
Este é um exemplo sem pouco valor , na prática é muito utilizado na delegação internamente no Delphi
Vc tem um Botão e seu evento Onclik .. No Form vc tem o método procedure Button1Click(Sender: TObject);
O que nos bastidores o Delphi Faz é :
Button1.onclick := self.Button1Click ; // Atribuição do método
quando vc executa
Button1(sender) ; //Excecução do Método ..o método chamado é o método definido no Formulario
GOSTEI 0