Вопрос

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

Это касается Delphi 2007.

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Как я сделал это в 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);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top