【问题标题】:How to select all root or all child nodes in VirtualStringTree?如何选择 VirtualStringTree 中的所有根节点或所有子节点?
【发布时间】:2012-08-21 22:58:44
【问题描述】:

我想选择所有根节点或所有子节点(不是 VirtualTreeView 中的所有节点)。
我尝试使用此代码选择所有根节点:

procedure SelectAllRoots;
var
  Node: PVirtualNode;
begin
  Form1.VirtualStringTree1.BeginUpdate;
  Node := Form1.VirtualStringTree1.GetFirst;
  while True do 
  begin
    if Node = nil then 
      Break;
    if not (vsSelected in Node.States) then
      Node.States := Node.States + [vsSelected];
    Node := Form1.VirtualStringTree1.GetNext(Node);
  end;
  Form1.VirtualStringTree1.EndUpdate;
end;

我可以看出有一个小故障。 选择不完整或卡住。我做错了什么?

编辑:
我使用多选。

【问题讨论】:

  • 我启用了多选属性。这有点迫使我使用 Node.States。抱歉,之前应该提到过。

标签: delphi delphi-7 virtualtreeview tvirtualstringtree


【解决方案1】:

1.选择所有根节点:

要选择所有根节点,可以使用以下过程:

procedure SelectRootNodes(AVirtualTree: TBaseVirtualTree);
var
  Node: PVirtualNode;
begin
  AVirtualTree.BeginUpdate;
  try
    Node := AVirtualTree.GetFirst;
    while Assigned(Node) do
    begin
      AVirtualTree.Selected[Node] := True;
      Node := AVirtualTree.GetNextSibling(Node);
    end;
  finally
    AVirtualTree.EndUpdate;
  end;
end;

2.选择所有子节点:

要选择所有子节点,级别无关,您需要使用递归函数,如下所示:

procedure SelectChildNodes(AVirtualTree: TBaseVirtualTree);
var
  Node: PVirtualNode;

  procedure SelectSubNodes(ANode: PVirtualNode);
  var
    SubNode: PVirtualNode;
  begin
    SubNode := AVirtualTree.GetFirstChild(ANode);
    while Assigned(SubNode) do
    begin
      SelectSubNodes(SubNode);
      AVirtualTree.Selected[SubNode] := True;
      SubNode := AVirtualTree.GetNextSibling(SubNode);
    end;
  end;

begin
  AVirtualTree.BeginUpdate;
  try
    Node := AVirtualTree.GetFirst;
    while Assigned(Node) do
    begin
      SelectSubNodes(Node);
      Node := AVirtualTree.GetNextSibling(Node);
    end;
  finally
    AVirtualTree.EndUpdate;
  end;
end;

【讨论】:

  • 像魅力一样工作。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多