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