Schon öfter gab es die Frage, wie man den Wert einer Checkbox ändern kann, ohne dabei den asoziierten
OnClick Handler auszulösen. Für dieses Problem gibt es verschiedene Ansätze, der folgende nutzt die Möglichkeiten von
OOP aus, so dass man an versteckte Eigenschaften heran kommt.
Da das Problem öfter auftritt, lagern wir die Lösung in eine extra
Unit aus, welche jederzeit genutzt werden kann, wenn man das Problem in einer Anwendung hat. Diese
Unit liefert drei Prozeduren.
Delphi-Quellcode:
procedure ToggleCheckBoxSilent(aCheckBox: TCustomCheckBox);
procedure SetCheckBoxSilent(aCheckBox: TCustomCheckBox; aValue: Boolean);
procedure SetCheckBoxStateSilent(aCheckBox: TCustomCheckBox; aState: TCheckBoxState);
- ToggleCheckBoxSilent wechselt den Checked-Wert von True->False und umgekehrt.
- SetCheckBoxSilent setzt den Checked-Wert auf den übergebenen Wert (Boolean)
- SetCheckBoxStateSilent setzt den State-Wert auf den übergebenen Wert (TCheckBoxState)
Im
implementation Teil der
Unit deklarieren wir eine neue Klasse
THiddenCheckBox, welche keine neuen Eigenschaften/Methoden hat, uns aber über ein Casting Zugriff auf geschützte Eigenschaften und Funktionen einer Checkbox gibt.
Delphi-Quellcode:
type
THiddenCheckBox = class(TCustomCheckBox)
end;
TCustomCheckBox besitzt die Eigenschaft
ClicksDisabled, welche geschützt ist, also nur von
TCustomCheckBox oder abgeleiteten Klassen genutzt werden kann. Wird diese Eigenschaft auf
True gesetzt, so wird beim Setzen des Wertes einer CheckBox ein eventuell asoziierter
OnClick-Handler
nicht aufgerufen. Dieses Verhalten nutzen wir bei der Implementation.
Folgend der gesamte Quellcode der
Unit, welche auch als Attachment an diesen Beitrag (inkl. Beispiel-Anwendung) angehängt ist.
Delphi-Quellcode:
unit uSetCheckBoxSilent;
interface
uses
StdCtrls;
procedure ToggleCheckBoxSilent(aCheckBox: TCustomCheckBox);
procedure SetCheckBoxSilent(aCheckBox: TCustomCheckBox; aValue: Boolean);
procedure SetCheckBoxStateSilent(aCheckBox: TCustomCheckBox; aState: TCheckBoxState);
implementation
type
THiddenCheckBox =
class(TCustomCheckBox)
end;
procedure ToggleCheckBoxSilent(aCheckBox: TCustomCheckBox);
begin
SetCheckBoxSilent(aCheckBox,
not THiddenCheckBox(aCheckBox).Checked);
end;
procedure SetCheckBoxSilent(aCheckBox: TCustomCheckBox; aValue: Boolean);
var
OldClick: Boolean;
begin
OldClick := THiddenCheckBox(aCheckBox).ClicksDisabled;
THiddenCheckBox(aCheckBox).ClicksDisabled := True;
THiddenCheckBox(aCheckBox).Checked := aValue;
THiddenCheckBox(aCheckBox).ClicksDisabled := OldClick;
end;
procedure SetCheckBoxStateSilent(aCheckBox: TCustomCheckBox; aState: TCheckBoxState);
var
OldClick: Boolean;
begin
OldClick := THiddenCheckBox(aCheckBox).ClicksDisabled;
THiddenCheckBox(aCheckBox).ClicksDisabled := True;
THiddenCheckBox(aCheckBox).State := aState;
THiddenCheckBox(aCheckBox).ClicksDisabled := OldClick;
end;
end.
...
...