初めてここに書き込むdelphi初心者です。よろしくお願いします。
stringgridの上にカーソルがきたときだけホイールマウスでスクロールさせ、カーソルがはずれたときはstringgridをホイールでスクロールさせないようにするにはどうしたらよいでしょうか。いろいろ検索はしてみたのですが、見つかりませんでした。
カーソルがstringgrid上にあるか無いかの判定はできるようになったのですが、setfocusを使わずに実現させる方法がわかりません。setfocusメソッドでフォーカスを他のコントロール上に移せば可能なのですが、あまりスマートでないため他の方法が知りたいのです。よろしくお願いします。
カーソルがstringgrid上にあるか無いかの判定ができるなら
ある場合
StringGrid1.OnMouseWheelDown:=StringGrid1MouseWheelDown;
無い場合
StringGrid1.OnMouseWheelDown:=nil;
でいいんでないっすか?
厳密に言うとStringGrid1にフォーカスが無くてカーソルが上にある状況もあるんですがね。
マウスカーソルが、例えばStringGrid1上にあると、フォーカスがなくてもホイールスクロールする。
procedure MouseWheelHandler(var Message: TMessage); override;
procedure TForm1.MouseWheelHandler(var Message: TMessage);
var
curPos: TPoint;
curCtrl: TControl;
begin
GetCursorPos(curPos);
curCtrl := FindDragTarget(curPos, True);
if (curCtrl <> nil) and (curCtrl = StringGrid1) then begin
StringGrid1.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
end
else begin
inherited MouseWheelHandler(Message);
end;
end;
なんか不思議な動作だ・・・。
↑
TMemoにフォーカスがあるときに、StringGrid1上でホイールすると、
TMemoとGridの両方スクロールした。
いまいちですね(^^ゞ
ママん さん、ん? さん、ありがとうございました。
ママん さん
>厳密に言うとStringGrid1にフォーカスが無くてカーソルが上にある状況もあるんですがね。
私の説明が悪すぎました。その通りというかその場合に表題の動作をさせたかったのです。フォーカスがないと動かないと思い、カーソルをstringgrid上に持って行くとsetfocusして動かしていましたが、当然ながらカーソルがはずれてもずっとスクロールし続けます。そこでフォーカスを移動させればと思ったわけですが、あまりスマートでないため、他の方法がないかと思い発言をしました。
ん? さん、サンプルコードありがとうございました。
そのまま貼り付けてちゃんと希望の動作しました。私のフォームには他のスクロールするコントロールがないので、とりあえず問題ありません。
サンプルコードの中身はまだよくわかっていませんが、helpとにらめっこしながら勉強します。
お二人ともありがとうございました。
ツイート | ![]() |