Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi Wert einer Checkbox ändern, ohne OnClick Handler auszulösen (https://www.delphipraxis.net/43259-wert-einer-checkbox-aendern-ohne-onclick-handler-auszuloesen.html)

sakura 31. Mär 2005 16:09


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);
  1. ToggleCheckBoxSilent wechselt den Checked-Wert von True->False und umgekehrt.
  2. SetCheckBoxSilent setzt den Checked-Wert auf den übergebenen Wert (Boolean)
  3. 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.
...:cat:...

Lannes 31. Mär 2005 17:40

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;

sakura 1. Apr 2005 07:28

Re: Wert einer Checkbox ändern, ohne OnClick Handler auszulö
 
Zitat:

Zitat von Lannes
spricht eigentlich etwas dagegen OnClick in folgender Form zu umgehen?

In der Theorie zumindest ja, weil der User in der Zwischenzweit auf die Checkbox klicken kann und dessen Klick dann ausgeführt, aber nicht bearbeitet wird. In der Praxis... Ansonsten solltest Du evtl. den alten OnClick-Handler zwischenspeichern, um so leichter den korrekten wieder zu verlinken.

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:...

himitsu 1. Apr 2005 10:02

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:
CheckBox1.Tag := CheckBox1.Tag + 1;
CheckBox1.Checked := xyz;
CheckBox1.Tag := CheckBox1.Tag - 1;
Geht auch ganz gut ^^


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