ComboBoxをホイールでスクロールさせないようにするには?


くるくる  2005-09-16 23:41:56  No: 17587

ComboBoxをホイールでスクロールさせたくないのですが。。。
教えてください。


Mr.XRAY  URL  2005-09-17 00:47:03  No: 17588

次のように考えます.
ホイールのイベントが発生してスクロールするわけです.そこで,スクロール
のイベントを調べます.ComboBoxにはそれらしきものがありません.
ComboBoxがFormに配置してあれば,Formのイベントを調べます.
OnMouseWheelという,それらしきものがあります.ヘルプを頼りに,例えば
以下のように.... 

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
     if ActiveControl.Handle=ComboBox1.Handle then Handled:=True
end;


Mr.XRAY  URL  2005-09-17 00:48:50  No: 17589

おっと,Handleは余分でしたね.

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
     if ActiveControl=ComboBox1 then Handled:=True
end;


くるくる  2005-09-17 03:38:33  No: 17590

Mr.XRAY様
ありがとうございます。
ためしてみたのですが思うように作動しませんでした。
他のコンポーネントでマウススクロールイベントを横取りしているから?かもしれません。

そこで、ComboBoxのクリックイベントメソドで他のコンポーネントにフォーカス移動させることで対処してみましたが、ComboBoxのText部の右横のボタン(リストを表示させるボタン)でリストを閉じたときComboBoxのText部にフォーカスが移ってしまいます。
邪道な方法でこのボタンの上にTButtonを重ねてフォーカスがComboBoxに移動しないようにしてみました。

それなりにうまく作動しましたが、、、
もっとスマートな方法はないですか?


ダイアン  2005-09-17 10:25:38  No: 17591

ComboBoxをサブクラス化して、WM_MOUSEWHEELを無視させてみては?


kkk  2005-09-17 16:38:15  No: 17592

コードでサブクラスの例
ーーー
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
  ・・・
  private
    FOldWndProc: TWndMethod;
  ・・・
 end;

implementation

uses Messages,...;
・・・
procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldWndProc := ComboBox1.WindowProc;
  ComboBox1.WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
  if Message.Msg <> WM_MOUSEWHEEL then
    FOldWndProc(Message)
end;
ーーー
一部分のみ


kkk  2005-09-17 17:00:58  No: 17593

おっとミスってしまった
procedure NewWndProc(var Message: TMessage);
の定義を Form1の定義に追加してください。(privateでもpublicでもok)
また Messagesのusesへの追加は implementation部ではなく interfaceの方へ追加してください。


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

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






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