![]() |
Wert einer Checkbox ändern, ohne OnClick Handler auszulösen
Liste der Anhänge anzeigen (Anzahl: 1)
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);
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:
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.
type
THiddenCheckBox = class(TCustomCheckBox) end; Folgend der gesamte Quellcode der Unit, welche auch als Attachment an diesen Beitrag (inkl. Beispiel-Anwendung) angehängt ist.
Delphi-Quellcode:
...:cat:...
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. |
Re: Wert einer Checkbox ändern, ohne OnClick Handler auszulö
Hallo,
spricht eigentlich etwas dagegen OnClick in folgender Form zu umgehen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin CheckBox1.onClick := nil; checkbox1.Checked := not checkbox1.Checked; CheckBox1.onClick := CheckBox1Click; end; |
Re: Wert einer Checkbox ändern, ohne OnClick Handler auszulö
Zitat:
Persönlich denke ich, dass es eigentlich egal ist, Hauptsache man packt es in eine eigene Prozedur, so dass man auf Dauer weniger zu tippen hat ;-) ...:cat:... |
Re: Wert einer Checkbox ändern, ohne OnClick Handler auszulö
Ich hab damals, als ich auch mal sowas brauchte, dieses TAG mißbraucht ^^
Also im OnClick-Ereignis des Objekts als erstes
Delphi-Quellcode:
If Sender.Tag <> 0 Then Exit;
Und dann einfach
Delphi-Quellcode:
Geht auch ganz gut ^^
CheckBox1.Tag := CheckBox1.Tag + 1;
CheckBox1.Checked := xyz; CheckBox1.Tag := CheckBox1.Tag - 1; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz