6

我已经学会了如何使用 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;

HexLog的外观

TLama 建议的回复无法正常工作,请参阅图片以获取说明: TLama 解决方案不起作用

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

4

1 回答 1

6

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

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

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

确保您正在处理该OnMeasureItem事件,并且您toVariableNodeHeightOptions.MiscOptions. 如果你不这样做,那么控件将只使用当前为每个节点分配的高度,并为任何未初始化的节点使用默认高度。

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

于 2012-04-06T14:26:51.323 回答