Как определить, находится ли полоса прокрутки в самом низу?

Легко определить, является ли вертикальная полоса прокрутки TScrollBox находится на самом верху или нет:

IsScrollBarAtTop := ScrollBox1.VertScrollBar.Position = 0;

Но как я могу определить, является ли вертикальная полоса прокрутки TScrollBox в самом низу или нет?

3 ответа

Решение

Вы можете получить информацию о полосе прокрутки через 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;

Из http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TControlScrollBar.Range:

Диапазон представляет виртуальный размер (в пикселях) клиентской области связанного элемента управления. Например, если диапазон горизонтальной полосы прокрутки формы установлен на 500, а ширина формы - 200, положение полосы прокрутки может варьироваться от 0 до 300.

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

Если диапазон меньше высоты полосы прокрутки, полоса прокрутки не отображается.

важным значением является положение содержимого... ScrollBox.ViewportPosition Я искал его некоторое время, и он не упоминался ни в каких обсуждениях, поэтому я заявляю об этом. (Delphi 10.2, FMX)

Другие вопросы по тегам