Home » Tipps & Tricks » Komponenten » Buttons » Bugs in TSpeedButton beheben

Bugs in TSpeedButton beheben

Beim Einsatz der Komponente TSpeedButton im Flat-Style kann es passieren, dass sie sich bei schnellem Überfahren mit der Maus nicht mehr in den Flachzustand zurück begibt. Folgender Code behebt diesen Bug: In der Unit Buttons.pas müssen unter TSpeedButton.MouseUp diese Zeilen eingefügt werden:

        if FDown then FState := bsExclusive;
        Repaint;
      end;
+    if FFlat and Enabled then
+    begin
+      GetCursorPos(P);
+      FMouseInControl := FindDragTarget(P, True)  Self;
+      if FMouseInControl and not FDragging then
+      begin
+        FMouseInControl := False;
+        Invalidate;
+      end;
+    end;
  end;
end;

Datei Forms.pas in TApplication.DoMouseIdle:

  CaptureControl: TControl;
  P: TPoint;
+  ParentForm: TCustomForm;
begin
  GetCursorPos(P);
  Result := FindDragTarget(P, True);
+  if (Result  nil) and (Result is TGraphicControl) then
+  begin
+    ParentForm := GetParentForm(Result);
+    if ParentForm  nil then
+    begin
+      P := ParentForm.ScreenToClient(P);
+      if not PtInRect(ParentForm.ClientRect, P) then
+        Result := nil;
+    end;
+  end;
+
  if (Result  nil) and (csDesigning in Result.ComponentState) then
    Result := nil;

Anschließend muss die VCL neu kompiliert werden. Wer ohne Packages auskommt, braucht nur die Dateien Buttons.pas und Forms.pas neu kompilieren, da sich nichts am Interface geändert hat:

cd DelphiSourceVCL
dcc32 -U....LibDebug -N....LibDebug -R....Lib Forms.pas
dcc32 -U....LibDebug -N....LibDebug -R....Lib Buttons.pas
dcc32 -$D- -U....Lib -N....Lib -R....Lib Forms.pas
dcc32 -$D- -U....Lib -N....Lib -R....Lib Buttons.pas