2011-08-15 72 views
3

私はOnScrollイベントにコードを持つTScrollBarを持っています。マウスホイールを使用してTScrollbarをスクロールするにはどうすればよいですか?

マウスホイールを使用してスクロールしますが、マウスホイールを回してもスクロールバーはスクロールせず、OnScrollイベントは発生しません。

+3

どうしたらうまくいかないのですか? –

+1

あなたの代理人を考えると、私たちの多くは、あなたのコードを示し、あなたが何を試して、どのようにうまくいかなかったか(あなたは何を期待し、実際に何が起こったのか)を教えなければなりません。 –

+2

これを読んで私にはより広い疑問が生じます。私はマウスホイールメッセージを傍受してTListBoxなどを '正しく動作させる' modをやっています。私はまだXEでこれをやっています。これは正しいですか?なぜ、XEですぐに正しい動作ができないのですか?これは遺産の理由ですか? –

答えて

0

これは多くの助けになるかどうかは分かりませんが、ここではTMemoを使ってそれを行う方法があります。デルファイのバージョンが私の使用よりも遅れていない限り、スクロールバーは同様のプロセスでなければなりません。

procedure TForm1.Memo1WindowProc(var msg: TMessage); 
    var 
    ticks: ShortInt; 
    ScrollMsg: TWMVScroll; 
    begin 
    if msg.Msg = WM_MOUSEWHEEL then 
     begin 
     ScrollMsg.Msg := WM_VSCROLL; 
     ticks := HiWord(msg.wparam); 
     if ticks > 0 then 
      ScrollMsg.ScrollCode := sb_LineUp 
     else 
      ScrollMsg.ScrollCode := sb_LineDown; 
     ScrollMsg.Pos:=0; 
     Memo1.Dispatch(ScrollMsg) ; 
     end 
    else 
     OldMemo1(msg); 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
// save old window proc, assign mine. 
    begin 
    OldMemo1 := Memo1.WindowProc; 
    Memo1.WindowProc := Memo1WindowProc; 
    end; 

HTH some。

4

デフォルトのTScrollBarコンポーネントには実際にOnMouseWheel *イベントが存在しないようです。あなたは、いくつかのより創造これを実装するのは自由です

type 
    TForm1 = class(TForm) 
    ScrollBar1: TScrollBar; 
    procedure FormCreate(Sender: TObject); 
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; 
     var ScrollPos: Integer); 
    private 
    procedure ScrollBarMouseWheel(Sender: TObject; Shift: TShiftState; 
     WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
    end; 

... 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ScrollBar1.OnMouseWheel := ScrollBarMouseWheel; 
end; 

procedure TForm1.ScrollBarMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
var 
    NewScrollPos: Integer; 
begin 
    NewScrollPos := ScrollBar1.Position - WheelDelta; 
    //Trigger the OnScroll event: 
    ScrollBar1.Scroll(scPosition, NewScrollPos); 
    //Scroll the bar into the new position: 
    ScrollBar1.Position := NewScrollPos; 
    Handled := True; 
end; 

を::次のようにしかし、あなたは単純に、それらを割り当てることができ

if WheelDelta > 0 then 
    NewScrollPos := ScrollBar1.Position - ScrollBar1.PageSize 
    else 
    NewScrollPos := ScrollBar1.Position + ScrollBar1.PageSize; 

そして、あなたは、実行時にイベントを割り当てることを防止するためにTScrollBarクラスを挿入できます。

type 
    TScrollBar = class(StdCtrls.TScrollBar) 
    protected 
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; 
     MousePos: TPoint): Boolean; override; 
    end; 

function TScrollBar.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; 
    MousePos: TPoint): Boolean; 
var 
    NewScrollPos: Integer; 
begin 
    NewScrollPos := Position - WheelDelta; 
    Scroll(scPosition, NewScrollPos); 
    Position := NewScrollPos; 
    Result := True; 
end; 
15
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
var 
    I: Integer; 
begin 
    Handled := PtInRect(ScrollBox1.ClientRect, ScrollBox1.ScreenToClient(MousePos)); 
    if Handled then 
    for I := 1 to Mouse.WheelScrollLines do 
    try 
     if WheelDelta > 0 then 
     ScrollBox1.Perform(WM_VSCROLL, SB_LINEUP, 0) 
     else 
     ScrollBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0); 
    finally 
     ScrollBox1.Perform(WM_VSCROLL, SB_ENDSCROLL, 0); 
    end; 
end; 
+1

-1 ScrollBarについてではなく、ScrollBoxについてです。また、VCL内部でのみ動作します。 – NGLN

+0

これはScrollBoxで動作します。ありがとう。 – SAMPro

+0

も私と一緒に働いた、ありがとう –

0
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; 
    MousePos: TPoint; var Handled: Boolean); 
begin 
    ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + 20; 
end; 

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; 
    MousePos: TPoint; var Handled: Boolean); 
begin 
    ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - 20; 
end; 
+0

コードを書式設定し、あなたの答えを修正することをお読みください。読むのがはるかに簡単です。 http://stackoverflow.com/help/formatting – Michas

+1

質問はScrollBarではなくScrollBarについてです。 – NGLN

-1

古い投稿ですが、解決策が見つかりました。簡単に行う

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
begin 
    inherited; 

    ScrollBox1.ScrollBy(WheelDelta, 0); 
end; 

私のために働く。

+1

質問はScrollBarではなくScrollBarについてです。 – NGLN

+1

ScrollByを使用すること以外にも、ScrollByを使用すると、スクロールバー自体を含む完全なコントロールがスクロールされ、水平方向にスクロールされます。 "ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position - WheelDelta;"を使用すると、より良い結果が得られます。またHandledはtrueに設定する必要があります。 – Mike

1

位置の値を大きくするだけでは簡単すぎます。

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; 
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); 
begin 
self.VertScrollBar.Position := self.VertScrollBar.Position + WheelDelta; 
end; 
+0

これは私にとってはちょうど+をaに変更しなければならなかった - それ以外は逆になる "逆スクロール" LOL – Troz

関連する問題