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

解決


プログラムは難しい  2006-02-16 18:56:48  No: 20059  IP: 192.*.*.*

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

編集 削除
ママん  2006-02-17 11:16:53  No: 20060  IP: 192.*.*.*

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

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

編集 削除
ん?  2006-02-17 12:10:31  No: 20061  IP: 192.*.*.*

マウスカーソルが、例えば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 13:04:46  No: 20062  IP: 192.*.*.*


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

編集 削除
プログラムは難しい  2006-02-18 16:21:08  No: 20063  IP: 192.*.*.*

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

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

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

編集 削除