Almacene más datos personalizados en el nodo de árbol de una vista de árbol

El componente TTreeView Delphi muestra una lista jerárquica de elementos: nodos de árbol. Un nodo se presenta por texto de nodo y una imagen opcional. Cada nodo en una vista de árbol es una instancia de una clase TTreeNode.

Si bien puede completar la vista de árbol con elementos en tiempo de diseño, utilizando el Editor de elementos de TreeView, en la mayoría de los casos llene su vista de árbol en tiempo de ejecución, dependiendo de qué se trate su aplicación.

El Editor de elementos de TreeView revela que solo hay un puñado de información que puede "adjuntar" a un nodo: texto y algunos índices de imágenes (para el estado normal, expandido, seleccionado y similar).

En esencia, el componente de vista de árbol es fácil de programar. Hay un par de métodos para agregar nuevos nodos al árbol y establecer su jerarquía.

Aquí se explica cómo agregar 10 nodos a la vista de árbol (denominado "TreeView1"). Tenga en cuenta que la propiedad Elementos proporciona acceso a todos los nodos del árbol. AddChild agrega un nuevo nodo a la vista de árbol. El primer parámetro es el nodo primario (para construir la jerarquía) y el segundo parámetro es el texto del nodo.

AddChild devuelve el TTreeNode recién agregado. En el ejemplo de código anterior, los 10 nodos se agregan como nodos raíz (no tienen nodo principal).

En situaciones más complejas, desearía que sus nodos transporten más información, preferiblemente tener algunos valores especiales (propiedades) que sean específicos del proyecto que está desarrollando.

Supongamos que desea mostrar datos de artículos de pedido de clientes de su base de datos. Cada cliente puede tener más pedidos y cada pedido se compone de más artículos. Esta es una relación jerárquica que se puede mostrar en una vista de árbol:

En su base de datos habría más información para cada pedido y para cada artículo. La vista de árbol muestra el estado actual (solo lectura) y desea ver los detalles por pedido (o incluso por artículo) del pedido seleccionado..

Cuando el usuario selecciona el nodo "Pedido_1_1", desea que los detalles del pedido (suma total, fecha, etc.) se muestren al usuario.

Puede, en ese momento, obtener los datos requeridos de la base de datos, PERO necesitaría conocer el identificador único (digamos un valor entero) del orden seleccionado para obtener los datos correctos.

Necesitamos una forma de almacenar este identificador de pedido junto con el nodo, pero no podemos usar la propiedad Text. El valor personalizado que necesitamos almacenar en cada nodo es un entero (solo un ejemplo).

Cuando ocurre tal situación, es posible que sienta la tentación de buscar la propiedad Tag (muchos componentes de Delphi sí lo tienen), pero la propiedad TTreeNode no expone la propiedad Tag..

Agregar datos personalizados a los nodos del árbol: la propiedad TreeNode.Data

La propiedad de datos de un nodo de árbol le permite asociar sus datos personalizados con un nodo de árbol. Los datos son un puntero y pueden apuntar a objetos y registros. La visualización de datos XML (RSS Feed) en TreeView muestra cómo almacenar una variable de tipo de registro en la propiedad Data de un nodo de árbol.

Muchas clases de tipo de elemento exponen la propiedad de datos que puede usar para almacenar cualquier objeto junto con el elemento. Un ejemplo es el TListItem de un componente TListView. Aquí se explica cómo agregar objetos a la propiedad de datos.

Agregue datos personalizados a los nodos del árbol: The TreeView.CreateNodeClass

Si no desea utilizar la propiedad Data del TTreeNode, sino que desea ampliar su propio TreeNode con algunas propiedades, Delphi también tiene una solución.

Digamos que quieres poder hacer

Aquí le mostramos cómo extender el TTreeNode estándar con algunas propiedades propias:

  1. Cree su TMyTreeNode extendiendo el TTreeNode.
  2. Agregar una propiedad de cadena MyProperty.
  3. Maneje OnCreateNodeClass para que la vista de árbol especifique que su clase de nodo debe ser creada.
  4. Exponga algo como la propiedad TreeView1_SelectedNode en el nivel del formulario. Esto sería del tipo TMyTreeNode.
  5. Maneje OnChange de la vista de árbol para escribir en el nodo seleccionado el valor del nodo seleccionado.
  6. Use TreeView1_Selected.myProperty para leer o escribir un nuevo valor personalizado.

Aquí está el código fuente completo (TButton: "Button1" y TTreeView: "TreeView1" en un formulario):

Esta vez no se usa la propiedad Data de la clase TTreeNode. Más bien, extiende la clase TTreeNode para tener su propia versión de un nodo de árbol: TMyTreeNode.

Usando el evento OnCreateNodeClass de la vista de árbol, crea un nodo de su clase personalizada en lugar de la clase TTreenode estándar.