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.

È stato utile?

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?

http://wiki.lazarus.freepascal.org/VirtualTreeview

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top