Capturar o nome do método associado a um ev ento de um objeto qualquer de forma dinâmica

Delphi

22/10/2015

Senhores bom dia,
A rotina abaixo verifica se o evento OnExit do objeto edt1 possui algum método associado:

procedure TForm1.btn2Click(Sender: TObject);
var
ctxRtti : TRttiContext;
typRtti : TRttiType;
prpRtti : TRttiProperty;
mthRtti : TArray<TRttiMethod>;
I: Integer;
begin
mem1.Lines.Clear;
ctxRtti := TRttiContext.Create;
try
typRtti := ctxRtti.GetType(edt1.ClassType);
prpRtti := typRtti.GetProperty('OnExit');
mem1.Lines.Add(prpRtti.Name + '=' + prpRtti.GetValue(edt1).ToString);
finally
ctxRtti.Free;
end;
end;

O comando "prpRtti.GetValue(edt1).ToString" retorna "(method code=0054B7C4, data=01E0CFF0)" enquanto outros eventos que não tem método associado retorna "(empty)".
Analisando o código fonte do método "ToString" vi que ele executa este comando "Format('(method code=%p, data=%p)', [FData.FAsMethod.Code, FData.FAsMethod.Data]);". Acredito que é por aí que vou conseguir chegar no método, o problema é que "FData" é privado e não consigo acessar as propriedades desta classe.
Como eu conseguiria ter acesso ao nome do método associado a um evento de uma classe qualquer de forma dinâmica?

Estou usando Delphi 2010

Pela vossa atenção muito obrigado.
Saulo Lima

Saulo Lima

Curtidas 0

Respostas

Marco Salles

Marco Salles

22/10/2015

Desculpe não entendi muito

Vc diz

A rotina abaixo verifica se o evento OnExit do objeto edt1 possui algum método associado:


......

Depois vc pergunta

Como eu conseguiria ter acesso ao nome do método associado a um evento de uma classe qualquer de forma dinâmica?





Eu acredito que vc para isto deva passar um Objeto Instanciado da Classe que vc quer

Var
Obj:TClassqueQueroVerificar;
begin
Obj:=TClassqueQueroVerificar.create;
try
...... Método Seu lá de cia
typRtti := ctxRtti.GetType(Obj.ClassType);
prpRtti := typRtti.GetProperty('NomeDoEvento');
................
finally
Obje.free


Não seria isto ???
GOSTEI 0
POSTAR