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 I
Publicado por rboaro : Segunda, Dezembro 17, 2012 - 01:42 GMT-3 (516 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 Como vão amigos? sei que faz tempo que não atualizo aqui mas os estudos continuam, desta vez vamos brincar um pouco com o RTTI (Run-Time Type Information) do Delphi.
Falando um pouco sobre o que se trata, a RTTI consiste na estrutura de informações (disponibilizada pelo compilador) de objetos em tempo de execução. Com este recurso é possível acessar e manipular qualquer atributo de um objeto assim como é possível invocar seus métodos. A primeiro momento pode não parecer nada, mas isso abre uma infinidade de possibilidades, basta usar a imaginação =).
Vamos deixar um pouco a teoria de lado e vamos fazer um exemplo prático, vamos fazer um método que liste todos os atributos de um objeto.

uses
RTTI, typinfo;

procedure pegarValoresRTTIObj(objeto: TObject; linhasRetorno: TStrings);
var
fldRtti: TRttiField;
typRtti: TRttiType;
ctxRtti: TRttiContext;
begin
ctxRtti := TRttiContext.create;
try
typRtti := ctxRtti.GetType(objeto.ClassType);

for fldRtti in typRtti.GetFields do
begin
if fldRtti.GetValue(objeto).IsObject then
pegarValoresRTTIObj(fldRtti.GetValue(objeto).AsObject,linhasRetorno)
else
linhasRetorno.Add(objeto.ClassName + '-' + fldRtti.Name + '=' + fldRtti.GetValue(objeto).ToString);
end;
finally
ctxRtti.Free;
end;
end;

Agora vamos criar um objeto simples para testar esse método e vamos mostrar o resultado em um componente TMemo.
Vamos começar fazendo a classe, no exemplo vou fazer duas classes para que seja possível testar a chamada recursiva da função.

type
TDocumento = class
private
FTipo: string;
FCodigo: string;
published
property tipo : string read FTipo write FTipo;
property codigo : string read FCodigo write FCodigo;
end;

type
TPessoa = class
private
FNome: string;
FSobrenome: string;
FDocumento: TDocumento;
public
constructor create();
destructor free();
published
property nome : string read FNome write FNome;
property sobrenome : string read FSobrenome write FSobrenome;
property documento : TDocumento read FDocumento write FDocumento;
end;

constructor TPessoa.create;
begin
Self.FDocumento := TDocumento.Create;
end;

destructor TPessoa.free;
begin
Self.FDocumento.Free;
end;

Agora vamos fazer um método em um form qualquer para criar uma instancia da classe TPessoa e vamos finalmente chamar o método pegarValoresRTTIObj().

procedure TForm1.Button1Click(Sender: TObject);
var
objPessoa : TPessoa;
begin
objPessoa := TPessoa.create;
try
with objPessoa do
begin
nome := 'JOÃO';
sobrenome := 'DA SILVA';
documento.tipo := 'CPF';
documento.codigo := '123.852.468-1';
end;
pegarValoresRTTIObj(objPessoa,Memo1.Lines);
finally
objPessoa.free;
end;
end;

Ao executar esse método teremos em nosso memo o seguinte resultado

TPessoa-FNome=JOÃO
TPessoa-FSobrenome=DA SILVA
TDocumento-FTipo=CPF
TDocumento-FCodigo=123.852.468-1

Na próxima parte do estudo, vamos entender um poucos mais as classes TRttiContext,TRttiType e TRttiField que foram usadas no nosso exemplo e ver como foi feita a magica =).



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