我可以使TTreeNode不可见吗?

时间:2009-05-06 05:42:47

标签: delphi vcl delphi-2007

TTreeNode没有Visible属性,因此不存在明显的选项。有没有其他方法可以使TTreeNode及其所有子节点不可见?当然,我希望以后能够再次显示它。

这是Delphi 2007。

注意#1:我知道替代TVirtualTreeView,如果没有简单的方法可以通过TTreeView完成此操作,我会查看它。

注意#2:我只需要顶级节点的选项。我想隐藏的人通常都没有孩子。

6 个答案:

答案 0 :(得分:7)

将数据与用户界面分开是一个好主意,而树视图的这个问题就是一个很好的例子 - 不在树视图中存储数据。我经常有一个非可视单元,它包含一个存储数据的结构化类。用户界面单元可以具有树视图,该树视图可以显示来自该类的数据(可配置的子集)。有两种方法可以在两者之间移动数据。这种隔离需要一些规划,但提供了更大的灵活性和稳定性。

答案 1 :(得分:5)

如果您想使用更好的树组件,为什么不使用Virtualtreeview。它是为Delphi开发的最好的组件之一,它可以免费与源码一起使用!但隐藏ttreenode可能存在逻辑问题!当没有节点可见时,树是否应显示+号?

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

答案 2 :(得分:4)

TTreeView是标准Windows树视图的包装器,它(从documentation on MSDN判断)不允许隐藏树节点。它也有意义,因为已知树视图不能扩展到大量节点,因此隐藏树节点而不是删除不必要的所有内容将是一个坏主意。

如果您只删除并插入顶级节点(您要隐藏的节点),并在 OnExpanding 事件中创建所有子节点,则可以使您的生活更轻松一些。添加节点。为此,您只需将节点的 HasChildren 属性设置为true。

答案 3 :(得分:3)

在TTreeView中“隐藏”节点的唯一方法是实际删除它。然后,要“显示”节点,只需重新插入即可。

答案 4 :(得分:2)

我是如何使用标准TTreeView在DXE5中制作的。我认为这会对一些人有所帮助。我把它变得简单了例如:

<强> 1。必须隐藏的项目。我将它的ImageIndex设置为2。

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

<强> 2。现在我设置了TTreeView的onAdvancedCustomDrawItem事件。

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

第3。使用TTreeView的onClick事件检查它:

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);

完成。我希望它会对你有所帮助。

答案 5 :(得分:1)

我通过将节点移动到另一个非扩展节点来解决此问题,反之亦然。 我在扩展事件处理程序中完成了它。