Stockez plus de données personnalisées dans le nœud d'arbre d'une vue d'arbre

Le composant TTreeView Delphi affiche une liste hiérarchique de nœuds d'arborescence d'éléments. Un nœud est présenté par le texte du nœud et une image facultative. Chaque nœud dans une arborescence est une instance d'une classe TTreeNode.

Bien que vous puissiez remplir l'arborescence avec des éléments au moment de la conception, à l'aide de l'éditeur d'éléments TreeView, dans la plupart des cas, vous remplissez votre arborescence au moment de l'exécution, en fonction de l'objet de votre application..

L'éditeur d'articles TreeView révèle qu'il n'y a qu'une poignée d'informations que vous pouvez «attacher» à un nœud: du texte et quelques index d'images (pour l'état normal, développé, sélectionné et similaire).

Essentiellement, le composant d'arborescence est facile à programmer. Il existe quelques méthodes pour ajouter de nouveaux nœuds à l'arborescence et définir leur hiérarchie.

Voici comment ajouter 10 nœuds à l'arborescence (nommée "TreeView1"). Notez que la propriété Items donne accès à tous les nœuds de l'arborescence. AddChild ajoute un nouveau nœud à l'arborescence. Le premier paramètre est le nœud parent (pour créer la hiérarchie) et le deuxième paramètre est le texte du nœud.

AddChild renvoie le TTreeNode nouvellement ajouté. Dans l'exemple de code ci-dessus, les 10 nœuds sont ajoutés en tant que nœuds racine (n'ont pas de nœud parent).

Dans toutes les situations plus complexes, vous voudriez que vos nœuds transportent plus d'informations - de préférence avoir des valeurs spéciales (propriétés) spécifiques au projet que vous développez.

Supposons que vous souhaitiez afficher les données des articles de commande client à partir de votre base de données. Chaque client peut avoir plus de commandes et chaque commande est composée de plusieurs articles. Il s'agit d'une relation hiérarchique que l'on peut afficher dans une arborescence:

Dans votre base de données, il y aurait plus d'informations pour chaque commande et pour chaque article. L'arborescence affiche l'état actuel (en lecture seule) - et vous voulez voir les détails par commande (ou même par article) pour la commande sélectionnée.

Lorsque l'utilisateur sélectionne le nœud "Order_1_1", vous voulez que les détails de la commande (somme totale, date, etc.) soient affichés à l'utilisateur.

Vous pouvez, à ce moment-là, récupérer les données requises de la base de données, MAIS vous auriez besoin de connaître l'identifiant unique (disons une valeur entière) de l'ordre sélectionné pour récupérer les données correctes.

Nous avons besoin d'un moyen de stocker cet identifiant de commande avec le nœud, mais nous ne pouvons pas utiliser la propriété Text. La valeur personnalisée que nous devons stocker dans chaque nœud est un entier (juste un exemple).

Lorsqu'une telle situation se produit, vous pourriez être tenté de rechercher la propriété Tag (de nombreux composants Delphi l'ont), mais la propriété Tag n'est pas exposée par la classe TTreeNode.

Ajouter des données personnalisées aux nœuds d'arbre: la propriété TreeNode.Data

La propriété Data d'un nœud d'arbre vous permet d'associer vos données personnalisées à un nœud d'arbre. Les données sont un pointeur et peuvent pointer vers des objets et des enregistrements. L'affichage des données XML (flux RSS) dans un TreeView montre comment stocker une variable de type d'enregistrement dans la propriété Data d'un nœud d'arbre.

De nombreuses classes de type d'élément exposent la propriété Data, que vous pouvez utiliser pour stocker n'importe quel objet avec l'élément. Un exemple est le TListItem d'un composant TListView. Voici comment ajouter des objets à la propriété Data.

Ajouter des données personnalisées aux nœuds d'arbre: The TreeView.CreateNodeClass

Si vous ne souhaitez pas utiliser la propriété Data du TTreeNode, mais que vous souhaitez plutôt que votre propre TreeNode soit étendu avec quelques propriétés, Delphi a également une solution.

Dis que tu veux pouvoir faire

Voici comment étendre le TTreeNode standard avec quelques propriétés propres:

  1. Créez votre TMyTreeNode en étendant le TTreeNode.
  2. Ajoutez-lui une propriété de chaîne MyProperty.
  3. Gérez la classe OnCreateNodeClass de l'arborescence pour spécifier que votre classe de nœuds doit être créée.
  4. Exposez quelque chose comme la propriété TreeView1_SelectedNode au niveau du formulaire. Ce serait de type TMyTreeNode.
  5. Gérer OnChange de l'arborescence pour écrire dans le nœud sélectionné la valeur du nœud sélectionné.
  6. Utilisez TreeView1_Selected.myProperty pour lire ou écrire une nouvelle valeur personnalisée.

Voici le code source complet (TButton: "Button1" et TTreeView: "TreeView1" sur un formulaire):

Cette fois, la propriété Data de la classe TTreeNode n'est pas utilisée. Au lieu de cela, vous étendez la classe TTreeNode pour avoir votre propre version d'un nœud d'arbre: TMyTreeNode.

À l'aide de l'événement OnCreateNodeClass de l'arborescence, vous créez un nœud de votre classe personnalisée au lieu de la classe TTreenode standard.