Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#1

Wert einer Checkbox ändern, ohne OnClick Handler auszulösen

  Alt 31. Mär 2005, 17:09
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.
......
Angehängte Dateien
Dateityp: zip sample_und_source_392.zip (2,4 KB, 46x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat