【问题标题】:How to scroll a TTreeView programmatically?如何以编程方式滚动 TTreeView?
【发布时间】:2017-04-13 23:33:18
【问题描述】:

A.创建一个 Delphi VCL Forms 应用程序。

B.在表单上放一个TTreeView,命名为tvTest并用item填充它并设置Treeview的大小,这样滚动条在TreeView上是可见的,例如:

C.在表单上放置一个按钮,并在其点击处理程序中编写以下代码:

  procedure TForm1.btnScrollClick(Sender: TObject);
  begin
    tvTest.ScrollBy(tvTest.Width, 0);
  end;

D.现在运行程序并单击按钮。假设水平滚动条应该从左到右滚动。但什么也没有发生。为什么?

那么我怎样才能让滚动条(当然还有滚动条的内容)从左到右、从右到左、向下或向上滚动?

Delphi 10.1 柏林更新 2
Windows 7 x64 SP1

编辑:当我使用此代码时(类似于 Sami 的建议):

tvTest.ScrollBy(-3, -3);

...我得到了这件现代艺术作品:

【问题讨论】:

  • 试试tvTest.ScrollBy(3, 3);并点击按钮5次你会明白为什么
  • 这只会让 TreeView 的 CONTENT 滚动,而不是滚动条。但是在单击了几次按钮之后,我将表单部分拖到了屏幕区域之外,当我将其拖回时,TreeView 内容又回到了原来的位置。所以 TreeView 并没有真正滚动,但只有它看起来滚动并且重新绘制时就像以前一样!为什么?我怎样才能真正滚动 Treeview?

标签: delphi scroll treeview delphi-10.1-berlin


【解决方案1】:

要滚动 TreeView,请发送(或 PerformWM_VSCROLL 和/或 WM_HSCROLL 消息。

tvTest.Perform(WM_HSCROLL, MakeWParam(SB_LINERIGHT, 0), 0);

tvTest.Perform(WM_VSCROLL, MakeWParam(SB_LINEDOWN, 0), 0);

参数见消息对应文档

ScrollBy 是 VCL 对ScrollWindow API 的封装,它转换控件的内容。这是绘制滚动控件客户端的一部分的快捷方式,应另外绘制显示(空)部分。它通常由控件的内部实现使用。不是你要找的。​​p>

【讨论】:

  • 谢谢,这行得通,但每次我按下按钮时它只会滚动一个很小的量,不管我输入的是哪个数字而不是零。但我需要从左到右和从右到左一直滚动它。如何做到这一点?
  • 发送多条消息或使用 SB_PAGE__ 常量。不客气。
  • 非常感谢!我还在Winapi.Windows 中查找了SB_PAGERIGHT。但是当我将Winapi.Windows 加载到 IDE 的编辑器中时,IDE 总是崩溃!!这就是为什么花了这么长时间才回复的原因。有人知道为什么加载Winapi.Windows 单元时 IDE 会崩溃吗?
  • @user1580348:我刚刚打开了一个 VCL 演示项目 (SplitView),然后通过单击打开 WinAPI.Windows,然后按 Ctrl+Enter,它打开得很好,我可以滚动和浏览它并搜索。也许您的机器需要更多 RAM,或者在 IDE 中打开的文件更少。
  • @KenWhite:我有 16 GB RAM,C: 上有足够的空间,IDE 中只加载了几个文件。我还通过单击它然后按 Ctrl+Enter 打开 WinAPI.Windows。 uses 列表中的几个大文件也需要很长时间才能加载,大多数其他文件的加载速度非常快。
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2015-10-05
  • 2011-06-15
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多