Fórum Capturar o nome do método associado a um ev ento de um objeto qualquer de forma dinâmica #535231
22/10/2015
0
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
Curtir tópico
+ 0
Responder
Posts
23/10/2015
Marco Salles
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 ???
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)