Предположим вам необходимо разместить на форме большое количество объектов, однако размеры формы не позволяют этого сделать. В этом случае удобно воспользоваться компонентом TScrollBox, т.к. он позволит вам прокручивать его содержимое (как, к примеру, вы прокручиваете веб-страницу в браузере). Все бы хорошо, однако, когда вы захотите прокрутить ScrollBox с помощью колесика мыши, этого не произойдет. Чтобы "активировать" эту возможность воспользуемся следующим кодом:
Вариант 1
Необходимо обработать события OnMouseWheelDown и OnMouseWheelUp компонента ScrollBox.
//прокручиваем вниз
procedure TMainForm.ScrollBox1MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position+4;
end;
//прокручиваем вверх
procedure TMainForm.ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position-4;
end;
Вариант 2 В разделе Private запишем:
private
{ Private declarations }
procedure WMMOUSEWHEEL(var Msg: TMessage); message WM_MOUSEWHEEL;
В разделе Implementation: procedure TMainForm.WMMOUSEWHEEL(var Msg: TMessage);
var
zDelta: Integer;
begin
inherited;
if WindowFromPoint(Mouse.CursorPos) <> ScrollBox1.Handle then Exit;
if Msg.WParam < 0 then zDelta := -10 else zDelta := 10;
with ScrollBox1 do
begin
if ((VertScrollBar.Position = 0) and
(zDelta > 0)) or ((VertScrollBar.Position = VertScrollBar.Range - ClientHeight) and
(zDelta < 0)) then Exit;
ScrollBy(0, zDelta);
VertScrollBar.Position := VertScrollBar.Position - zDelta;
end;
end;
Описанный выше пример позволяет осуществлять вертикальную прокрутку ScrollBox колесиком мыши когда ее указатель находится непосредственно над полем ScrollBox либо над ползунком прокрутки. Если же вы попробуете прокрутить, поместив курсор над каким-либо из объектов, расположенных на поле ScrollBox, то этого не произойдет. Чтобы содержание прокручивалось при любом расположении мыши, необходимо убрать строчку:
if WindowFromPoint(Mouse.CursorPos) <> ScrollBox1.Handle then Exit;