2016-12-05 6 views
4

TScrollBoxの垂直スクロールバーが非常にトップであるか否かを検出することは簡単です:スクロールバーが最下部にあるかどうかを検出する方法は?

IsScrollBarAtTop := ScrollBox1.VertScrollBar.Position = 0; 

enter image description here

しかし、どのように、私はTScrollBoxの垂直スクロールバーが非常にあるかどうかを検出することができますボトムかどうか? Vcl.Forms.TControlScrollBar.Rangeから

enter image description here

+0

小さな「アウト・ザ・ボックス」アイデア....スクロール・バーは、あなたがスクロールしている範囲内のどこにあるのかを抽象的に表現するためのものです。おそらく、より良いアプローチは、基になるビューのどこにあるかを調べることです。例えば。テキストエディタ/ビューアの場合:ファイルの最終行にいますか? –

答えて

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++ Win32のサンプルコードを読んで、シンプルなC++プログラムを書くことができれば、はるかに価値のある情報にアクセスできます。 –

5

範囲は、関連するコントロールのクライアント領域の(ピクセル単位)の仮想サイズを表します。フォームの水平スクロールバーの範囲は500に設定され、フォームの幅が200である場合範囲であれば、例えば、スクロールバーの位置は0から300

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

に変えることができますスクロールボックスの高さよりも小さい場合、スクロールバーは表示されません。

+0

誰かがこの作品を確認できるかどうかを知りたいですか?概念的には、WinAPIソリューションと同じです。しかし、より簡単で、タマネギの層を掘ることなく。 –

+1

@CraigYoung、はい、うまくいきました:-) –

+0

クール感謝、私はあなたが以前にできなかったことを知っています。 –

関連する問題