|
Usuários |
|
82 Usuários Online
|
|
[Artigos]
Conhecendo um pouco da RTTI – Parte III |
Publicado por rboaro : Sábado, Dezembro 22, 2012 - 09:12 GMT-3 (352 leituras)
comentar Enviar para um amigo Versão para impressão
|
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 pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|