Search code examples
delphiscrolldelphi-2006

How can I fix the TScrollBar MouseWheel malfunction?


I have a TScrollBox inside of a TFrame and when I use my mouse's wheel it simply does not goes up nor down the ScrollBox scrolling.

I have tried to use

TScrollBox(Sender).Perform(WM_VSCROLL,1,0); 

on the FrameMouseWheelDown but it does not trigger.

Any Ideas?


Solution

  • My scroll box looks like this:

    type
      TMyScrollBox = class(TScrollBox)
      protected
        function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
        procedure WndProc(var Message: TMessage); override;
      end;
    
    function TMyScrollBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
    begin
      Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
      if not Result then begin
        if Shift*[ssShift..ssCtrl]=[] then begin
          VertScrollBar.Position := VertScrollBar.Position - WheelDelta;
          Result := True;
        end;
      end;
    end;
    
    procedure TMyScrollBox.WndProc(var Message: TMessage);
    begin
      if Message.Msg=WM_MOUSEHWHEEL then begin
        (* For some reason using a message handler for WM_MOUSEHWHEEL doesn't work. The messages
           don't always arrive. It seems to occur when both scroll bars are active. Strangely,
           if we handle the message here, then the messages all get through. Go figure! *)
        if TWMMouseWheel(Message).Keys=0 then begin
          HorzScrollBar.Position := HorzScrollBar.Position + TWMMouseWheel(Message).WheelDelta;
          Message.Result := 0;
        end else begin
          Message.Result := 1;
        end;
      end else begin
        inherited;
      end;
    end;