Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Abbrechen einer Prozedur (https://www.delphipraxis.net/58173-abbrechen-einer-prozedur.html)

Tae 2. Dez 2005 12:37


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

RavenIV 2. Dez 2005 12:43

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

tigerman33 2. Dez 2005 16:13

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 Delphi-Referenz durchsuchenApplication.ProcessMessages an.

Tae 3. Dez 2005 22:13

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?

tigerman33 4. Dez 2005 09:25

Re: Abbrechen einer Prozedur
 
Hmm, nein das gehört eigentlich nicht so. :gruebel: Poste am besten mal deinen Code, zumindest die relevanten Teile.

Tae 4. Dez 2005 10:24

Re: Abbrechen einer Prozedur
 
Delphi-Quellcode:
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;
Das ist das OnClick-Event des Startknopfes.

Delphi-Quellcode:
procedure TForm1.bAbbruchClick(Sender: TObject);
begin
 Form1.close;
end;
Das vom Abbruch-Button.
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.

SirThornberry 4. Dez 2005 10:34

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.

tigerman33 4. Dez 2005 10:34

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

SirThornberry 4. Dez 2005 10:44

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.

tigerman33 4. Dez 2005 10:56

Re: Abbrechen einer Prozedur
 
Stimmt, ist mit Sicherheit auch eleganter als die MessageQueue zu missbrauchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 Uhr.
Seite 1 von 2  1 2      

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