【发布时间】:2011-01-14 23:10:11
【问题描述】:
是的,我知道我发布了很多问题,但那是因为我需要保证我做对了,我做错了什么,或者我完全一无所知,并且在文档中找不到任何内容。总之,
我正在尝试检查重复节点。这是我想做的事情:
循环遍历我的节点,并比较每个节点的文本(记录),但是如果我有很多节点,那会不会太耗时和消耗内存?会有更好的方法吗?
谢谢! - 杰夫。
编辑:感谢 Deltics,我得到了它的工作!如果我们有一些人有同样的问题,这里有一些工作代码,在 VST 中使用 2 级节点!
Procedure UncheckDuplicates;
Var
ParentNode,ChildNode : PVirtualNode;
I,J : Integer;
SL : TStringList;
SkypeID : String;
Begin
SL := TStringlist.Create;
try
ParentNode := frmMain.vtSkype.GetFirst;
for I := 0 to frmMain.vtSkype.RootNodeCount - 1 do
begin
ChildNode := ParentNode.FirstChild;
for J := 0 to ParentNode.ChildCount - 1 do
begin
if NodeIsChecked(ChildNode) then
begin
SkypeID := GetData(ChildNode).SkypeID;
if SL.IndexOf(SkypeID) <> -1 then
begin
ChildNode.CheckState := csUncheckedNormal;
end
else
begin
SL.Add(SkypeID);
end;
end;
ChildNode := ChildNode.NextSibling;
end;
ParentNode := ParentNode.NextSibling;
end;
finally
SL.Free;
end;
frmMain.vtSkype.Refresh;
End;
我不怕分享我的代码,这是我对社区的责任。 :)
【问题讨论】:
-
如果您正在检查节点的文本,那么您做错了。在您的基础数据结构中查找重复项。一旦您消除了那里的重复项,然后设置
RootNodeCount或ChildCount以使控件为您的所有项目创建节点。树控件不应该是您存储程序数据的位置。这只是数据的视图。 -
@Rob - 是的,但说文本更容易。我像其他人一样将我的东西存储在记录中;)
-
根据您的代码,您将内容存储在树视图控件中。这个想法是您应该拥有一个完全独立的数据结构,您可以在不依赖于树控件的情况下对其进行操作和探索。您根本不必引用
PVirtualNode。 (除此之外,您应该真正使用GetNextSibling方法,而不是直接读取NextSibling字段;该方法可确保您获得的节点已正确初始化。) -
@Rob - 我不确定我会怎么做。显示的方式就是我被教导的方式。
-
@Rob @Jeff Rob 是对的,但以“正确”的方式进行操作更复杂。当你需要在没有任何 UI 的情况下使用你的模型时,即没有树视图,那么你就会明白为什么 Rob 会这样说。但在那之前,我认为你不必担心太多。
标签: delphi duplicates virtualtreeview