2013-10-16 3 views
5

Ich muss Scrollen von Elementen mit dem Mausrad für alle Combo-Komponenten auf dem Formular deaktivieren. Das Beste von allem ist, mehr oder weniger allgemeine Lösung zu haben, weil Design des Formulars ändern kann, wäre es schön, wenn neue Combo-Komponenten ohne zusätzliche Arbeit mit Quellcode ignoriert werden. Ich habe zwei Arten von Combo: TComboBox und TcxComboBox (von DevExpress ExpressBars Suit). Ich habe versucht, diesen Weg zu gehen:Wie zu unterdrücken Mausrad in 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; 

Es funktioniert gut für TComboBox, aber dieser Event-Handler nie ausgelöst, wenn TcxComboBox Fokus hat. Ich habe versucht, entsprechende Meldungen auf der Ebene der Form, wie diese zu fangen:

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; 

Aber solche Nachrichten nie zu diesem Handler kommen. Ich habe versucht, direkt Handhabung Mausrad für TcxComboBox zu deaktivieren, weil es solche Eigenschaft hat:

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

Aber es funktioniert nicht, es noch möglich ist, Gegenstände mit dem Mausrad zu scrollen. Ich habe Supporttickets für dieses Problem veröffentlicht, aber selbst wenn sie es in der nächsten Version beheben, brauche ich jetzt eine Lösung.

Irgendwelche Ideen, vielleicht hat jemand es irgendwie gelöst?

+0

Dies macht zwei Lösungen, die unerwünschte Nebenwirkungen verursacht. Der Grund, warum ich dieses Scrollen deaktivieren muss, liegt darin, dass sich das übergeordnete Element in einem Bildlauffeld befindet, in dem ich stattdessen das Mausrad zum Scrollen brauche. Das Einführen dieser (und einer anderen Lösung) führt jedoch dazu, dass das übergeordnete Element keine Bildlaufereignisse abfängt. –

Antwort

5

Anstatt das Formular anzuhängen, können Sie eigene Komponenten erben oder Interposer-Klassen verwenden, die DoMouseWheel überschreiben. Möglicherweise binden Sie die Behandlung an eine zusätzliche Eigenschaft.

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

Ich brauche keine UseMouseWheel-Eigenschaft, weil ich sie nur in dieser Form deaktivieren muss. Du hast also recht, es ist einfach und es funktioniert. Vielen Dank! –

+1

@TLama Ich wusste nicht, dass es erlaubt ist, die Antwort zu verbessern, wenn ich es bereits akzeptiere. Upvoted jetzt. :) –

+0

Dies macht zwei Lösungen, die unerwünschte Nebenwirkungen verursacht. Der Grund, warum ich dieses Scrollen deaktivieren muss, liegt darin, dass sich das übergeordnete Element in einem Bildlauffeld befindet, in dem ich stattdessen das Mausrad zum Scrollen brauche. Das Einführen dieser (und einer anderen Lösung) führt jedoch dazu, dass das übergeordnete Element keine Bildlaufereignisse abfängt. –