Posso rendere invisibile un TTreeNode?
-
06-07-2019 - |
Domanda
TTreeNode non ha una proprietà Visible, quindi l'opzione ovvia non esiste. Esiste un altro modo per rendere invisibile un TTreeNode e tutti i suoi nodi figlio? Ovviamente voglio poterlo rendere di nuovo visibile più tardi.
Questo è con Delphi 2007.
Nota n. 1: sono a conoscenza dell'alternativa TVirtualTreeView e lo verificherò se non esiste un modo semplice per farlo con TTreeView.
Nota n. 2: ho bisogno dell'opzione solo per i nodi di livello superiore. Quelli che voglio nascondere di solito non hanno nemmeno figli.
Soluzione
È una buona idea separare i dati dall'interfaccia utente e questo problema con le viste ad albero è un buon esempio - non archiviare i dati in una vista ad albero . Ho spesso un'unità non visiva che contiene una classe strutturata che memorizza i dati. Un'unità di interfaccia utente può avere un treeview in grado di visualizzare (un sottoinsieme configurabile di) dati da quella classe. Esistono diversi modi per spostare i dati tra i due. Questo tipo di isolamento richiede un po 'di pianificazione, ma offre maggiore flessibilità e stabilità.
Altri suggerimenti
se si desidera utilizzare un componente ad albero migliore, perché non utilizzare Virtualtreeview. È uno dei migliori componenti mai sviluppati per Delphi ed è gratuito da utilizzare con Source! Ma c'è forse un problema logico nel nascondere un ttreenode! L'albero dovrebbe mostrare un segno + quando non sono visibili nodi?
TTreeView è un wrapper per la vista ad albero standard di Windows, che (a giudicare dalla la documentazione su MSDN ) non consente di nascondere i nodi dell'albero. Ha senso anche perché la vista ad albero non è scalabile per un gran numero di nodi, quindi nascondere i nodi dell'albero invece di rimuovere tutto ciò che non è necessario sarebbe una cattiva idea.
Puoi semplificarti un po 'la vita se rimuovi e inserisci solo il nodo di livello superiore (quello che desideri nascondere) e crei tutti i nodi figlio nell'evento OnExpanding del ri nodo aggiunto. Per questo devi solo impostare la proprietà HasChildren del nodo su true.
L'unico modo per " nascondere " un nodo in TTreeView è effettivamente rimuoverlo. Quindi, per " mostrare " il nodo, è sufficiente reinserirlo di nuovo.
Come l'ho realizzato in DXE5 con TTreeView standard. Penso che sarà utile per alcuni ragazzi. L'ho reso semplice per esempio:
1. Articolo che deve essere nascosto. Ho impostato ImageIndex su 2.
var
Node:TTreeNode;
begin
...
Node:=Tree.Items.AddChild(ParentNode,'Text');
Node.ImageIndex:=2;
2. Ora ho impostato l'eventoAdvancedCustomDrawItem di TTreeView.
if Node.ImageIndex=2 then
begin
DefaultDraw:=false;
Node.Parent.HasChildren:=false;
end;
3. Controllalo con l'evento onClick di TTreeView:
var
Tree:TTreeView;
Node:TTreeNode;
begin
Tree:=Sender as TTreeView;
if Tree.Selected.Index>-1 then
if Tree.Selected.HasChildren then
if Tree.Selected.getFirstChild.ImageIndex=2 then
showmessage(Tree.Selected.getFirstChild.Text);
Fatto. Spero che ti possa aiutare.
Risolvo questo problema spostando il nodo in un altro nodo non espanso e viceversa. L'ho fatto nel gestore di eventi in espansione.