![]() |
TCheckBox.Checked löst OnClick aus?
Ich habe gerade festgestellt, das eine Wertzuweisung an TCheckBox.Checked ein OnClick auslöst. Ist das normal? Wenn ja, kann man den Status auch ändern, ohne ein OnClick auszulösen? Hab mir jetzt erstmal notgedrungen mit OnMouseUp geholfen, aber mir leuchtet das Verhalten von Delphi an der Stelle nicht ganz ein. Bei was wird dann OnClick alles ausgelöst? :gruebel:
|
Re: TCheckBox.Enabled löst OnClick aus?
Hallo,
deine CheckBox hat ein OnClick Ereigniss. Das wird ausgelößt. Ist doch auch gut so, damit kannst Du ja schließlich was machen. Allerdings, wenn du nichts in dem Ereigniss hast, passiert auch nichts. Was steht den in deiner Zuweisung. Gruß Jens |
Re: TCheckBox.Enabled löst OnClick aus?
Hallo,
bei einer Änderung von "Enabled" wird bei mir kein OnClick-Ereignis ausgelöst (Turbo Delphi). Falls du dennoch wissen möchtest, wie man das OnClick-Ereignis vorübergehend deaktivieren kann, so ginge es:
Delphi-Quellcode:
Aber du solltest auf alle Fälle die Ursache finden, denn normal ist dein gezeigtes verhalten nicht.
CheckBox1.OnClick := nil;
CheckBox1.Enabled := not CheckBox1.Enabled; CheckBox1.OnClick := CheckBox1Click; Grüße, Matze |
Re: TCheckBox.Enabled löst OnClick aus?
Zitat:
und bei True umgekehrt. Jetzt ist aber doch die Frage, wie weißt Du den dieses Enabled zu.
Delphi-Quellcode:
Gruß JensButton.Click.. begin Checkbox1.Enabled := false; end; |
Re: TCheckBox.Enabled löst OnClick aus?
Danke für die Antworten. Erstmal hab ich mich verschrieben. :oops: Ich meinte natürlich checked und nicht enabled ^^
Also es gibt schon Fälle, wo man den Wert ändern will, ohne das ein OnClick ausgelöst wird. Ich habe z.B. eine Liste, und wenn ein Eintrag den Focus erhält, dann wird
Delphi-Quellcode:
entsprechend dem zum Listeneintrag gehörigen Objekt geändert. Bei OnClick wird er hingegen ins Objekt geschrieben. Wäre im Prinzip kein Problem - aber ich nutze multiselect, um einzelne Werte für mehrere Objekte gleichzeitig zu ändern. Wenn mehrere Listeneinträge ausgewählt sind, dann wird bei OnClick der Wert für alle zugehörigen Objekte geändert. Das ist bei mir aber schon passiert, wenn der Nutzer nur einen weiteren Listeneintrag ausgewählt hat (weil dann ja WalkAbleCheckBox.Checked neu gesetzt wird).
WalkAbleCheckBox.Checked:=TGroundTile(GroundTilesListView.ItemFocused.Data).Walkable;
|
Re: TCheckBox.Checked löst OnClick aus?
Hallo Leanahtan,
du hast recht. ich habe das gerade mal ausprobiert. Bei unten gezeigtem Code, kommt bei jedem Click auf den Button die MessageBox.
Delphi-Quellcode:
Ändert man es ab, wie Matze geschrieben hat, ist der Fehler weg. Das ist ja keine Fehler, sondern scheinbar bei Delphi normal.
procedure TForm1.Button1Click(Sender: TObject);
begin CheckBox1.Checked := not CheckBox1.Checked end; procedure TForm1.CheckBox1Click(Sender: TObject); begin ShowMessage('OnClick wurde ausgeführt'); end;
Delphi-Quellcode:
Gruß Jens
procedure TForm1.Button1Click(Sender: TObject);
begin CheckBox1.OnClick := nil; CheckBox1.Checked := not CheckBox1.Checked; CheckBox1.OnClick := CheckBox1Click; end; procedure TForm1.CheckBox1Click(Sender: TObject); begin ShowMessage('OnClick wurde ausgeführt'); end; |
Re: TCheckBox.Checked löst OnClick aus?
einfache Möglichkeit:
In alle Ereignisprozeduren if FLocked then Exit; und wärend des Setzens von .Checked dieses FLocked (global in der Form) auf TRUE setzen. andere Möglichkeit: Bei der CheckBox und allen anderen CheckBoxen, mit dem gleichen GroupIndex, vor der Zuweisung auf .Checked das .OnClick auf NIL sezten und nach dem Setzen die notfalls vorher gespeicherten Ereignisprozeduren wieder eintragen. |
Re: TCheckBox.Checked löst OnClick aus?
Zitat:
|
Re: TCheckBox.Checked löst OnClick aus?
Zitat:
Vieleicht kann das ja mal jemand näher erläutern. Gruß Jens |
Re: TCheckBox.Checked löst OnClick aus?
Ich glaube die CheckBoxen sind die einzigen mit diesem "Fehler". Besser wäre es gewesen das Ereigniss OnChange zu nennen. Dann wüsste jeder wann es ausgelöst wird.
|
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:
Dann ist "Sender" wohl generell die Komponente, die das Ereignis direkt oder indirekt auslöst und somit hier immer CheckBox1, richtig?
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; 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 |
Re: TCheckBox.Checked löst OnClick aus?
Es ist in der Tat so. Auch der folgende Code löst einen Beep aus:
Delphi-Quellcode:
Ich glaube, wenn man trotzdem das OnClick der CheckBox nutzen will, muss man das mit eine Hilfs-Status-Variablen regeln:
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;
Delphi-Quellcode:
Dann funktioniert es :)
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; |
Re: TCheckBox.Checked löst OnClick aus?
Zitat:
|
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 ![]() ![]() Gruß Hawkeye |
Re: TCheckBox.Checked löst OnClick aus?
Hier noch eine "saubere" Variante den Status zu setzen, ohne das Event auszulösen:
Delphi-Quellcode:
Grundsätzlich mit Action zu arbeiten, ist aber eventuell der bessere Weg.
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; |
Re: TCheckBox.Checked löst OnClick aus?
Hallo,
Zitat:
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:13 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