ComboBoxをホイールでスクロールさせたくないのですが。。。
教えてください。
次のように考えます.
ホイールのイベントが発生してスクロールするわけです.そこで,スクロール
のイベントを調べます.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;
おっと,Handleは余分でしたね.
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
if ActiveControl=ComboBox1 then Handled:=True
end;
Mr.XRAY様
ありがとうございます。
ためしてみたのですが思うように作動しませんでした。
他のコンポーネントでマウススクロールイベントを横取りしているから?かもしれません。
そこで、ComboBoxのクリックイベントメソドで他のコンポーネントにフォーカス移動させることで対処してみましたが、ComboBoxのText部の右横のボタン(リストを表示させるボタン)でリストを閉じたときComboBoxのText部にフォーカスが移ってしまいます。
邪道な方法でこのボタンの上にTButtonを重ねてフォーカスがComboBoxに移動しないようにしてみました。
それなりにうまく作動しましたが、、、
もっとスマートな方法はないですか?
ComboBoxをサブクラス化して、WM_MOUSEWHEELを無視させてみては?
コードでサブクラスの例
ーーー
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;
ーーー
一部分のみ
おっとミスってしまった
procedure NewWndProc(var Message: TMessage);
の定義を Form1の定義に追加してください。(privateでもpublicでもok)
また Messagesのusesへの追加は implementation部ではなく interfaceの方へ追加してください。
ツイート | ![]() |