TTreeView:如何仅选中/取消选中 TTreeNode 中的子级?

问题描述 投票:0回答:1

Windows 10、德尔福 11。

我想仅为带有复选框的单个

.Checked
的子级设置
TTreeNode
。这是 TreeView 中的默认行为。但以下代码also选择所有siblings(与起始节点处于同一级别)。事实上,调用
Node.GetNextChild()
Node.GetNextSibling()
似乎没有任何区别。

procedure TMapIntForm.CheckAllNodes(Node: TTreeNode; Check: Boolean);
var
  AParent: TTreeNode;
begin
  AParent := Node;
  while (Node <> nil) do
  begin
    Node.Checked := Check;
    CheckAllNodes(Node.GetFirstChild(), Check);
    if Node <> TreeView.Selected then
      Node := Node.GetNextChild(Node) // .GetNextSibling()?
    else Node := nil;
  end;
end;

如何检查某个级别上某个节点的子节点,而不检查相同级别上的其他节点?

delphi treeview vcl treenode
1个回答
1
投票

您将错误的节点传递到

GetNextChild()
。它需要调用它的父节点的子节点,但您将其传递给父节点本身。

我建议使用不同的循环来迭代子节点:

procedure TMapIntForm.CheckAllNodes(Node: TTreeNode; Check: boolean);
var
  AChild: TTreeNode;
begin
  Node.Checked := Check;
  AChild := Node.getFirstChild;
  while (AChild <> nil) do
  begin
    CheckAllNodes(AChild, Check);
    if AChild.Selected then Break;
    AChild := AChild.getNextSibling;
  end;
end;
© www.soinside.com 2019 - 2024. All rights reserved.