Question

TTreeNode n'a pas de propriété Visible, donc l'option évidente n'existe pas. Existe-t-il un autre moyen de rendre un TTreeNode et tous ses nœuds enfants invisibles? Bien sûr, je veux pouvoir le rendre visible plus tard.

C’est avec Delphi 2007.

Note n ° 1: Je suis au courant de l'alternative TVirtualTreeView et je vérifierai s'il n'y a pas de moyen facile de réaliser cela avec TTreeView.

Note 2: J'ai besoin de l'option uniquement pour les nœuds de niveau supérieur. Ceux que je veux cacher n'ont généralement même pas d'enfants.

Était-ce utile?

La solution

Il est judicieux de séparer les données de l'interface utilisateur . Ce problème d'utilisation des arborescences en est un bon exemple. ne stockez pas les données dans une arborescence . J'ai souvent une unité non visuelle qui contient une classe structurée qui stocke des données. Une unité d’interface utilisateur peut avoir une arborescence qui peut afficher (un sous-ensemble configurable de) des données de cette classe. Il existe différentes manières de déplacer des données entre les deux. Ce type d’isolement nécessite un peu de planification, mais offre une flexibilité et une stabilité bien plus grandes.

Autres conseils

si vous souhaitez utiliser un meilleur composant d'arborescence, pourquoi ne pas utiliser Virtualtreeview. C'est l'un des meilleurs composants jamais développés pour Delphi et son utilisation est gratuite! Mais il y a peut-être un problème logique à cacher un ttreenode! L’arbre doit-il afficher un signe + alors qu’aucun nœud n’est visible?

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

TTreeView est un wrapper pour l’arborescence Windows standard, qui (à en juger par le documentation sur MSDN ) ne permet pas de masquer des nœuds d’arbre. Cela a également un sens, car on sait que l’arborescence n’est pas étendue à un grand nombre de nœuds. Cacher les nœuds au lieu de supprimer tout ce qui n’est pas nécessaire serait une mauvaise idée.

Vous pouvez vous simplifier la vie en supprimant et en insérant uniquement le nœud de niveau supérieur (celui que vous souhaitez masquer) et en créant tous les nœuds enfants dans l'événement OnExpanding de la recherche. noeud ajouté. Pour cela, il vous suffit de définir la propriété HasChildren du nœud sur true.

Le seul moyen de " masquer " un nœud dans TTreeView consiste à le supprimer. Ensuite, pour "afficher" le nœud, il vous suffit de le réinsérer.

Comment je l'ai créé avec DXE5 avec TTreeView standard. Je pense que ce sera utile pour certains gars. J'ai fait simple, par exemple:

1. Item qui doit être caché. J'en règle à ImageIndex sur 2.

  var
    Node:TTreeNode;
  begin
  ...
  Node:=Tree.Items.AddChild(ParentNode,'Text');
  Node.ImageIndex:=2;

2. Maintenant, je définis l'événement onAdvancedCustomDrawItem de TTreeView.

  if Node.ImageIndex=2 then
  begin
    DefaultDraw:=false;
    Node.Parent.HasChildren:=false;
  end;

3. Vérifiez-le avec l'événement onClick de 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);

Fait. J'espère que cela vous aidera.

Je résous ce problème en déplaçant le nœud vers un autre nœud non développé et inversement. Je l'ai fait dans le gestionnaire d'événements on expand.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top