Preenchendo Tree Views

Compartilhar/Favoritos

Saiba como preeencher um tree view em tempo de execução a partir de uma fonte de dados ordenada qualquer.

Este é de um grupo de posts muito antigos, de 2002. Vêm do meu antigo site, quando ainda trabalhava com Delphi e tinha um K6-2(!!!!). Bons tempos aqueles…

Provavelmente não serve para muita coisa hoje, mas é legal ver como as coisas eram. Além disso, ainda há gente acessando!

Parece ser bem comum a dificuldade em preencher tree views em tempo de execução. Ao menos é o que percebo nos news sobre Delphi.

O mais usual, acredito, é preencher através de uma fonte de dados ordenada, de forma que a árvore totalmente aberta tenha a mesma ordem dos itens da lista. Essa fonte pode ser uma tabela de um banco de dados, um arquivo texto interpretável ou até mesmo uma array constante no aplicativo.

O método que será apresentado funciona bem para qualquer uma dessas fontes.

Para demonstrar o método, usaremos um exemplo de fonte de dados simples: uma array com os nodos da árvore.

type
  TArvoreNodo = record
    Nivel: Integer;
    Nome: string;
  end;
 
const
  CNodos: array[0..12] of TArvoreNodo = (
    (Nivel: 0; Nome: '1'),
    (Nivel: 1; Nome: '1.1'),
    (Nivel: 1; Nome: '1.2'),
    (Nivel: 2; Nome: '1.2.1'),
    (Nivel: 2; Nome: '1.2.2'),
    (Nivel: 2; Nome: '1.2.3'),
    (Nivel: 1; Nome: '1.3'),
    (Nivel: 2; Nome: '1.3.1'),
    (Nivel: 3; Nome: '1.3.1.1'),
    (Nivel: 3; Nome: '1.3.1.2'),
    (Nivel: 0; Nome: '2'),
    (Nivel: 1; Nome: '2.1'),
    (Nivel: 1; Nome: '2.2')
  );
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Niveis: array[0..9] of TTreeNode;
  I: Integer;
  Node: TTreeNode;
  UltNivel: Integer;
begin
  UltNivel := 0;
  for I := Low(CNodos) to High(CNodos) do
    with CNodos[I] do begin
      if (Nivel < 0) or (Nivel > High(Niveis)) then
        raise Exception.Create('Nível fora dos limites.');
      if Nivel > UltNivel + 1 then
        raise Exception.Create('O nível não pode ser maior que o do nodo anterior acrescido de um.');
      if Nivel > 0 then
        Node := TreeView1.Items.AddChild(Niveis[Nivel - 1], Nome)
      else
        Node := TreeView1.Items.Add(nil, Nome);
      Niveis[Nivel] := Node;
      UltNivel := Nivel;
    end;
end;

Explicando

A idéia principal da função é gravar em uma array interna todos os nodos “pai”, ou seja, aqueles que podem ser usados como pai em qualquer momento. Ao “voltar” dois níveis, por exemplo, a função sabe qual nodo deverá ser usado como pai porque gravou na array.

Se sua árvore tiver mais de 10 níveis, aumente o limite da array Niveis.

Você pode alterar essa função para que se adeque às suas necessidades. Em uma tabela, por exemplo, você deverá provavelmente mudar o for para while e incluir código de mudança de registro dentro do looping.

Perceba que para que esse método funcione, cada item deve ter o nível que está localizado, a começar de zero.

Use sua criatividade para alterar a função de acordo com o que precisa. Não se assuste se ela ficar muito maior que o exemplo pois ele foi escolhido justamente por ser uma das formas mais simples para que você possa entender melhor como fazer suas alterações.

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Translate »