Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 12 de Junho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
82 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Conhecendo um pouco da RTTI – Parte III
Publicado por rboaro : Sábado, Dezembro 22, 2012 - 09:12 GMT-3 (352 leituras)
Comentários comentar   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Diego Garcia Chegou a hora da “invocação” rs. Nessa parte do nosso estudo sobre RTTI vamos ver como podemos invocar métodos de objetos através da RTTI e como é feita a passagem de parâmetros para estes.
Para começar, vamos fazer uma rotina básica para listar os métodos de um objeto, seguindo a mesma ideia dos outros exemplos que fizemos anteriormente. Para nosso exemplo vamos criar um objeto simples com dois métodos, um para converter os caracteres de uma string para maiúsculo e outro para converter para minusculo.
type
TTeste = class
public
function strParaMaiusculo(const str : string):string;
function strParaMinusculo(const str : string):string;
end;

function TTeste.strParaMaiusculo(const str: string): string;
begin
Result := AnsiUpperCase(str);
end;

function TTeste.strParaMinusculo(const str: string): string;
begin
Result := AnsiLowerCase(str);
end;
Feito o objeto, vamos fazer a rotina para listar os métodos de um objeto
procedure retornarNomeMetodosRTTIObj(obj: TObject; linhasRetorno: TStrings);
var
mtdRtti: TRttiMethod;
typRtti: TRttiType;
ctxRtti: TRttiContext;
begin
ctxRtti := TRttiContext.create;
linhasRetorno.Clear;
try
typRtti := ctxRtti.GetType(obj.ClassType);

for mtdRtti in typRtti.GetMethods do
begin
//para retornar somente os métodos da classe em questão
if mtdRtti.Parent.Name <> obj.ClassName then
Continue;

linhasRetorno.Add(mtdRtti.Name)
end;

finally
ctxRtti.Free;
end;
end;

Se executarmos essa rotina passando nosso objeto TTeste como parâmetro, teremos o seguinte retorno:
strParaMaiusculo
strParaMinusculo
Agora que conhecemos os métodos do nosso objeto, vamos criar uma rotina para listar os parâmetros de um determinado método, faremos do jeito simples, passamos o objeto e o nome do método e a rotina nos retorna uma lista com o nome e tipo dos parâmetros.
procedure retornarParametrosMetodoRTTIObj(obj: TObject;
const nomeMetodo: String; linhasRetorno: TStrings);
var
prmRtti : TRttiParameter;
typRtti: TRttiType;
ctxRtti: TRttiContext;
begin
ctxRtti := TRttiContext.create;
linhasRetorno.Clear;
try
typRtti := ctxRtti.GetType(obj.ClassType);

for prmRtti in typRtti.GetMethod(nomeMetodo).GetParameters do
linhasRetorno.Add(prmRtti.Name + ': ' + prmRtti.ParamType.ToString);

finally
ctxRtti.Free;
end;
end;
O resultado da rotina acima passando como parâmetro o método strParaMaiusculo seria:
str: string
Já temos os métodos e já temos seus parâmetros, é chegada a hora de invocar o método. Faremos da seguinte maneira, vamos criar uma rotina em que passaremos uma instancia de um objeto, o nome do método que iremos invocar e um array de TValue com os parâmetros deste método, para nos auxiliar vamos criar um type para o array dinâmico de TValue.
type
TArrayOfValue = Array of TValue;

function executarMetodoRTTIObj(obj: TObject; const nomeMetodo: string;
parametros: TArrayOfValue): TValue;
var
mtdRtti : TRttiMethod;
ctxRtti : TRttiContext;
retorno : TValue;
begin
ctxRtti := TRttiContext.Create;
try
mtdRtti := ctxRtti.GetType(obj.ClassType).GetMethod(nomeMetodo);
retorno := mtdRtti.Invoke(obj,parametros);
finally
ctxRtti.Free;
Result := retorno;
end;
end;
A chamada dessa rotina seria algo como:
procedure TForm1.Button1Click(Sender: TObject);
var
oTeste : TTeste;
prm : TArrayOfValue;
begin
oTeste := TTeste.Create;
try
SetLength(prm,1);
prm[0] := 'teste';
ShowMessage(executarMetodoRTTIObj(oTeste,'strParaMaiusculo',prm).ToString);
finally
oTeste.Free;
end;
end;
e como resultado teremos a palavra TESTE em maiúsculo, que seria o mesmo resultado ao executar o método oTeste.strParaMaiusculo(‘teste’);.
Algo interessante que não pode passar sem receber a sua devida atenção é o tipo TValue, que acabou sendo uma das partes principais do nosso exemplo. Sendo assim, na próxima parte deste estudo, iremos conhecer um pouco mais sobre o TValue e veremos também como lidar com os vetores em rotinas da RTTI.


Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados