Search code examples
delphivcl

scrollbox mouse wheel delphi


How to add OnMouseWheel to the same form for two scrollboxes? I applied the method to ScrollBox1 but I did not know how to add the method to ScrollBox2

procedure TForm3.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  LTopLeft, LTopRight, LBottomLeft, LBottomRight: SmallInt;
  LPoint: TPoint;
begin
   inherited;
  LPoint := ScrollBox1.ClientToScreen(Point(0,0));

  LTopLeft := LPoint.X;
  LTopRight := LTopLeft + ScrollBox1.Width;

  LBottomLeft := LPoint.Y;
  LBottomRight := LBottomLeft + ScrollBox1.Width;


  if (MousePos.X >= LTopLeft) and
    (MousePos.X <= LTopRight) and
    (MousePos.Y >= LBottomLeft)and
    (MousePos.Y <= LBottomRight) then
  begin
    ScrollBox1.VertScrollBar.Position :=
    ScrollBox1.VertScrollBar.Position - WheelDelta;

    Handled := True;
  end;
end;

Solution

  • Assign the same handler to both ScrollBox components, not to the Form, and then use the Sender parameter to know which component is calling the handler.

    procedure TForm3.ScrollBoxMouseWheel(Sender: TObject;
      Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
      var Handled: Boolean);
    var
      LTopLeft, LTopRight, LBottomLeft, LBottomRight: SmallInt;
      LPoint: TPoint;
      ScrollBox: TScrollBox;
    begin
      ScrollBox := TScrollBox(Sender);
      LPoint := ScrollBox.ClientToScreen(Point(0,0));
      LTopLeft := LPoint.X;
      LTopRight := LTopLeft + ScrollBox.ClientWidth;
      LBottomLeft := LPoint.Y;
      LBottomRight := LBottomLeft + ScrollBox.ClientWidth;
      if (MousePos.X >= LTopLeft) and
        (MousePos.X <= LTopRight) and
        (MousePos.Y >= LBottomLeft) and
        (MousePos.Y <= LBottomRight) then
      begin
        ScrollBox.VertScrollBar.Position := ScrollBox.VertScrollBar.Position - WheelDelta;
        Handled := True;
      end;
    end;