Schleife verlassen

Hallo Freunde
Es ist mir klar, wie ich eine Schleife mit einer Bedingung verlassen kann. Die Bedingung hängt von einer Veränderung ab, die innerhalb der Schleife erzeugt und abgefragt wird, wie

while i 
Nun möchte ich jedoch "von aussen" eingreifen, indem ich eine Schaltfläche drücke, die die Schleife vorzeitig beendet, z.B. wenn ich sehe, dass ein gewünschter Zustand erreicht ist.
Kann ich eine Globale Variable (Boole) benützen, die normal auf TRUE ist, durch drücken des Buttons aber auf FALSE geht? Wie merkt die Schleife, dass die Variable verändert wurde? Kann ich die Variable überhaupt verändern, solange die Schleife läuft?
Ihr seht, ich schwimme total und doch ist es doch wohl "ganz einfach"?
Erich

Hallo,

ist schon so einfach: ich definiere eine Variable continue : boolean und einen Knopf „Abbrechen“, der sie auf false setzt.

continue := true;
while (i 
Im Prinzip funktioniert unter Windows sowieso vieles parallel, daher kann der Knopf gedrückt werden, auch wenn noch eine andere Routine läuft, es sei denn, er ist absichtlich disabled.

Falls in der Schleife auch längere Operation erfolgen, kann man continue auch dort abfragen:


    begin
     if continue then ShowMessage(IntToStr(i);
     if continue then Operation2;
     i:=i+1;
    end;


Gruss Reinhard


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hallo Reinhard

ist schon so einfach: ich definiere eine Variable continue :
boolean und einen Knopf „Abbrechen“, der sie auf false setzt.

continue := true;
while (i

Da liegt der Hase im Pfeffer! Ich muss auch „continue“ als Bedingung setzen! Genau das hatte ich nicht kapiert!!!

Im Prinzip funktioniert unter Windows sowieso vieles parallel,
daher kann der Knopf gedrückt werden, auch wenn noch eine
andere Routine läuft, es sei denn, er ist absichtlich
disabled.

Das habe ich auch gehofft, bin aber nicht konsequen vorgegangen.

Falls in der Schleife auch längere Operation erfolgen, kann
man continue auch dort abfragen:

begin
if continue then ShowMessage(IntToStr(i);
if continue then Operation2;
i:=i+1;
end;

Das ist elegant, werde ich künftig anwenden.
Vielen Dank
Erich

Hallo,

normalerweise reagieren in Delphi die Steuerelemente erst wieder, nachdem eine laufende Funktion beendet wurde. Um also zum Beispiel einen Fortschrittsbalken während eines Durchlaufs zu aktualisieren oder eben auch - wie bei dir - auf ein Knopfereignis zu reagieren, musst du in der Schleife den Befehl

Application.ProcessMessages;

aufrufen. Dadurch werden wartende Aktionen durchgeführt.

Willst du also die Schleife durch Knopfdruck beenden sieht das so aus:

stopit := false;
while do begin

 ;
 Application.ProcessMessages; 
 if stopit then break;


end;

in der OnClick des Knopfes steht dann nur

stopit := true;





stopit: Boolean; 

muss unitweit deklariert sein.

Gruß, Niels

Hallo,

Da liegt der Hase im Pfeffer! Ich muss auch „continue“ als
Bedingung setzen! Genau das hatte ich nicht kapiert!!!

benutze niemals continue als Variable. Continue ist ein reserviertes Wort. Es dient dazu unter bestimmten Bedingungen, wieder zum Anfang einer Schleife (while oder for) zu springen bevor man das Ende erreicht hat.

Gruß, Niels

Hallo,

continue := true;

so, so, continue…

Gruß, Niels

Das Beispiel demonstriert, wie man von aussen auf die Beendigung der Schleife zugreift:

  • ein Global-Variabler mit dem Namen bbContinue : Boolean definieren
  • Im Projekt IDE : Einen Button mit dem Namen btBreak (Caption: Abbrechen) definieren
  • ==> Anweisung : While (i [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

benutze niemals continue als Variable. Continue ist ein
reserviertes Wort. Es dient dazu unter bestimmten Bedingungen,
wieder zum Anfang einer Schleife (while oder for) zu springen
bevor man das Ende erreicht hat.

Danke auch für diesen Hinweis. Ich habe mir generell angewöhnt, für alle Bezeichnungen wie Variablen etc. immer deutsche Wörter zu benutzen. (Mache das schon lange mit VBA). Anstatt „continue“ sage ich meistens „weiter“.
Da haben wir wenigstens einmal einen kleinen Vorteil gegenüber den Englisch-Sprachigen!
Erich

Hallo,

ich mache das meist genauso. Ich gebe dann aber auch noch einen Hinweis auf den Datentyp, falls der Variablenname den Typ nicht sowieso nahelegt (wie zB „istErledigt: Boolean“):

sHilf ist bei mir dann zB ein String, der als Hilfsvariable dient.

Gruß, Niels

Hallo Niels,

im Prinzip hast du Recht, eine andere Bezeichnung wäre sicherer. Es dürfte allerdings auch so funktionieren, denn continue ist kein Strict Pascal, sondern eine Delphi-Erweiterung, und Delphi scheint auch eine var continue : boolean zu akzeptieren.

goto, continue und break gehören zu den schmutzigen Konstruktionen, die Niklaus Wirth in der Sprache vermeiden wollte, ich benutze sie daher nie. Allerdings muss ich zu meiner Schande gestehen, dass ich mich mit exit durchaus angefreundet habe.

In grösseren Firmen werden solche Konstrukte im Rahmen der Qualitätssicherung häufig verboten. Eine übliche Regel lautet, dass ein Unterprogramm nur einen Eingang und nur einen Ausgang haben darf. Das hat im Interesse der Prüfbarkeit eines Programms einiges für sich.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

im Prinzip hast du Recht, eine andere Bezeichnung wäre
sicherer. Es dürfte allerdings auch so funktionieren, denn
continue ist kein Strict Pascal, sondern eine
Delphi-Erweiterung, und Delphi scheint auch eine var continue

boolean zu akzeptieren.

sicher kannst du viele reservierte Wörter als Variablen benutzen. Sie überdecken dann eben deren Funktionalität.

goto, continue und break gehören zu den schmutzigen
Konstruktionen, die Niklaus Wirth in der Sprache vermeiden
wollte, ich benutze sie daher nie. Allerdings muss ich zu
meiner Schande gestehen, dass ich mich mit exit durchaus
angefreundet habe.

Was das Goto anbelangt stimme ich dem zu, denn damit kannst du im Prinzip wild im Code herumspringen. Aber break und continue tragen eher zur Übersichtlichkeit bei.

Wenn ich den kompletten restlichen Code in eine IF-Bedingung einschließen muss um dann irgendwelche Bedingungen am Anfang der Schleife zu prüfen, ist das sicher nicht übersichtlich. Insbsondere wenn das „end“ zur „if…begin“ nicht mehr auf den Bildschirm passt. Dann weiß ich nämlich nicht gleich, ob hinter der if-Abfrage noch was folgt. Da ist ein continue eindeutig: unter dieser Bedingung fang wieder am Anfang an. Ganz hübsch wirds, wenn mehrere solcher Abfragen in einer Schleife vorkommen. Dann kannst du schön viele IFs ineinander schachteln.

Und wie willst du sonst eine FOR-Schleife vorzeitig velassen? Geht nicht. Also musst du dann eine While-Schleife nehmen.

Gruß, Niels