Quick Tips : Carregando um objeto na treeView com RTTI

 

Nesta quick tip veremos como carregar um objeto na treeView dinamicamente com 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...

 

Insira um botão e uma TreeView no formulário.



Código do botão LoadClientes

 

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);

 

  LoadInTreeView(listaClientes);

end;

 

Código do método LoadIntTreeView.

 

procedure TForm1.LoadInTreeView(Lista: TList<TCliente>);

var c:TCliente;

    node: TTreeNode;

    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();

 

  //percorre lista de clientes

  for c in lista do

  begin

    //percorre as propriedades de TCliente

    for prop in props do

    begin

      //Se for a primeira propriedade adiciona um nó Pai

      //Senão insere um nó filho

      if(prop = props[0])then

      begin

        node := TreeView1.Items.Add(nil,'Cliente: ' + prop.GetValue(c).ToString);

      end

      else

      begin

        TreeView1.Items.AddChildObject(node,prop.name + ': ' + prop.GetValue(c).ToString,c);

      end;

    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.

Ricardo Coelho