Capturar o nome do método associado a um ev ento de um objeto qualquer de forma dinâmica
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.
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
Curtidas 0
Respostas
Marco Salles
22/10/2015
Desculpe não entendi muito
Vc diz
......
Depois vc pergunta
Eu acredito que vc para isto deva passar um Objeto Instanciado da Classe que vc quer
Não seria isto ???
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