首先,我正在回答我自己的问题Q/A风格,所以我不一定需要任何人回答这个问题.这是我学到的东西,许多人可以利用这一点.
我有一个树视图,它包含许多不同的节点.每个节点在其Data属性中都有一个对象,对象从一个主对象列表引用不同级别的层次结构,这些对象非常大(数千个项目).一个节点表示此主列表对象上的特定属性,其中树允许用户选择节点以查看属于该特定所选类别的那些项目.
当树被填充时,它变得非常耗时(在某些情况下为2分钟),因为每个节点需要遍历该大型列表中的每个项目并找到该列表中属于任何给定节点的每个项目.因此,如果此树中有500个节点,则它将遍历此大型列表500次.总共有3个级别的层次结构 - 加载第二和第三级时会出现性能阻塞,但第一级是简单快速的.
现在没有任何选项可以提高数百次迭代这个列表的性能.我想知道是否有任何已知的技巧来提高填充树视图的性能?
以下是它目前的工作原理:
var
X: Integer;
N: TTreeNode;
O: TMyObject;
begin
for X := 0 to MyObjectList.Count - 1 do begin
O:= TMyObject(MyObjectList[X]); //Object which Node represents
N:= TreeView.Items.AddChild(nil, O.Caption);
N.Data:= O;
LoadNextLevel(N); //Populates child nodes by iterating through master list again
end;
end;
Run Code Online (Sandbox Code Playgroud)
并且每个附加级别都有类似的方法.
PS - 第一级层次结构从其自己的单独列表(约50个对象)填充,而第二级和第三级从主列表中的这些数千个对象的属性填充.这就是为什么第一级加载很快,其余的很慢.
当我使用toUseExplorerTheme在TVirtualStringTree.PaintOptions它绘制这样的选择:

请注意,选择从控件的左侧延伸到任何节点标题的最右侧范围的位置; 选择的宽度都相同.
我希望它看起来像这个图像(其他人的项目,使用Virtual TreeView),其中选择仅涵盖节点标题的文本:

除非Virtual TreeView中有回归(我使用5.2.2),否则这一定是可能的,但我找不到正确的选项组合.
这是我的设置代码:
fTree := TVirtualStringTree.Create(Self);
fTree.Parent := Self;
fTree.Align := alClient;
fTree.OnGetText := TreeGetText;
fTree.OnInitNode := TreeInitNode;
fTree.OnInitChildren := TreeInitChildren;
fTree.OnChange := TreeSelectionChange;
fTree.RootNodeCount := 1;
fTree.DrawSelectionMode := smBlendedRectangle;
fTree.TreeOptions.PaintOptions := fTree.TreeOptions.PaintOptions
+ [toUseExplorerTheme];
fTree.TreeOptions.SelectionOptions := fTree.TreeOptions.SelectionOptions
+ [toMultiSelect];
Run Code Online (Sandbox Code Playgroud)