gpt4 book ai didi

delphi - TVirtualStringTree 和垂直滚动无法正常工作

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

我已经学会了如何使用 TVirtualStringTree,并且发现它非常好。我有一个名为 PackedList 的自定义非可视列表,它由另一个线程填充。我想实时显示 TVirtualStringTree 中的所有列表内容。因此,我在主窗体上放置了一个计时器,每 500 毫秒更新一次 HexLog(即 TVirtualStringTree)RootNodeCount。

我的所有数据都出现在 VirtualStringTree 上,而且我没有任何速度问题,非常好。但是垂直滚动条有一个问题。当我在控件上按 Ctrl+End 以跳转到列表末尾时,它会转到中间的某个位置。同样,当我将滚动条拖到末尾时,它不会到达末尾。但 HexLog 知道 DataCount。为什么不跳到最后呢?如果我按几次 Ctrl+END,就会到达末尾。

在定时器例程中,我想说 HexLog 通过代码跳转到列表的末尾。我该如何做到这一点以及如何正确处理垂直滚动条?

procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject);
begin
if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then
begin
HexLog.RootNodeCount := PacketList.Items.Count;
end;
end;

procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
if Sender.MultiLine[Node] then
begin
TargetCanvas.Font := Sender.Font;
NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10);
end;
end;

Appearance of HexLog

TLama的建议回复无法正常工作,请参阅图片以获取解释: TLama solution is not working

有关详细图像说明,请参阅该链接:http://i43.tinypic.com/1445thi.png

最佳答案

要跳转到树的末尾,请调用 ScrollIntoView(GetLast)

要滚动到特定节点,控件需要将所有先前节点的高度相加,以便确定正确的偏移量。

您的节点具有不同的高度。如果您没有在某处初始化节点的实际高度,则控件将对任何未初始化的节点使用 DefaultNodeHeight 属性。看起来该高度比树中任何实际节点的高度都短,因此控件最终计算出的偏移量小于预期,并滚动到那里而不是您想要的位置。

确保您正在处理 OnMeasureItem 事件,并且在 Options.MiscOptions 中设置了 toVariableNodeHeight 选项。如果不这样做,那么控件将仅使用每个节点当前分配的高度,并使用任何未初始化节点的默认高度。

如果您手动分配 NodeHeight 而不是设置 toVariableNodeHeight 并处理 OnMeasureItem,则可以获得此处报告的行为。

关于delphi - TVirtualStringTree 和垂直滚动无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044265/

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