2013-10-16 2 views
5

양식의 모든 콤보 구성 요소에 대해 마우스 휠을 사용하여 항목을 스크롤하지 않도록 설정해야합니다. 폼의 디자인이 변경 될 수 있기 때문에 가장 좋은 해결책은 소스 코드로 추가 작업을하지 않고도 새로운 콤보 구성 요소가 무시되면 좋을 것입니다. TComboBox와 TcxComboBox (DevExpress ExpressBars Suit에서 제공)의 두 가지 유형의 콤보가 있습니다. 나는 이런 식으로 가려고 노력 :TcxComboBox에서 마우스 휠을 숨기는 방법

procedure TSomeForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; 
    var Handled: Boolean); 
begin 
    if (Screen.ActiveControl is TComboBox) or (Screen.ActiveControl is TcxComboBox) then 
    Handled := True; 
end; 

그것은 TComboBox을 위해 잘 작동을하지만, TcxComboBox는 포커스가있을 때이 이벤트 핸들러가 트리거되지 않습니다. 는이 같은 형태의 수준에 해당하는 메시지를 잡으려고 시도 :

procedure TSomeForm.WndProc(var m: TMessage); 
begin 
    if (m.Msg = WM_VSCROLL) or (m.Msg = WM_HSCROLL) or (m.msg = WM_Mousewheel) then 
    m.Msg := 0; 
    inherited; 
end; 

그러나 그러한 메시지를이 핸들러에 온 적이.

procedure TSomeForm.FormCreate(Sender: TObject); 
begin 
    cxComboBox1.Properties.UseMouseWheel := False; 
end; 

그러나이 작동하지 않습니다, 마우스 휠 항목을 스크롤 여전히 가능 : 가 나는 등의 특성을 가지고 있기 때문에, 직접 TcxComboBox 위해 마우스 휠 처리를하지 않도록 노력했다. 이 문제에 대한 지원 티켓을 게시했지만, 다음 릴리스에서 수정하더라도 지금은 해결 방법이 필요합니다.

어떤 아이디어라도, 어쩌면 누군가 그것을 어떻게 든 해결할 수 있습니까?

+0

이렇게하면 원하지 않는 부작용을 일으키는 두 가지 해결책이 생깁니다. 이 스크롤을 사용하지 않도록 설정해야하는 이유는 부모가 스크롤 상자에 있기 때문입니다. 대신 마우스 휠을 사용하여 스크롤해야합니다. 그러나이 (그리고 다른 솔루션 하나를 도입하면) 부모도 스크롤 이벤트를 잡지 않습니다. –

답변

5

양식에 연결하는 대신 자신의 구성 요소를 상속하거나 DoMouseWheel을 무시하는 인터 포저 클래스를 사용할 수 있습니다. 추가 속성에서 처리를 바인딩 할 수 있습니다.

type 
    TcxComboBox = Class(cxDropDownEdit.TcxComboBox) 
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; 
    private 
    FUseMouseWheel: Boolean; 
    public 
    Property UseMouseWheel: Boolean Read FUseMouseWheel Write FUseMouseWheel; 
    End; 

    TComboBox = Class(Vcl.StdCtrls.TComboBox) 
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override; 
    private 
    FUseMouseWheel: Boolean; 
    public 
    Property UseMouseWheel: Boolean Read FUseMouseWheel Write FUseMouseWheel; 
    End; 

    TForm3 = class(TForm) 
    ComboBox1: TComboBox; 
    cxComboBox1: TcxComboBox; 
    cxComboBox2: TcxComboBox; 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private-Deklarationen } 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form3: TForm3; 

implementation 

{$R *.dfm} 
{ TComboBox } 

function TComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; 
begin 
if FUseMouseWheel then inherited 
else Result := true; 
end; 

{ TcxComboBox } 

function TcxComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; 
begin 
if FUseMouseWheel then inherited 
else Result := true; 

end; 

procedure TForm3.FormCreate(Sender: TObject); 
begin 
    cxComboBox2.UseMouseWheel := true; 
end; 
+0

UseMouseWheel 속성도 필요하지 않습니다.이 양식에서 비활성화해야하기 때문입니다. 네 말이 맞아, 그것은 간단하고 일이다. 고맙습니다! –

+1

@TLama 나는 내가 이미 그것을 받아들이면 대답을 upvote하는 것이 허락되지 않았다. Upvoted 지금. :) –

+0

이것은 원하지 않는 부작용을 일으키는 두 가지 해결책을 만듭니다. 이 스크롤을 사용하지 않도록 설정해야하는 이유는 부모가 스크롤 상자에 있기 때문입니다. 대신 마우스 휠을 사용하여 스크롤해야합니다. 그러나이 (그리고 다른 솔루션 하나를 도입하면) 부모도 스크롤 이벤트를 잡지 않습니다. –

관련 문제