Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TScrollBox не прокручивается верт. scroll от мыши


Автор: alexeybarkalov 25.12.2014, 12:51
Возник такой вопрос - на форме лежит TScrollBox и в него "кладутся" TPanel, а на нее checkbox и label. В результате формируется в ScrollBox вертикальный скролл, но при прокрутки колесика на мыши он не перемещается. Как заставить его перемещаться?

Код

    pnl := TPanel.Create(MyScrollBox);
    pnl.Parent := MyScrollBox;
    pnl.Align := alTop;
    pnl.Height := 18;
...

    chk := TCheckBox.Create(pnl);
    chk.Parent := pnl;
    chk.Align := alLeft;
    chk.Width := 17;
...

    lb := TLabel.Create(pnl);
    lb.Parent := pnl;
    lb.Align := alClient;
...

Автор: Regulum 17.2.2015, 12:17
в событиях OnMouseWheelDown и OnMouseWheelUp изменять значение VertScrollBar.Position вашего ScrollBox, что-то вроде
Код

procedure TForm1.MyScrollBoxMouseWheelDown(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin  
   (Sender As TScrollBox).VertScrollBar.Position := (Sender As TScrollBox).VertScrollBar.Position + 5;    
end;

и 
Код

procedure TForm1.MyScrollBoxMouseWheelUp(Sender: TObject;
  Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin  
   (Sender As TScrollBox).VertScrollBar.Position := (Sender As TScrollBox).VertScrollBar.Position - 5;    
end;

Автор: v258 18.2.2015, 09:56
когда-то делал, только для Memo, но можно использовать и для скролбокса, соответственно, Memo1 в коде нужно заменить на MyScrollBox

Код

    procedure WMMouseWheel(var Mes: TWMMouseWheel); message WM_MOUSEWHEEL;
    function IsCursor:boolean;

...........................

{Определение положения курсора - над текстом или нет}
function TForm4.IsCursor: boolean;
var
  R: TRect;
  P: TPoint;
begin
  GetCursorPos(P);
  GetWindowRect(Memo1.Handle,R);
  result := ((p.X >= R.Left) and (p.X <= R.Right))
            and ((p.Y >= r.Top) and (p.Y <= r.Bottom));
end;

{Реакция на прокрутку колесика мыши}
procedure TForm4.WMMouseWheel(var Mes: TWMMouseWheel);
var
  i,j,p: integer;
begin
  if IsCursor then
    {Если курсор находится над текстом, то начать прокрутку}
    begin
      {Определить направление прокрутки}
      if Mes.WheelDelta < 0 then
        p := SB_LINEDOWN else
        p := SB_LINEUP;
      {Определить диапазон прокрутки за один щелчок колесика - системная настройка}
      SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, @j, 0);
      {Если получено значение -1, то прокручивать на целую страницу}
      if j < 0 then
        begin
          j := 1;
          p := p + SB_PAGEUP;
        end;
      {Послать заданное количество сообщений на прокрутку}
      for i := 1  to j do
        Memo1.Perform(WM_VSCROLL,p,0);
    end;
end;


количество линий на прокрутку определяется системными настройками мыши

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)