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.