Funktioniert MouseLeave in TSpeedButton nicht für mbLeft korrekt?



  • Ich habe einen TSpeedButton in C++Builder2009 und ein MouseDown/Up und ein MouseLeave Ereignis.

    Bei MouseDown wird SpeedButton1->Down = true; für alle 3 Maustasten gesetzt. Da die Komponente scheinbar einen kleinen Bug hat, da ab und an wenn man den SpeedButton gedrückt hält und die Maus ausserhalb des SpeedButtons bewegt und los lässt trotz Eigenschaft Flat einen Button anzeigt und auch scheinbar das "Up" Ereignis nicht an kommt, dachte ich, ich mach bei MouseLeave den Zustand Down = false;

    Das klappt für mittlere und rechte Maustaste, aber die linke behält den Status bei. Ist das gewollt oder ein Bug und wenn gewollt, wie schaffe ich das die Linke Maustaste darauf reagiert?

    SpeedButton1->AllowAllUp = true;
    
    void __fastcall TForm1::SpeedButton1MouseDown(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y)
    {
    SpeedButton1->GroupIndex = 9876;
    	SpeedButton1->Down = true;
    }
    void __fastcall TForm1::SpeedButton1MouseUp(TObject *Sender, TMouseButton Button,
              TShiftState Shift, int X, int Y)
    {
    SpeedButton1->GroupIndex = 0;
    	SpeedButton1->Down = false;
    }
    void __fastcall TForm1::SpeedButton1MouseLeave(TObject *Sender)
    {
    SpeedButton1->GroupIndex = 0;
    	SpeedButton1->Down = false;
    }
    


  • Die entscheidende Stelle in der VCL ist diese hier:

    // Buttons.pas, l. 1316ff
    procedure TSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
    begin
      ...
      if (Button = mbLeft) and Enabled then // <--
      begin
        ...
        FDragging := True; // <--
      end;
    end;
    ...
    procedure TSpeedButton.MouseMove(Shift: TShiftState; X, Y: Integer);
    var
      NewState: TButtonState;
    begin
      ...
      if FDragging then
        ...
      else if not FMouseInControl then
        UpdateTracking;
    end;
    

    Wenn du mit der linken Maustaste klickst, wird die Komponente in den Dragging-Modus versetzt, was zum beschriebenen Verhalten führt.



  • Hervorragend und scheinbar kann man FDragging nicht abstellen. Wer lässt sich denn so etwas einfallen. Also umsteigen auf eine andere SpeedButton Komponente ohne das Dragging bzw mit Hilfe der buttons.pas eine Kopie ohne Dragging von TSpeedButton erstellen.

    Danke für den Hinweis!


Anmelden zum Antworten