terça-feira, 24 de novembro de 2009

Listando todas as propriedades de uma classe

Estive recentemente procurando na Internet meios de listar todas as propriedades de uma classe. Achei algumas maneiras porém na minha classe havia propriedades que eram classes portanto precisava de uma rotina recursiva e mais precisava saber como instanciar um novo objeto a partir de uma propriedade.
Enfim tive de criar a minha própria.
Segue abaixo para quem mais precisar:


procedure ListaPropriedades( t : TObject; s : TStringList );
Var
Count, Size, I: Integer;
List : PPropList;
PropInfo : PPropInfo;
PropValue: string;
begin
Count := GetPropList( t.ClassInfo, tkAny, nil );
Size := Count * SizeOf(Pointer);
GetMem(List, Size);
try
Count := GetPropList( t.ClassInfo, tkAny, List);
for i := 0 to Pred( Count ) do
begin
PropInfo := List^[I];
if PropInfo^.PropType^.Kind = tkClass then
ListaPropriedades( TObject( GetOrdProp(t,PropInfo)), s )
else
begin
PropValue := VarToStr( GetPropValue( t, PropInfo^.Name));
s.Add( Format('%s: %s = %s', [PropInfo^.Name, PropInfo^.PropType^.Name, PropValue]));
end;
end;
finally
freeMem( list );
end;
end;


Exemplo de uso:


obj := TMinhaClasse.Create( Self );
MinhaStringLista := TStringList.Create;

ListaPropriedades( obj, MinhaStringLista );




Reginaldo

email: reginaldo@unisis.com.br