私はOnScrollイベントにコードを持つTScrollBarを持っています。マウスホイールを使用してTScrollbarをスクロールするにはどうすればよいですか?
マウスホイールを使用してスクロールしますが、マウスホイールを回してもスクロールバーはスクロールせず、OnScrollイベントは発生しません。
私はOnScrollイベントにコードを持つTScrollBarを持っています。マウスホイールを使用してTScrollbarをスクロールするにはどうすればよいですか?
マウスホイールを使用してスクロールしますが、マウスホイールを回してもスクロールバーはスクロールせず、OnScrollイベントは発生しません。
これは多くの助けになるかどうかは分かりませんが、ここでは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。
デフォルトの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;
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;
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;
古い投稿ですが、解決策が見つかりました。簡単に行う
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
inherited;
ScrollBox1.ScrollBy(WheelDelta, 0);
end;
私のために働く。
位置の値を大きくするだけでは簡単すぎます。
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
self.VertScrollBar.Position := self.VertScrollBar.Position + WheelDelta;
end;
これは私にとってはちょうど+をaに変更しなければならなかった - それ以外は逆になる "逆スクロール" LOL – Troz
どうしたらうまくいかないのですか? –
あなたの代理人を考えると、私たちの多くは、あなたのコードを示し、あなたが何を試して、どのようにうまくいかなかったか(あなたは何を期待し、実際に何が起こったのか)を教えなければなりません。 –
これを読んで私にはより広い疑問が生じます。私はマウスホイールメッセージを傍受してTListBoxなどを '正しく動作させる' modをやっています。私はまだXEでこれをやっています。これは正しいですか?なぜ、XEですぐに正しい動作ができないのですか?これは遺産の理由ですか? –