While Schleife beenden, aber von aussen ?!
Hallo Leute,
ich habe eine kleine Frage: Angenommen ich habe eine Schleife in der irgendetwas passiert bis die Bedingung zum Beenden erfüllt ist (z.B. wird ein Zähler durchlaufen). Wie kann ich das Durchlaufen der Schleife währendessen abbrechen? (allerdings von Außerhalb der Schleife) Ich habe versucht über einen Schalter (onClick-Ereignis) die Bedingung zu erfüllen (Zähler hoch gesetzt), doch das Anklicken des Schalters wird erst nach der Beendigung der Schleife durchlaufen obwohl der Schalter zuvor angeklickt wurde. Dann habe ich zum Test einen Timer zusammen mit der Schleife gestartet (Intervall 10), der den Zähler so hoch setzt,dass die Schleife verlassen würde, doch auch der Schritt aus dem Timer wird erst nach dem Ende der Schleife durchlaufen: Beispiel: Variablen: i , t :integer; Programmteil der Schleife i := 0; t := 500; While i < t do begin; i := i + 1; sleep(100); end; programmschritt des timers oder des "on click" des Buttons: i:=t; Im Praxisfall wählt der Anwender Dateien zum kopieren aus, die in einer Listbox stehen. Diese wird dann durchlaufen (Schleife) bis das Ende der Liste erreicht ist. Ich möchte nun vorsehen, dass der Anwender den Vorgang zwischendurch abbrechen kann. Nur wie???? Kann die Schleife ggf. so gestartet werden, dass mein Prog währendessen "weiterläuft"? |
Re: While Schleife beenden, aber von aussen ?!
Hallo,
setz doch mal in deine Schleife de Befehl
Delphi-Quellcode:
. Macht den Code zwar langsam, aber sollte klappen. Um die Ausführung bischen zu beschleunigen, kannst du ja zum Beispiel den Befehl nr bei jedem 10. Durchlauf aufrufen.
application.processmessages ;
Gruß, Tom |
Re: While Schleife beenden, aber von aussen ?!
Wie wäre es wenn du eine globale Variable vom Typ Boolean deklarierst und der Variable den Wert true zuweist. In der Schleife überprüftst du dann bei jedem Durchlauf ob der Wert der Variable true ist, wenn nicht break ausführen (beendet die Schleife). In der Prozedur der Schaltfläche setzt du dann einfach den Wert der Variable auf false und schon sollte die Schleife beim nächsten Durchlauf abbrechen.
|
Re: While Schleife beenden, aber von aussen ?!
Um die Schleife von außen ab zu brechen, brauchst du eine globale Variable:
Delphi-Quellcode:
Du Ereignis bei OnClick:
var
stop:boolean;
Delphi-Quellcode:
Nun noch die Schleife:
stop:=true;
Delphi-Quellcode:
cu
stop := false;
while (stop=false) AND (i<t) begin Application.ProcessMessages; inc(i); end; |
Re: While Schleife beenden, aber von aussen ?!
So sollte es gehen, es ist aber wohl wichtig, dass das ProcessMessages aufgerufen wird, da die Anwendung sonst in der while-Schleife bleibt, und die Message OnClick erst nach der Schleife aufgerufen wird, auch wenn der Button schon längst gedrückt wurde.
|
Re: While Schleife beenden, aber von aussen ?!
Vielen Dank für die schnellen Antworten.
...processmessages... tut's ...was würde man ohne die Leute hier nur anfangen... |
Re: While Schleife beenden, aber von aussen ?!
Zitat:
|
Re: While Schleife beenden, aber von aussen ?!
Das stimmt. Ich glaube Filou meinte das so, dass die Variable nicht lokal in der Proc deklariert sein darf, da sie sind im OnClick-Event nicht bekannt ist.
Kurz gesagt: die gleiche Variable muss in beiden Funktionen bekannt sein. :-D |
Re: While Schleife beenden, aber von aussen ?!
Zitat:
Delphi-Quellcode:
und das sieht eindeutig nach globaler definition aus. Ist ja auch ni böse gemeint, soll eher ein hinnweis für die jenigen sein die denken das man für sowas immer gleich globale variablen definieren muss.
var
stop:boolean; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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