Могу ли я сделать TTreeNode невидимым? - PullRequest
6 голосов
/ 06 мая 2009

TTreeNode не имеет свойства Visible, поэтому очевидная опция не существует. Есть ли другой способ сделать TTreeNode и все его дочерние узлы невидимыми? Конечно, я хочу иметь возможность сделать это снова видимым позже.

Это с Delphi 2007.

Примечание # 1: мне известен альтернативный TVirtualTreeView, и я проверю его, если нет простого способа сделать это с TTreeView.

Примечание № 2: Мне нужна опция только для узлов верхнего уровня. Те, кого я хочу скрыть, обычно даже не имеют детей.

Ответы [ 6 ]

7 голосов
/ 07 мая 2009

Хорошая идея - отделить данные от пользовательского интерфейса , и эта проблема с древовидными представлениями является хорошим примером - не хранит данные в древовидном представлении . У меня часто есть невизуальная единица, которая содержит структурированный класс, который хранит данные. Модуль пользовательского интерфейса может иметь древовидное представление, которое может отображать (настраиваемое подмножество) данных из этого класса. Существует множество способов перемещения данных между ними. Этот тип изоляции требует некоторого планирования, но обеспечивает гораздо большую гибкость и стабильность.

5 голосов
/ 06 мая 2009

, если вы хотите использовать более качественный компонент дерева, почему бы не использовать Virtualtreeview. Это один из лучших когда-либо разработанных компонентов для Delphi, и его можно бесплатно использовать с исходным кодом! Но, возможно, есть логическая проблема с сокрытием ttreenode! Должно ли дерево показывать знак +, когда узлы не видны?

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

4 голосов
/ 06 мая 2009

TTreeView - это оболочка для стандартного представления дерева Windows, которое (судя по документации на MSDN ) не позволяет скрыть узлы дерева. Это также имеет смысл, поскольку известно, что древовидное представление не масштабируется до большого количества узлов, поэтому прятать узлы дерева вместо удаления всего, что не нужно, было бы плохой идеей.

Вы можете немного упростить свою жизнь, если удалите и вставите только узел верхнего уровня (тот, который вы хотите скрыть) и создадите все дочерние узлы в событии OnExpanding повторного добавления узел. Для этого вам просто нужно установить для свойства HasChildren узла значение true.

3 голосов
/ 02 июня 2009

Единственный способ «спрятать» узел в TTreeView - это фактически удалить его. Затем, чтобы «показать» узел, вы просто вставляете его снова.

2 голосов
/ 07 ноября 2013

Как я сделал это в DXE5 со стандартным TTreeView. Я думаю, что это будет полезно для некоторых парней. Я сделал это просто, например:

1. Предмет, который должен быть скрыт. Я установил для ImageIndex значение 2.

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

2. Теперь я устанавливаю событие onAdvancedCustomDrawItem для TTreeView.

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

3. Проверьте это с помощью события onClick 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);

Готово. Я надеюсь, что это поможет вам.

1 голос
/ 03 июня 2016

Я решаю эту проблему, перемещая узел в другой нерасширенный узел и наоборот. Я сделал это в расширяемом обработчике событий.

...