Quick Tips : Carregando uma lista de objetos em um ListView com RTTI
Nesta quick tip veremos como carregar dinmicamente uma lista de objetos em um ListView utilizando RTTI.
Antes de começar vale lembrar que RTTI é um recurso da linguagem que permite recuperarmos informações sobre tipos(classes, propriedades, métodos) em tempo de execução e interagir com elas, recuperando seu nome, tipo, valor no caso de propriedades, executando no caso de métodos etc...
Nosso exemplo consiste na criação de uma lista de clientes, alimentação da mesma com valores fictícios e depois a carga dinâmica desta em um listView.
Insira um botão e um ListView no formulário e altere a propriedade viewStyle do ListView para vsReport.
Abaixo segue o código do dominio que será exibido na listView.
unit UCliente;
interface
{+M}
type
TCliente = class
private
Fcodigo: Integer;
Fnome: String;
Fbairro: String;
procedure Setcodigo(const Value: Integer);
procedure Setnome(const Value: String);
procedure Setbairro(const Value: String);
published
property codigo:Integer read Fcodigo write Setcodigo;
property nome:String read Fnome write Setnome;
property bairro:String read Fbairro write Setbairro;
end;
implementation
{ TCliente }
procedure TCliente.Setbairro(const Value: String);
begin
Fbairro := Value;
end;
procedure TCliente.Setcodigo(const Value: Integer);
begin
Fcodigo := Value;
end;
procedure TCliente.Setnome(const Value: String);
begin
Fnome := Value;
end;
end.
Código do botão Load Clientes
procedure TForm1.Button1Click(Sender: TObject);
var ListaClientes:TList<TCliente>;
c:TCliente;
begin
ListaClientes := TList<TCliente>.Create();
c := TCliente.Create();
c.codigo := 1;
c.nome := 'Ricardo Coelho';
c.bairro := 'Realengo';
ListaClientes.Add(c);
c := TCliente.Create();
c.codigo := 2;
c.nome := 'Fernanda Matias';
c.bairro := 'Taquara';
ListaClientes.Add(c);
c := TCliente.Create();
c.codigo := 3;
c.nome := 'Juliana Rosse';
c.bairro := 'Barra';
ListaClientes.Add(c);
c := TCliente.Create();
c.codigo := 4;
c.nome := 'maria Candido';
c.bairro := 'Irajá';
ListaClientes.Add(c);
LoadInListView(listaClientes);
end;
Código do método para montagem da listView
procedure TForm1.LoadInListView(Lista: TList<TCliente>);
var c:TCliente;
item:TListItem;
col:TListColumn;
context:TRttiContext;
tipo:TRttiType;
props:TArray<TRttiProperty>;
prop:TRttiProperty;
begin
//recupera um contexto RTTI, necessário para recuperação do tipo
context := TRttiContext.Create();
//recupera o tipo TCliente
tipo := context.GetType(TCliente.ClassInfo);
//recupera lista de propriedades de TCliente
props := tipo.GetProperties();
//Carrega colunas dinmicamente
for prop in props do
begin
col:=ListView1.Columns.Add;
col.Caption := prop.Name;
col.Width := 100;
end;
//percorre lista de clientes
for c in lista do
begin
//adiciona um item na listView
item := ListView1.Items.Add;
for prop in props do
begin
//Se for a primeira propriedade altera o caption do item
//senão adiciona subitens
if(prop = props[0])then
item.Caption := prop.GetValue(c).ToString
else
item.SubItems.Add(prop.GetValue(c).ToString);
end;
end;
end;
Resultado da execução da rotina.
É isso aí pessoal, espero que tenham gostado.
Fiquem a vontade para criticar, tirar dúvidas e sugerir novos temas.
Abraço.