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

时间:2012-04-06 13:37:53

标签: delphi scroll virtualtreeview tvirtualstringtree

我已经学会了如何使用TVirtualStringTree,我发现它非常棒。我有一个名为PackedList的自定义非可视列表,由另一个线程填充。我想实时显示TVirtualStringTree中的所有列表内容。所以我在mainform上放了一个定时器,每500ms更新一次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

1 个答案:

答案 0 :(得分:6)

要跳到树的末尾,请拨打ScrollIntoView(GetLast)

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

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

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

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