Delphi 我可以使一个TTreeNode不可见吗?

Delphi 我可以使一个TTreeNode不可见吗?,delphi,vcl,delphi-2007,Delphi,Vcl,Delphi 2007,TTreeNode没有Visible属性,因此明显的选项不存在。是否有其他方法使TTreeNode及其所有子节点不可见?当然,我希望以后能再次看到它 这是与德尔福2007 注#1:我知道TVirtualTreeView的替代方案,如果没有简单的方法使用TTreeView来实现这一点,我会检查它 注意#2:我只需要顶层节点的选项。我想要隐藏的树通常甚至没有子节点。t TreeView是标准Windows树视图的包装器,它(从中判断)不允许隐藏树节点。这也是有意义的,因为树视图不能扩展到大量节点,所

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

这是与德尔福2007

注#1:我知道TVirtualTreeView的替代方案,如果没有简单的方法使用TTreeView来实现这一点,我会检查它


注意#2:我只需要顶层节点的选项。我想要隐藏的树通常甚至没有子节点。

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


如果只删除并插入顶级节点(您希望隐藏的节点),并在重新添加的节点的OnExpanding事件中创建所有子节点,您的生活会变得更加轻松。为此,您只需要将节点的HasChildren属性设置为true。

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


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

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

我如何使用标准TTreeView在DXE5中创建它。我认为这对一些人会有帮助。我已将其简化,例如:

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

  var
    Node:TTreeNode;
  begin
  ...
  Node:=Tree.Items.AddChild(ParentNode,'Text');
  Node.ImageIndex:=2;
  if Node.ImageIndex=2 then
  begin
    DefaultDraw:=false;
    Node.Parent.HasChildren:=false;
  end;
2。现在我设置了TTreeView的AdvancedCustomDrawItem事件。

  var
    Node:TTreeNode;
  begin
  ...
  Node:=Tree.Items.AddChild(ParentNode,'Text');
  Node.ImageIndex:=2;
  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);

完成了。我希望它能帮助您。

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

虽然这不是我想要听到的答案,但我想这是唯一可能的解决方案,所以我会接受它。