comboboxをマウスホイールから開放する方法

解決


mizuki  2012-01-08 01:04:05  No: 41420

D6 Personalで勉強中です。
マウスホイールを使って画像を拡大/縮小するようにしました。そうしたらComboboxが同時にスクロールしてしまいました。プロパティーをいろいろと変更して試しましたが解決できていません。comboboxでマウスホイールを使えなくなっても構いませんので解決法を教えてください。なお画像の拡大/縮小はFormMouseWheelでやっています。よろしくお願いします。


Mr.XRAY  2012-01-08 01:21:43  No: 41421

こんにちは.
イベントにはいろいろな引数があります.それを利用すれば可能です.

[Vcl.Controls.TMouseWheelEvent]
http://docwiki.embarcadero.com/Libraries/XE2/ja/Vcl.Controls.TMouseWheelEvent

MousePosがマウスポイントの座標値です.
この座標値がどのコントロールにあるか調査して,そのコントロールでスクロール動作を
禁止したいのであれば,Handled プロパティの値をFalseにします.


Mr.XRAY  2012-01-08 01:28:36  No: 41422

例えば次のコードは,Form1にある ScrollBox1のスクロールを禁止する例です.
イベントの引数が何故定義してあるのかを考えてみると,プログラミングの幅が広がると思いますよ.

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
  SB : TScrollingWinControl;
begin
  SB := Form1.ScrollBox1;
  if FindVCLWindow(MousePos) = SB then Handled := False;
end;


Mr.XRAY  2012-01-08 01:33:30  No: 41423

FindVCLWindow のヘルプ記事です.

[Vcl.Controls.FindVCLWindow]
http://docwiki.embarcadero.com/Libraries/ja/Vcl.Controls.FindVCLWindow


Mr.XRAY  2012-01-08 01:38:27  No: 41424

おっと,追加です,Senderで判定してもいいです.


mizuki  2012-01-09 19:45:18  No: 41425

Mr.XRAY様  いつもありがとうございます。今まで私たちのレベルをご配慮いただき何度お助けいただいたことか・・・
今回の問題で試行錯誤しながらいろいろ試している最中ですがComboboxの場合は極めてシンプルに
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
        Handled := False;
end;
と書いても一度ComboboxをChangeしてしまった以降はホイールを回す度にComboboxが再度ハイライトして反応してしまいます。まずこの基本的な問題が解決できないとこの方法によるプログラミングは先に進めないように思いますが対応策はあるのでしょうか。プロパティーの設定が正しくないとか?  よろしくお願いいたします。


KHE00221  2012-01-09 23:16:50  No: 41426

Handled := True;
じゃないか?


Mr.XRAY  2012-01-09 23:22:32  No: 41427

>   Handled := True;

ほげ.失礼しました.
このイベントで処理する場合ですから,Trueですね.
動作が逆のコードを提示してしまいました.
いつも人に言っておきながらゴメンなさい.


mizuki  2012-01-12 01:56:20  No: 41428

Mr.XRAY様  KHE00221様  アドバイスをありがとうございました。

>スクロール動作を禁止したいのであれば,Handled プロパティの値をFalseに>します.

この文から見てMouseWheelのところにHandled:=False;を入れるとMouseWheelイベントで動くオブジェクトの動きを止めるのではないかと解釈して何度もテストしてみましたがComboBoxの場合は一度Changeしてしまった以降はホイールを回す度にComboboxが再度ハイライトして反応してしまいます。この解釈が間違っているのか、またはComboBoxは例外なのかわからないまま何度もテストを続けてきましたが理解不足で思うように動きませんでした。

邪道なのかもしれませんがComboBoxの近くにマウスを移動するとCombobox.Enabled:=trueにし、遠くなるとFalseにして目的に近いものができました。  勉強不足で理解ができず折角のアドバイスでしたが申し訳ありませんでした。


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

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






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