AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi Wert einer Checkbox ändern, ohne OnClick Handler auszulösen
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von sakura · begonnen am 31. Mär 2005 · letzter Beitrag vom 1. Apr 2005
Antwort Antwort
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
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#2

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

  Alt 31. Mär 2005, 18:40
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;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

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

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

  Alt 1. Apr 2005, 08:28
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

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 1. Apr 2005, 11:02
Ich hab damals, als ich auch mal sowas brauchte, dieses TAG mißbraucht ^^


Also im OnClick-Ereignis des Objekts als erstes
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 ^^
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz