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.


a


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;

 

s


c

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.