Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TCheckBox.Checked löst OnClick aus? (https://www.delphipraxis.net/145519-tcheckbox-checked-loest-onclick-aus.html)

Matze 3. Jan 2010 18:46

Re: TCheckBox.Checked löst OnClick aus?
 
Mich würde auch etwas interessieren: Der Parameter "Sender", wofür steht der genau? In der Delphi-Reference wurde ich nicht fündig.
Ich hätte erwartet, dass so etwas geht, doch ich habe "Sender" hier wohl falsch interpretiert:

Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if (Sender as TCheckBox) = CheckBox1 then
    // durch CheckBox1 ausgelöst
  else
    // durch andere Komponenten ausgelöst, bsp. einen Button
end;
Dann ist "Sender" wohl generell die Komponente, die das Ereignis direkt oder indirekt auslöst und somit hier immer CheckBox1, richtig?
Nur wenn diese Prozedur auch anderen CheckBox-Komponenten zugewiesen ist, kann der Parameter variieren und dann ist Sender die CheckBox, die das Ereignis ausgelöst hast.

Grüße, Matze

Progman 3. Jan 2010 18:49

Re: TCheckBox.Checked löst OnClick aus?
 
Es ist in der Tat so. Auch der folgende Code löst einen Beep aus:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  if CheckBox1.State = cbChecked then CheckBox1.State := cbUnChecked
   else CheckBox1.State := cbChecked;
end;

procedure TForm2.CheckBox1Click(Sender: TObject);
begin
  Beep;
end;
Ich glaube, wenn man trotzdem das OnClick der CheckBox nutzen will, muss man das mit eine Hilfs-Status-Variablen regeln:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  if CheckBox1.State = cbChecked then begin
    CanClick := False; // Hilfsvariable
    CheckBox1.State := cbUnChecked;
  end else begin
    CanClick := False;
    CheckBox1.State := cbChecked;
  end;
end;

procedure TForm2.CheckBox1Click(Sender: TObject);
begin
  if CanClick then begin
    Beep;
  end else CanClick := True;
end;
Dann funktioniert es :)

Matze 3. Jan 2010 18:53

Re: TCheckBox.Checked löst OnClick aus?
 
Zitat:

Zitat von Progman
Ich glaube, wenn man trotzdem das OnClick der CheckBox nutzen will, muss man das mit eine Hilfs-Status-Variablen regeln

Oder meine vorgeschlagene Umsetzung aus Beitrag #3 verwenden. Sie ist vielleicht nicht so sauber, aber meiner Meinung nach etwas übersichtlicher.

Hawkeye219 3. Jan 2010 19:29

Re: TCheckBox.Checked löst OnClick aus?
 
Hallo,

das Problem kann man ebenfalls erschlagen, indem man die Checkbox mit einer Action verknüpft und das Umschalten über die Eigenschaft Delphi-Referenz durchsuchenTAction.Checked durchführt. In diesem Fall wird nämlich das Click-Ereignis der Checkbox nicht ausgelöst. Zusätzlich erhält man so die Möglichkeit, weitere abhängige Controls (z.B. einen Menüeintrag) auf einfache Weise mit dem Status der Checkbox zu synchronisieren. Schließlich vereinfacht das Ereignis Delphi-Referenz durchsuchenTAction.OnUpdate noch das (De)Aktivieren der beteiligten Controls.

Gruß Hawkeye

Blup 4. Jan 2010 09:47

Re: TCheckBox.Checked löst OnClick aus?
 
Hier noch eine "saubere" Variante den Status zu setzen, ohne das Event auszulösen:
Delphi-Quellcode:
procedure SetCheckBox(ACheckBox: TCheckBox; AValue: Boolean);
var
  Event: TNotifyEvent;
begin
  with ACheckBox do
  begin
    Event := OnClick;
    try
      OnClick := nil;
      Checked := AValue;
    finally
      OnClick := Event;
    end;
  end;
end;
Grundsätzlich mit Action zu arbeiten, ist aber eventuell der bessere Weg.

hoika 4. Jan 2010 09:57

Re: TCheckBox.Checked löst OnClick aus?
 
Hallo,

Zitat:

Es muss doch eine "feste Regel" geben, damit man nicht immer ausprobieren muss, bei welcher Wertänderung eventuell auch noch irgendein Event ausgelöst wird.
Die feste Regel heisst, dass geschriebener Quellcode
auch getestet wird ...
Daß es bei eventgetriebenem Code schwieriger ist, ist nat. klar.

Bei mir steht in OnClick-Methoden z.B. auch kein direkter Code,
sondern der Aufruf einer eigenen Prozedur.

Dann noch einen Breakpoint auf diese Prozedur
und es gibt (fast) keine Überrauschungen.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr.
Seite 2 von 2     12   

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