Delphi. Scrollbox. MousewheelUp and MousewheelDown. Делаем прокрутку разными способами

TScrollBox,

Если мы говорим о классе TScrollBox, то наиболее простой и эффективный код – обработать MousewheelUp и MouseWheelDown у компонента ScrollBox, но этого недостаточно, нужно ещё присвоить SetFocus, компоненту ScrollBox, тогда это удовольствие будет работать.

Вот простой пример обработки данных событий

При разработке компонента со ScrollBox

Я столкнулся c тем, что где попало SetFocus не поставишь. Это какая-то внутренняя кухня VCL. Control has no ParentWindow. У меня TScrollBox был на фрэйме, который я динамически добавлял. Поэтому приходилось выкручиваться. В итоге SetFocus я поставил в одну из процедур, которая вызывается извне, после создания компонента.

TForm with TForm.VertScrollBar.Visible:=true

Стандартный код, который можно встретить на многих форумах вот такой…

Но это в случае, если у нас scrollbox находится на форме. У меня же, например, он находился на фрэйме и там такого добра не было. Поэтому пришлось углубляться в WinAPI и смотреть как это всё работает изнутри. Получились следующие варианты. Возможно не идеальные, но начало положено.

TScrollBox, again

Вариант 1

Кладем на форму TApplicationEvents и в событии OnMessage…

Есть ещё и 2 вариант – через написание процедуры, при котором программа у меня работала более стабильно – не было “подергиваний” при обработке сообщений.

Вариант 2

Continue reading