delphi TTreeView:如何检查/取消检查TTreeNode中的ONLY子节点?

0aydgbwb  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(133)

Windows 10, Delphi 11.
我想设置.Checked只为一个单一的TTreeNode与复选框的孩子。这是TreeViews中的默认行为。但是下面的代码选择所有兄弟节点(与起始节点在同一级别上)。实际上,调用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;

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

gudnpqoy

gudnpqoy1#

您将错误的节点传递到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;

相关问题