2016-12-05 65 views
4

这是很容易检测TScrollBox的垂直滚动条是否在顶部或不:如何检测滚动条是否在最底部?

IsScrollBarAtTop := ScrollBox1.VertScrollBar.Position = 0; 

enter image description here

但我怎么能检测TScrollBox的垂直滚动条是否是在很底部还是不?

enter image description here

+0

有点'开箱即用'的想法....由于滚动条是一个派生的抽象表示,你在哪里_whatever你滚动_也许更好的方法是查看底层视图的位置。例如。对于文本编辑器/查看器:你在文件的最后一行吗? –

回答

8

您可以通过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; 
+0

本书的标题也可以是:“Delphi的聪明WinAPI解决方案”。 – user1580348

+0

@user德尔福在这里并不真正相关。这是一个Win32控件和一个Win32答案。代码可以用任何语言编写。 VCL是win32的一个松散的包装,这使得这种事情变得简单。很多Delphi程序员害怕其他语言,并且不会阅读用其他语言编写的代码。这是一个很大的弱点。不要害怕。学习足够的C++能够读取C++ Win32示例代码,并编写简单的C++程序,您将可以访问更有价值的信息。 –

5

Vcl.Forms.TControlScrollBar.Range来自:

范围表示相关联的控制的客户区的虚拟大小(以像素为单位)。例如,如果窗体的水平滚动条的范围被设定为500,和形式的宽度是200,滚动条的位置可以如果范围是从0变化到300。

IsScrollBarAtBottom := ScrollBox1.VertScrollBar.Position = 
    (ScrollBox1.VertScrollBar.Range - ScrollBox1.ClientHeight); 

小于滚动框的高度,滚动条不可见。

+0

想知道是否有人能证实这件作品。它在概念上与WinAPI解决方案相同。但更简单,没有挖下洋葱层。 –

+1

@CraigYoung,是的它的工作原理,只是试了一下:-) –

+0

很感谢,我知道你无法提前。 –