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

Пишем процедуру, которая будет отлавливать сообщения…

Вариант 3. При разработке компонента…

При разработке компонента, скажем, на основе TPanel, можно поступить вот так

 

This entry was posted in Delphi, WinAPI. Bookmark the permalink.