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;
如何检查仅某个级别上某个节点的子节点,而不检查相同级别上的其他节点?
您将错误的节点传递到
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;