Como saber os atributos de sua classe usando RTTI

Esse feriado passei boa parte do meu tempo desenvolvendo meu framework de persistência para usar em alguns projetos de meus clientes, para que fosse exterminado o problema de conexão direta dos componentes visuais com os Datasets da vida. Depois de muito fazer as aplicações usando a conexão direta com os Datasets(TDBEdit, TDBComboBox, TDBLookUpComboBox) vi que essa não era a melhor forma em grandes aplicações, mas em aplicações pequenas é extremamente útil e vantajoso. Então pensei e pesquisei como fazer tudo manualmente, e vi que uma boa solução seria separar em camadas criando classes de gerência e de modelo. Mas os modelos podem ter 50 atributos (nome, telefone, cpf, rg, …) e como o gerente saberia quais são os atributos dessa classe para que ele jogasse os valores desses atributos para o banco e vice-versa? Foi ai que lendo uma das revistas Clube Delphi eu lembrei que tinha uma falando sobre o RTTI que é mais ou menos o reflection do Java. Já sabendo o que usar, fui pesquisar mais uma vez e achei centenas de exemplo e juntando tudo vou compartilhar a solução de como consegui e que com certeza poderá ajudar muita gente.

{**
 * Obter atributos de uma classe
 *}
procedure metodoQualquer(objeto: TObject);
var
lListaPropriedades : PPropList;
lContPropriedades  : Integer;
x                  : Integer;
y                  : Integer;
PropInfo           : TPropInfo;
valorAtributo      : Variant;
nomeAtributo       : String;
begin

//obtém informações dos atributos que são Publisheds
lContPropriedades := GetPropList(objeto.ClassInfo, tkAny, nil);
GetMem( lListaPropriedades, lContPropriedades * SizeOf(TPropInfo) );

try
GetPropList(objeto, lListaPropriedades);
for x := 0 to Pred(lContPropriedades) do
begin
//obtém informações da propriedade
PropInfo      := TPropInfo(lListaPropriedades^[x]^);
valorAtributo := GetPropValue(objeto, PropInfo.Name);
nomeAtributo  := PropInfo.Name;
end;
finally
FreeMem(lListaPropriedades);
end;

end;
end;

Essa é um método que eu criei para mostrar como utilizar a técnica, ali no parâmetro OBJETO poderá ser passado qualquer classe que herde de TOBJECT. Em valorAtributo eu armazeno o valor do atributo e em nomeAtributo eu armazeno o nome do atributo, apartir daí fica fácil. Obs: Precisa declarar a unit TypInfo, os atributos da sua classe precisam ser published para essa técnica conseguir enchergar e retornar na lista de atributos. Até a próxima, fiquem com Deus.

Uma Resposta

  1. Christian Louboutin Disse:

    21….

    Following searching Google I found your site. I think both are great and I is going to be coming back again to you and them in the long term. Thanks rather a lot for this info.jessonlinptzcm/2011nov…

Deixe um comentário

Obs: A moderação de comentários está ativa e seu comentário pode demorar a aparecer. Não é necessário enviar seu comentário novamente.