2016-12-05 120 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

很感謝,我知道你無法提前。 –