Delphi 获取选定的TTreeview子项
我试图在树状视图中获取所选节点的所有子节点,但遇到了一些问题 以这个树视图为例: 我想得到所有的节点都是黄色高亮显示的“文件夹”节点的子节点,即旁边有一条蓝线的子节点 这就是我所尝试的:Delphi 获取选定的TTreeview子项,delphi,Delphi,我试图在树状视图中获取所选节点的所有子节点,但遇到了一些问题 以这个树视图为例: 我想得到所有的节点都是黄色高亮显示的“文件夹”节点的子节点,即旁边有一条蓝线的子节点 这就是我所尝试的: procedure Form1.GetTreeChilds(ANode: TTreenode); begin while ANode <> nil do begin ListBox1.Items.Add(ANode.Text); ANode := ANode.GetNext
procedure Form1.GetTreeChilds(ANode: TTreenode);
begin
while ANode <> nil do
begin
ListBox1.Items.Add(ANode.Text);
ANode := ANode.GetNext;
end;
end;
程序Form1.GetTreeChilds(阳极:TTreenode);
开始
而阳极则为零
开始
ListBox1.Items.Add(阳极.Text);
阳极:=阳极.GetNext;
结束;
结束;
它可以工作,但它也会将非子项的项目6返回到黄色突出显示的“文件夹”
我需要做什么更改或以不同的方式仅将子节点添加到黄色高亮文件夹
谢谢。试试这个:
procedure Form1.GetTreeChilds(ANode: TTreeNode);
begin
ANode := ANode.GetFirstChild;
if ANode = nil then Exit;
ListBox1.Items.BeginUpdate;
try
repeat
ListBox1.Items.Add(ANode.Text);
GetTreeChilds(ANode);
ANode := ANode.GetNextSibling;
until ANode = nil;
finally
ListBox1.Items.EndUpdate;
end;
end;
请尝试以下方法:
procedure Form1.GetTreeChilds(ANode: TTreeNode);
begin
ANode := ANode.GetFirstChild;
if ANode = nil then Exit;
ListBox1.Items.BeginUpdate;
try
repeat
ListBox1.Items.Add(ANode.Text);
GetTreeChilds(ANode);
ANode := ANode.GetNextSibling;
until ANode = nil;
finally
ListBox1.Items.EndUpdate;
end;
end;
瓦德。为什么不使用GetFirstChild等?@MartynA我想我忽略了它:(Remy Lebeau的答案正是我想要的。很好。Fwiw,TTreeview+它的节点被广泛使用,如果一个人的代码不起作用,那就相当肯定代码是错的。WAD。你为什么不使用GetFirstChild等?@MartynA我想我忽略了它:(Remy Lebeau的答案正是我想要的。很好。Fwiw,TTreeview+它的节点被广泛使用,如果一个人的代码不起作用,这是一个相当肯定的信号,表明代码是错误的。非常感谢!除了MartynA指出的缺少GetFirstChild之外,你还使用了我也没有尝试过的递归魔法,并使用了GetNextSibling。我个人会避免锁定(这里是
BeginUpdate
,EndUpdate
对)在一个递归过程中。这是在浪费时间。@TLama你是对的,事实上我只有Listbox.Items.Add用于测试目的,Remy可能扩展了他的答案并将其包含在其中以提供进一步帮助-但我已经知道如何使用BeginUpdate
和EndUpdate
停止UI更新@TLama:Begin/EndUpdate是reference如果已计算,则只有第一个BeginUpdate将禁用绘图,最后一个EndUpdate将重新启用绘图,其余调用仅递增/递减更新计数器。在进行多次添加(或删除)时,最好使用Begin/EndUpdate操作,这有助于提高性能。@Remy,我知道它们是如何工作的。我只是不想在递归函数中使用它们。这就是这个函数的调用者应该做的,IMHO。非常感谢!除了MartynA指出的缺少GetFirstChild之外,你还使用了递归魔法,我也没有尝试使用GetNextSibling。我个人避免锁定(此处BeginUpdate
,EndUpdate
对)在一个递归过程中。这是在浪费时间。@TLama你是对的,事实上我只有Listbox.Items.Add用于测试目的,Remy可能扩展了他的答案并将其包含在其中以提供进一步帮助-但我已经知道如何使用BeginUpdate
和EndUpdate
停止UI更新@TLama:Begin/EndUpdate是reference如果已计算,则只有第一个BeginUpdate将禁用绘图,最后一个EndUpdate将重新启用绘图,其余调用仅递增/递减更新计数器。在进行多次添加(或删除)时,最好使用Begin/EndUpdate操作,这有助于提高性能。@Remy,我知道它们是如何工作的。我只是不想在递归函数中使用它们。这是这个函数的调用者应该做的,IMHO。