AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCheckBox.Checked löst OnClick aus?

Ein Thema von Leanahtan · begonnen am 3. Jan 2010 · letzter Beitrag vom 4. Jan 2010
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: TCheckBox.Checked löst OnClick aus?

  Alt 3. Jan 2010, 19:46
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
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#12

Re: TCheckBox.Checked löst OnClick aus?

  Alt 3. Jan 2010, 19:49
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
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: TCheckBox.Checked löst OnClick aus?

  Alt 3. Jan 2010, 19:53
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#14

Re: TCheckBox.Checked löst OnClick aus?

  Alt 3. Jan 2010, 20:29
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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#15

Re: TCheckBox.Checked löst OnClick aus?

  Alt 4. Jan 2010, 10:47
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#16

Re: TCheckBox.Checked löst OnClick aus?

  Alt 4. Jan 2010, 10:57
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:35 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