Armazene mais dados personalizados no nó da árvore no Delphi

O TTreeView Delphi O componente exibe uma lista hierárquica de itens - nós da árvore. Um nó é apresentado pelo texto do nó e uma imagem opcional. Cada nó em uma visualização em árvore é uma instância de uma classe TTreeNode.

Embora você possa preencher a exibição em árvore com itens em tempo de design, use o Editor de itens do TreeView, na maioria dos casos, você preencheria sua exibição em árvore em tempo de execução, dependendo da finalidade do seu aplicativo.

O TreeView Items Editor revela que há apenas algumas informações que você pode "anexar" a um nó: texto e alguns índices de imagem (para o estado normal, expandido, selecionado e similares).

Em essência, é fácil programar o componente de visualização em árvore. Existem alguns métodos para adicionar novos nós à árvore e definir sua hierarquia.

Veja como adicionar 10 nós à exibição em árvore (denominada "TreeView1"). Observe que a propriedade Items fornece acesso a todos os nós na árvore. O AddChild adiciona um novo nó à exibição em árvore. O primeiro parâmetro é o nó pai (para construir a hierarquia) e o segundo parâmetro é o texto do nó.

instagram viewer

O AddChild retorna o TTreeNode recém-adicionado. Acima amostra de código, todos os 10 nós são adicionados como nós raiz (não possuem nó pai).

Em qualquer situação mais complexa, você deseja que seus nós carreguem mais informações - de preferência, para ter alguns valores especiais (propriedades) específicos ao projeto que você está desenvolvendo.

Digamos que você queira exibir dados do item do pedido do cliente em seu banco de dados. Cada cliente pode ter mais pedidos e cada pedido é composto de mais itens. Esta é uma relação hierárquica que se pode exibir em uma exibição em árvore:

No seu banco de dados, haveria mais informações para cada pedido e para cada item. A exibição em árvore exibe o estado atual (somente leitura) - e você deseja ver os detalhes por pedido (ou mesmo por item) do pedido selecionado.

Quando o usuário seleciona o nó "Pedido_1_1", você deseja que os detalhes do pedido (soma total, data etc.) sejam exibidos ao usuário.

Naquele momento, é possível buscar os dados necessários no banco de dados, mas você precisaria conhecer o identificador exclusivo (digamos, um valor inteiro) da ordem selecionada para obter os dados corretos.

Precisamos de uma maneira de armazenar esse identificador de pedido junto com o nó, mas não podemos usar a propriedade Text. O valor personalizado que precisamos armazenar em cada nó é um número inteiro (apenas um exemplo).

Quando uma situação dessas acontece, você pode ficar tentado a procurar a propriedade Tag (muitos componentes Delphi possuem), mas a propriedade Tag não é exposta pela classe TTreeNode.

Adicionar dados personalizados aos nós da árvore: O TreeNode. Propriedade de dados

A propriedade Data de um nó da árvore permite associar seus dados personalizados a um nó da árvore. Dados são um ponteiro e pode apontar para objetos e registros. A exibição de dados XML (feed RSS) em um TreeView mostra como armazenar um tipo de registro variável na propriedade Data de um nó da árvore.

Muitas classes de tipo de item expõem a propriedade Data - você pode usar para armazenar qualquer objeto junto com o item. Um exemplo é o TListItem de um componente TListView. Aqui está como adicionar objetos à propriedade Data.

Adicionar dados personalizados aos nós da árvore: O TreeView. CreateNodeClass

Se você não deseja usar a propriedade Data do TTreeNode, mas gostaria de ter seu próprio TreeNode estendido com algumas propriedades, o Delphi também tem uma solução.

Digamos que você queira fazer

Veja como estender o TTreeNode padrão com algumas propriedades próprias:

  1. Crie seu TMyTreeNode estendendo o TTreeNode.
  2. Adicione uma propriedade de sequência MyProperty.
  3. Manipule o OnCreateNodeClass para que a exibição em árvore especifique sua classe de nó deve ser criada.
  4. Exponha algo como a propriedade TreeView1_SelectedNode no nível do formulário. Isso seria do tipo TMyTreeNode.
  5. Manipule o OnChange da exibição em árvore para gravar no SelectedNode o valor do nó que está selecionado.
  6. Use TreeView1_Selected.myProperty para ler ou gravar um novo valor personalizado.

Aqui está o código fonte completo (TButton: "Button1" e TTreeView: "TreeView1" em um formulário):

Desta vez, a propriedade Data da classe TTreeNode não é usada. Em vez disso, você estende a classe TTreeNode para ter sua própria versão de um nó da árvore: TMyTreeNode.

Usando o evento OnCreateNodeClass da exibição em árvore, você cria um nó da sua classe personalizada em vez da classe TTreenode padrão.