如何检测滚动条是否位于最底部?

use*_*348 7 delphi scrollbar tscrollbox delphi-10.1-berlin

很容易检测到a的垂直滚动条TScrollBox是否位于最顶层:

IsScrollBarAtTop := ScrollBox1.VertScrollBar.Position = 0;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是如何检测a的垂直滚动条TScrollBox是否处于非常底部?

在此输入图像描述

Ser*_*yuz 11

您可以通过API检索滚动条信息,并确定它是否位于底部.

function IsScrollBarAtBottom(Box: TScrollBox): Boolean;
var
  Info: TScrollInfo;
begin
  Info.cbSize := SizeOf(Info);
  Info.fMask := SIF_POS or SIF_RANGE or SIF_PAGE;
  Win32Check(GetScrollInfo(Box.Handle, SB_VERT, Info));
  Result := Info.nPos >=  Info.nMax - Info.nMin - Info.nPage;
end;
Run Code Online (Sandbox Code Playgroud)

  • @user Delphi 在这里并不真正相关。这是一个 Win32 控件和一个 Win32 答案。该代码可以用任何语言编写。VCL 是 win32 的松散包装,这使得此类事情变得容易。许多 Delphi 程序员害怕其他语言,并且不会阅读用任何其他语言编写的代码。这是一个很大的弱点。别害怕。学习足够的 C++,以便能够阅读 C++ Win32 示例代码,并编写简单的 C++ 程序,您将可以获得更有价值的信息。 (2认同)

LU *_* RD 6

来自Vcl.Forms.TControlScrollBar.Range:

范围表示关联控件的客户端区域的虚拟大小(以像素为单位).例如,如果窗体的水平滚动条的范围设置为500,并且窗体的宽度为200,则滚动条的位置可以在0到300之间变化.

IsScrollBarAtBottom :=  ScrollBox1.VertScrollBar.Position =
  (ScrollBox1.VertScrollBar.Range - ScrollBox1.ClientHeight);
Run Code Online (Sandbox Code Playgroud)

如果范围小于滚动框的高度,则滚动条不可见.

  • @SertacAkyuz,刚试过有和没有水平杆,它的工作原理。 (2认同)