Delphi-PRAXiS

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 While Schleife beenden, aber von aussen ?! (https://www.delphipraxis.net/26872-while-schleife-beenden-aber-von-aussen.html)

Anthauri 30. Jul 2004 15:32


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"?

Jelly 30. Jul 2004 15:36

Re: While Schleife beenden, aber von aussen ?!
 
Hallo,

setz doch mal in deine Schleife de Befehl
Delphi-Quellcode:
application.processmessages ;
. 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.

Gruß,
Tom

mirko2000 30. Jul 2004 15:42

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.

Filou 30. Jul 2004 15:42

Re: While Schleife beenden, aber von aussen ?!
 
Um die Schleife von außen ab zu brechen, brauchst du eine globale Variable:

Delphi-Quellcode:
var
  stop:boolean;
Du Ereignis bei OnClick:
Delphi-Quellcode:
  stop:=true;
Nun noch die Schleife:
Delphi-Quellcode:
stop := false;

while (stop=false) AND (i<t)
begin
  Application.ProcessMessages;
  inc(i);
end;
cu

Bowler 30. Jul 2004 15:45

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.

Anthauri 30. Jul 2004 15:51

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...

SirThornberry 30. Jul 2004 15:56

Re: While Schleife beenden, aber von aussen ?!
 
Zitat:

Zitat von Filou
Um die Schleife von außen ab zu brechen, brauchst du eine globale Variable

Das ist ein Irrglaube der bei vielen Herrscht. Es reicht vollkommen aus wenn diese Variable als Private der Klasse declariert wird wenn die schleife in einer Methode der Klasse ist. Somit ist es dann auch möglich mehrere Instanzen gleichzeitig laufen zu haben welche die Variable als Abbruchbedingung nehmen. Hättest du eine globale Variable würden sich die Instanzen durcheinander bringen weil alle auf die gleiche Variable zugreifen.

Bowler 30. Jul 2004 15:59

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

SirThornberry 30. Jul 2004 16:02

Re: While Schleife beenden, aber von aussen ?!
 
Zitat:

Zitat von Bowler
Das stimmt. Ich glaube Filou meinte das so, dass die Variable nicht lokal in der Proc deklariert sein darf...

Naja, aber er hat "global" geschrieben und als Beispiel
Delphi-Quellcode:
var
  stop:boolean;
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.


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