gpt4 book ai didi

delphi - 我应该如何为 TTreeNode 实现 GetLastNode?

转载 作者:行者123 更新时间:2023-12-03 15:42:32 27 4
gpt4 key购买 nike

当我需要查找 TTreeView 中的第一个节点时,我调用 TTreeNodes.GetFirstNode。但是,我有时需要定位树中的最后一个节点,但没有相应的 TTreeNodes.GetLastNode 函数。

我不想使用 Items[Count-1],因为这会导致使用 Result := Result.GetNext 遍历整个树。当然,只有当 TreeView 有很多节点时,这才重要。我完全欣赏虚拟容器控件的优点,但我目前还不会切换到 Virtual TreeView。

到目前为止,我已经提出了以下内容:

function TTreeNodes.GetLastNode: TTreeNode;
var
Node: TTreeNode;
begin
Result := GetFirstNode;
if not Assigned(Result) then begin
exit;
end;
while True do begin
Node := Result.GetNextSibling;
if not Assigned(Node) then begin
Node := Result.GetFirstChild;
if not Assigned(Node) then begin
exit;
end;
end;
Result := Node;
end;
end;

任何人都可以:

  1. 发现我的逻辑有缺陷吗?
  2. 提出改进建议?

编辑 1

我不愿意保留自己的节点缓存。直到最近我一直在这样做,但发现了一些难以跟踪的间歇性杀毒软件,我相信这一定是由于我的缓存不同步造成的。显然,一种解决方案是让我的缓存同步代码正常工作,但我讨厌缓存,因为当你出错时很难跟踪出现的错误。

最佳答案

虽然我不是一个非 Exit 纯粹主义者,但我认为,当在不使用 Exit 的情况下也能保持可读性不变时,人们可能会更喜欢这种选择。

所以这里是完全相同的代码,因为我认为您无法以任何其他方式(更快)到达结束节点,但没有 Exit 并且稍微更紧凑:

function TTreeNodes.GetLastNode: TTreeNode;
var
Node: TTreeNode;
begin
Node := GetFirstNode;
Result := Node;
if Result <> nil then
repeat
Result := Node;
if Node <> nil then
Node := Result.GetNextSibling;
if Node = nil then
Node := Result.GetFirstChild;
until Node = nil;
end;

关于delphi - 我应该如何为 TTreeNode 实现 GetLastNode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6257348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com