【问题标题】:How can Virtual Treeview control be made to always scroll by lines?如何使 Virtual Treeview 控件始终按行滚动?
【发布时间】:2010-10-30 02:22:48
【问题描述】:

Virtual Treeview 按像素垂直滚动,与标准 Delphi 网格的方式不同,TListViewTTreeView(或我知道的大多数其他此类控件)逐行滚动并保持整行可见始终处于控件的顶部。当我使用光标键导航时,根据方向,第一行或最后一行完全可见。用鼠标滚动时,没有任何对齐。

这种行为可以在 Delphi 2007 和 2009 中的 Structure 窗口中观察到。

有没有办法设置许多属性以具有标准 Windows 控件的行为?或者是否有一组补丁可以实现这一点?

【问题讨论】:

    标签: delphi virtualtreeview


    【解决方案1】:

    您可以拦截 TBaseVirtualTree.OnScroll 事件并使用虚拟树视图的画布的 textheight('M') 返回值作为更改 TBaseVirtualTree.offsety 的量,以增加(向上滚动)或减少(向下滚动)。还可以测试以确保预滚动位置模数 textheight('M') 为零(以避免从错误位置滚动正确的量)。

    另外,Virtual Treeview 论坛上的this post 提出了另一种方法:使用 VCL 滚动条隐藏虚拟树视图的本机滚动条,然后自己进行滚动(捕获 VCL 滚动事件并以编程方式滚动虚拟树视图)。

    【讨论】:

    • 感谢您的回答,我只尝试了第一种选择,因为我想保留原始滚动条。它的问题是最后一行不会完全可见,除非当客户端高度不是节点高度的倍数时,控件在最后一个节点下方添加一些空白空间。我假设如果我想要的内容不支持开箱即用,则需要在控件中调整滚动代码。
    • 好吧,你的回答给了我必要的推动力 - 实际上还有另一个属性 BottomSpace,并且使用它们似乎可以按我的意愿工作。我将您的标记为已接受,但会在另一个答案中添加代码。
    • 总是很高兴给朋友一个推!实际上,我真的很喜欢阅读您的 SO 帖子,因此以任何方式提供帮助都是一种乐趣。
    【解决方案2】:

    这是我在 Argalatyr 的帮助下想出的,看起来就像我想要的那样:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
        VirtualStringTree1.DefaultNodeHeight;
    end;
    
    procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
    var
      DY: integer;
    begin
      with VirtualStringTree1 do begin
        DY := VirtualStringTree1.DefaultNodeHeight;
        BottomSpace := ClientHeight mod DY;
        VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
      end;
    end;
    
    procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
      DeltaY: Integer);
    var
      DY: integer;
    begin
      if DeltaY <> 0 then begin
        DY := VirtualStringTree1.DefaultNodeHeight;
        VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
      end;
    end;
    

    【讨论】:

    • 我意识到这个答案现在已经有 12 年左右的历史了,但我只是在研究这个确切的问题,这很有帮助。请注意,上述更改会影响键盘导航以及拇指跟踪,这可能会导致底部聚焦节点仅部分可见。我的解决方法是仅在 tsThumbTracking 在 TreeStates 中时更改 OnScroll 中的 OffsetY。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2016-08-06
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多