![]() |
Abbrechen einer Prozedur
Ich bin folgendem Problem bereits des öfteren begegnet:
Wie kann ich ein Programm mitten in der Ausführung abbrechen? Erst kürzlich haben wir uns mit Turing-Maschinen beschäftigt und solche in Delphi implentiert. Und verschiedene Aufgaben mit ihr bewältigt. Einige davon haben viel Zeit in Anspruch genommen. Man konnte das ganze in der Entwicklungsumgebung natürlich einfach zurücksetzen und somit die Ausführung beenden. Was man aber nicht kann, ist einen Button betätigen, welcher die Routine unterbrechen würde. Kann man das wirklich nicht? Wie kann ich zu beliebigem Zeitpunkte aussteigen, ohne gleich 'höhere Gewalt' anwenden zu müssen? Thx für's durchlesen und vllt. sogar für 'nen Lösungsvorschlag? ;) MFG Tae |
Re: Abbrechen einer Prozedur
for-, while- oder repeat-Schleife beendet man mit break.
eine function/procedure beendet man mit exit. die Application wird mit Application.Terminate beendet. die Application wird mit halt(0) sofort beendet (der Holzhammer). für mehr Infos: gib bei der Delphi-Hilfe "halt" ein und klicke dann auf "Ablaufsteuerung". |
Re: Abbrechen einer Prozedur
Und wenn du meintest, dass während der Arbeit ein Klick auf den Button nicht "beachtet" wurde, dann sieh dir auch noch
![]() |
Re: Abbrechen einer Prozedur
letzteres meinte ich. (hab ich mich so undeutlich ausgedrückt?)
THX tigerman33! Jetzt hab ich endlich einen Anhaltspunkt um mich durch die Hilfe zu wühlen ^^ //Edit: Okay, ich habe die Hilfe ein wenig gewälzt und mein Problem auch an sich gelöst. Allerdings nicht schön... Dass ich den Knopf, welcher die Routine aufruft, erneut gedrückt habe wird registriert und auch alles nochmal ausgeführt und danach beim alten weiter gemacht. Aber der Knopf zum Abbrechen wird nur "visuell betätigt" sein OnClick-Event wird erst nachdem die Routine des Start-Knopfes vollendet wurde ausgeführt. Ist das so und damit muss man leben, oder gibt es da etwas das ich nicht erkenne? |
Re: Abbrechen einer Prozedur
Hmm, nein das gehört eigentlich nicht so. :gruebel: Poste am besten mal deinen Code, zumindest die relevanten Teile.
|
Re: Abbrechen einer Prozedur
Delphi-Quellcode:
Das ist das OnClick-Event des Startknopfes.
procedure TForm1.Button1Click(Sender: TObject);
begin Startangaben(Situation); { Initialisierung } Repeat Befehlszyklus(Situation); { startet das Turingprogramm, wird aufgrund gegebener Startangaben definitiv mehrmals durchlaufen } Application.ProcessMessages; Until Situation.beendet; Endinformation(Situation); end;
Delphi-Quellcode:
Das vom Abbruch-Button.
procedure TForm1.bAbbruchClick(Sender: TObject);
begin Form1.close; end; Ich habe auch mal probiert mittels der Zuweisung einer Prozedur zu Application.OnMessage herauszufinden welche Nachrichten denn überhaupt verarbeitet werden... ich habe die Ausfürhung dann immer mal angehalten, wenn sie sich gerade in einer Verzögerungsschleife befand und als nächstes die Nachricht, dass ich einen Knopf drückte verarbeiten müsste. Merkwürdiger Weise waren MSG.message, MSG.wparam und MSG.lparam immer 0. //Edit: Um, möchtest du noch andere Teile des Quelltextes? Ich denke jedoch, dass andere ist nicht so wichtig. |
Re: Abbrechen einer Prozedur
ein Form-Close im Abbrechen teil geht natürlich nicht. Setze lieber eine Variable vom Typ Boolean (zum Beispiel "Canceled") auf True und in der Schleife überprüfst du ob Canceled True ist und brichst diese in dem Fall ab. Hinter der Schleife kannst du dann auch das Close ausführen.
|
Re: Abbrechen einer Prozedur
Eigentlich bräuchte ich noch die Abbruchbedingung (Situation.beendet). Ich vermute aber mal, dass du da gar nicht prüfst, ob auf Abbruch geklickt wurde. So müsste es gehen:
Delphi-Quellcode:
Musst CancelClicked natürlich noch deklarieren und zu false initialisieren. Ob das Close da funktioniert bin ich mir nicht sicher, wenn nicht, würde ich mal versuchen, mit PostMessage ein WM_CLOSE in die MessageQueue zu stellen.
Repeat
Befehlszyklus(Situation); { startet das Turingprogramm, wird aufgrund gegebener Startangaben definitiv mehrmals durchlaufen } Application.ProcessMessages; Until (Situation.beendet) or CancelClicked; ... procedure TForm1.bAbbruchClick(Sender: TObject); begin CancelClicked := true; Form1.close; end; |
Re: Abbrechen einer Prozedur
er brauch das Close einfach nur hinter die Schleife packen und in dem Fall ausführen wenn CancelClicked auf True ist.
|
Re: Abbrechen einer Prozedur
Stimmt, ist mit Sicherheit auch eleganter als die MessageQueue zu missbrauchen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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