![]() |
Rekursiven Eventaufruf verhindern
Hallo Wissende!
Folgendes Problem: Mein Programm fängt das OnClick-Event mehrerer TCheckBoxes ab und verändert bei der Behandlungsroutine wiederum die Checked-Eigenschaft dieser TCheckBoxes. Dadurch wird allerdings das OnClick-Event erneut ausgelöst, was zu einer Endlos-Rekursion und einem Stack-Overflow führt. Wie kann ich das am geschicktesten verhindern? Danke und Gruß, J. |
Re: Rekursiven Eventaufruf verhindern
Hallo!
Ob es das geschickteste ist, weiss ich nicht, aber ich schalte vorher einfach eine Variable "Refreshing" auf True, die dem Programm als Merker dient, daß gerade die Steuerelemente vom Programm selbst aktualisiert werden. Diese Variable fragst du im Ereignis dann einfach ab.
Delphi-Quellcode:
Cu,
Refreshing:=True;
try Checkbox1.Checked:=False; Checkbox2.Checked:=True; finally Refreshing:=False; end; Udontknow |
Re: Rekursiven Eventaufruf verhindern
ganz einfach:
ich gehe mal davon aus das du die checked-eigenschaft im onlick des controls änderst. in ewta so:
Delphi-Quellcode:
dabei kommt es natürlich zu onlicks..
...onclick(sender:TObject)
begin for i := 0 to ... blablabla checked[i] := true; end; lösung: du musst als erstes den onlick-event stilllegen, dann deinen code durchlaufen und dann wieder aktivieren:
Delphi-Quellcode:
[edit=SirThornberry]Delphi-Tags ergänzt - Mfg, SirThornberry[/edit]
...onclick(sender:TObject)
var oce : TNotifyEvent; begin oce := (sender as TCheckBox).onlick; // merken (sender as TCheckBox).onlick := nil; // stilllegen try for i := 0 to ... blablabla checked[i] := true; finally (sender as TCheckBox).onlick := oce; // wieder aktivierern end; end; |
Re: Rekursiven Eventaufruf verhindern
Delphi-Quellcode:
procedure TYourForm.CheckBoxClicked(Sender: TObject);
var lOnClick: TNotifyEvent; begin lOnClick := TCheckbox(Sender).OnClick; TCheckbox(Sender).OnClick := nil; //Do whatever you want TCheckbox(Sender).OnClick := lOnClick; end; |
Re: Rekursiven Eventaufruf verhindern
@SirThornberry: Das Try/Finally nicht vergessen! :)
|
Re: Rekursiven Eventaufruf verhindern
oki
danke euch ...so hätt ich es auch gemacht ;) |
Re: Rekursiven Eventaufruf verhindern
Hallo,
hier noch eine andere Vorgehensweise zur Unterbrechung von cascading events:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.CheckBox1Click(Sender: TObject);
begin with Sender as TCheckBox do if Focused then begin CheckBox2.Checked := not Checked; // ... end; end; |
Re: Rekursiven Eventaufruf verhindern
Ich glaube nicht, daß das Merkmal Focused ausreicht, um sowas zu verhindern. Du kannst doch, weil du gerade diese Checkbox angeklickt hast, eine Aktualisierung dieser Checkbox für nötig befinden...
Cu, Udontknow |
Re: Rekursiven Eventaufruf verhindern
Hallo,
Zitat:
Zitat:
Freundliche Grüße vom marabu |
Re: Rekursiven Eventaufruf verhindern
Hallo,
eine Möglichkeit ist hier in der Code-Library beschrieben: ![]() Eine weitere Möglichkeit wird in einem Beitrag in der Entwickler-Ecke/Code-Library aufgezeigt: ![]() Die dritte Möglichkeit besteht darin die CheckBox auf 'gechecked' zu setzen ohne die Eigenschaft Checked zu verändern, OnClick wird hierbei nicht ausgelöst:
Delphi-Quellcode:
'gechecked' aufheben:
CheckBox1.Perform(BM_SETCHECK,1,0);
Delphi-Quellcode:
Da aber die Eigenschaft Checked nicht verändert wird,
CheckBox1.Perform(BM_SETCHECK,0,0);
kann folgende Abfrage nicht mehr genutzt werden:
Delphi-Quellcode:
Zur Statusabfrage muss dann folgendes genutzt werden:
if CheckBox1.Checked then
//...
Delphi-Quellcode:
if CheckBox1.Perform(BM_GETCHECK,0,0) = BST_CHECKED then
showmessage('checked') else showmessage('not checked'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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