Il componente TTreeView Delphi visualizza un elenco gerarchico di nodi dell'albero degli elementi. Un nodo è presentato dal testo del nodo e un'immagine opzionale. Ogni nodo in una vista ad albero è un'istanza di una classe TTreeNode.
Sebbene sia possibile compilare la vista ad albero con gli elementi in fase di progettazione, utilizzando l'Editor degli elementi di TreeView, nella maggior parte dei casi si riempirebbe la vista ad albero in fase di esecuzione, a seconda dell'argomento dell'applicazione.
L'Editor degli articoli di TreeView rivela che esiste solo una manciata di informazioni che puoi "collegare" a un nodo: testo e alcuni indici di immagini (per lo stato normale, espansi, selezionati e simili).
In sostanza, il componente di visualizzazione ad albero è facile da programmare. Esistono un paio di metodi per aggiungere nuovi nodi all'albero e impostarne la gerarchia.
Ecco come aggiungere 10 nodi alla vista ad albero (denominata "TreeView1"). Si noti che la proprietà Items fornisce l'accesso a tutti i nodi nella struttura. AddChild aggiunge un nuovo nodo alla vista ad albero. Il primo parametro è il nodo padre (per costruire la gerarchia) e il secondo parametro è il testo del nodo.
AddChild restituisce il TTreeNode appena aggiunto. Nell'esempio di codice sopra riportato, tutti i 10 nodi vengono aggiunti come nodi radice (non hanno un nodo padre).
In qualsiasi situazione più complessa vorresti che i tuoi nodi portassero più informazioni, preferibilmente con dei valori speciali (proprietà) specifici per il progetto che stai sviluppando.
Supponiamo che tu voglia visualizzare i dati degli articoli dell'ordine cliente dal tuo database. Ogni cliente può avere più ordini e ogni ordine è composto da più articoli. Questa è una relazione gerarchica che è possibile visualizzare in una vista ad albero:
Nel tuo database ci sarebbero più informazioni per ogni ordine e per ogni articolo. La vista ad albero mostra lo stato corrente (sola lettura) e si desidera visualizzare i dettagli per ordine (o anche per articolo) per l'ordine selezionato.
Quando l'utente seleziona il nodo "Ordine_1_1", si desidera che i dettagli dell'ordine (somma totale, data, ecc.) Vengano visualizzati all'utente.
È possibile, in quel momento, recuperare i dati richiesti dal database, MA sarebbe necessario conoscere l'identificatore univoco (diciamo un valore intero) dell'ordine selezionato per acquisire i dati corretti.
Abbiamo bisogno di un modo per memorizzare questo identificativo dell'ordine insieme al nodo ma non possiamo usare la proprietà Text. Il valore personalizzato che dobbiamo memorizzare in ciascun nodo è un numero intero (solo un esempio).
Quando si verifica una situazione del genere, potresti essere tentato di cercare la proprietà Tag (molti componenti Delphi hanno) ma la proprietà Tag non è esposta dalla classe TTreeNode.
La proprietà Data di un nodo ad albero consente di associare i dati personalizzati a un nodo ad albero. I dati sono un puntatore e possono puntare a oggetti e record. La visualizzazione di dati XML (feed RSS) in un TreeView mostra come archiviare una variabile del tipo di record nella proprietà Data di un nodo dell'albero.
Molte classi di tipo di elemento espongono la proprietà Data, che è possibile utilizzare per archiviare qualsiasi oggetto insieme all'elemento. Un esempio è il TListItem di un componente TListView. Ecco come aggiungere oggetti alla proprietà Data.
Se non si desidera utilizzare la proprietà Data di TTreeNode, ma si desidera estendere il proprio TreeNode con alcune proprietà, Delphi ha anche una soluzione.
Di 'che vuoi essere in grado di fare
Ecco come estendere il TTreeNode standard con alcune proprietà:
Ecco il codice sorgente completo (TButton: "Button1" e TTreeView: "TreeView1" in un modulo):
Questa volta non viene utilizzata la proprietà Data della classe TTreeNode. Piuttosto, estendi la classe TTreeNode per avere la tua versione di un nodo ad albero: TMyTreeNode.
Utilizzando l'evento OnCreateNodeClass della vista ad albero, si crea un nodo della classe personalizzata anziché la classe TTreenode standard.