gpt4 book ai didi

Delphi - 大量节点下的虚拟字符串树慢速 GetText 方法

转载 作者:行者123 更新时间:2023-12-03 15:49:10 25 4
gpt4 key购买 nike

我对 TVirtualStringTree 组件还不太有经验,因此也许我忽略了一些琐碎的事情。

我的应用程序将文件信息收集到记录中(文件名、路径、大小)并在虚拟字符串树中显示数据。

现在,当有很多节点(200K+)时,我会经历严重的减速,整个树基本上滞后。我知道仅记录数据的内存占用相当大,但我发现延迟是由VST的OnGetText方法引起的。因此,无论该方法读取实际数据还是将 CellText 设置为静态字符串(例如 CellText := 'Test';),速度都会显着下降。如果我退出 OnGetText 而不设置 CellText,它就可以正常工作 - 即使我的树中有多达 1,000,000 个节点。另外,如果我折叠树(FullCollapse)以这种方式隐藏 90% 的节点,OnGetText 的行为也可以,或者至少更好。

据我了解,OnGetText 仅针对实际可见的屏幕节点调用,因此我不明白为什么树中存在大量节点时会出现这样的问题。

有人可以给我一些提示,为我指明方向吗?

编辑:

德尔福版本:D2010VST版本:4.8.6

我的最简单测试形式的代码基本上如下:

var
SkipGetText : boolean;

procedure TXForm.VSTGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
begin
if SkipGetText then exit;
CellText := 'TEST';
// actual code commented out to reduce complications
end;

如果我设置 CellText,它会滞后,如果我退出,它不会。奇怪的是,我向下滚动得越远,情况就越糟。

以下是分配为 NodeData 的内容:

type
PVSData = ^Fi;
Fi = Packed Record
Name, Dir, Ext: String;
Size: Int64;
end;

procedure TXForm.AddFile( const RootFolder:string; const SR: TSearchRec );
var
FileInfo: PVSData;
FileSize: Int64;
Node: PVirtualNode;
begin
Node := VST.AddChild(nil);
INC(AllFiles);
FileInfo := VST.GetNodeData(Node);
FileInfo^.Name := SR.Name;
FileInfo^.Dir := RootFolder;

Int64Rec(FileSize).Hi := SR.FindData.nFileSizeHigh;
Int64Rec(FileSize).Lo := SR.FindData.nFileSizeLow;
FileInfo^.Size := FileSize;
end;

procedure TXForm.VSTPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
begin
if SkipPaintText then exit;

case ListView.GetNodeLevel(Node) of
0: TargetCanvas.Font.Color := Color1;
else TargetCanvas.Font.Color := Color2;
end;
end;

procedure TXForm.VSTBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
begin
case ListView.GetNodeLevel(Node) of
0: TargetCanvas.Font.Color := Color1;
else TargetCanvas.Font.Color := Color2;
end;
end;

我注意到,扩展/折叠和重新扩展似乎以某种方式改善了情况,但我无法解释为什么这实际上会产生任何影响。

最佳答案

如果任何列自动调整大小,则控件需要知道所有节点值的宽度才能确定最大值。

关于Delphi - 大量节点下的虚拟字符串树慢速 GetText 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3355448/

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