コントロール上にあるときのみホイールマウスをアクティブにするには?

解決


プログラムは難しい  2006-02-17 03:56:48  No: 20059

初めてここに書き込むdelphi初心者です。よろしくお願いします。
stringgridの上にカーソルがきたときだけホイールマウスでスクロールさせ、カーソルがはずれたときはstringgridをホイールでスクロールさせないようにするにはどうしたらよいでしょうか。いろいろ検索はしてみたのですが、見つかりませんでした。
カーソルがstringgrid上にあるか無いかの判定はできるようになったのですが、setfocusを使わずに実現させる方法がわかりません。setfocusメソッドでフォーカスを他のコントロール上に移せば可能なのですが、あまりスマートでないため他の方法が知りたいのです。よろしくお願いします。


ママん  2006-02-17 20:16:53  No: 20060

カーソルがstringgrid上にあるか無いかの判定ができるなら
ある場合
StringGrid1.OnMouseWheelDown:=StringGrid1MouseWheelDown;
無い場合
StringGrid1.OnMouseWheelDown:=nil;
でいいんでないっすか?

厳密に言うとStringGrid1にフォーカスが無くてカーソルが上にある状況もあるんですがね。


ん?  2006-02-17 21:10:31  No: 20061

マウスカーソルが、例えば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;

なんか不思議な動作だ・・・。


ん?  2006-02-17 22:04:46  No: 20062


TMemoにフォーカスがあるときに、StringGrid1上でホイールすると、
TMemoとGridの両方スクロールした。
いまいちですね(^^ゞ


プログラムは難しい  2006-02-19 01:21:08  No: 20063

ママん さん、ん? さん、ありがとうございました。

ママん さん
>厳密に言うとStringGrid1にフォーカスが無くてカーソルが上にある状況もあるんですがね。
私の説明が悪すぎました。その通りというかその場合に表題の動作をさせたかったのです。フォーカスがないと動かないと思い、カーソルをstringgrid上に持って行くとsetfocusして動かしていましたが、当然ながらカーソルがはずれてもずっとスクロールし続けます。そこでフォーカスを移動させればと思ったわけですが、あまりスマートでないため、他の方法がないかと思い発言をしました。

ん? さん、サンプルコードありがとうございました。
そのまま貼り付けてちゃんと希望の動作しました。私のフォームには他のスクロールするコントロールがないので、とりあえず問題ありません。
サンプルコードの中身はまだよくわかっていませんが、helpとにらめっこしながら勉強します。
お二人ともありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加