![]() |
Wie Procedure abbrechen
Ich habe eine Procedure mit Schleife, die etwas macht (z.B. eine Berechnung, die 1 Minute braucht).
Desweiteren möchte ich einen Button haben, mit dem ich die Berechnung abbrechen kann. Wie kann ich das machen? |
Re: Wie Procedure abbrechen
Innerhalb einer for-Schleife kann man mit
Delphi-Quellcode:
die Schleife verlassen. Prozeduren beendet man mit
Break;
Delphi-Quellcode:
MfG
Exit;
Binärbaum |
Re: Wie Procedure abbrechen
Weitere Hinweise:
In der Schleife: Application.ProcessMessages Und eine globale Variable abfragen, die durch das Drücken des Buttons gesetzt werden. Kann natürlich eine Variable im Objekt TForm sein. |
Re: Wie Procedure abbrechen
Hi,
du packst eine Variable "FAborted: Boolean" in den Private-Abschnitt Deines Forms. Die Schleife sieht dann z.B. so aus:
Delphi-Quellcode:
Schleifen abbrechen kannst Du mit Break (bei repeat oder while Schleifen, solltest Du es aber über die Abbruchbedingung der Schleife selbst tun!), Prozeduren mit Exit.
// Vorher auf false setzen!
FAborted := False; for i := 0 to 2323324 do begin // ... Application.ProcessMessages; if FAborted then Break; end; In am Abbrechen Button schreibst Du nun
Delphi-Quellcode:
mfG
FAborted := True;
mirage228 |
Re: Wie Procedure abbrechen
Warscheinlich musst du hin und wieder in der Schleife
Delphi-Quellcode:
aufrufen, damit das Programm die Message beim Klick verarbeitet.
Application.ProcessMessages;
MfG Pr0g |
Re: Wie Procedure abbrechen
Danke soweit! Allerdings habe ich noch etwas:
1.Problem: Das Application.ProcessMessages; ermöglicht meiner Application, dass ich den Abbruch-Button drücken kann. Dieser ist aber sehr schlecht "zu erreichen". D.h. die meiste Rechenzeit wird in der Schleife verbraucht. Wie kann ich dem Abbruch-Button sozusagen mehr Zeit geben? 2. Problem Das Application.ProcessMessages; macht es möglich, dass meine Procedure nochmals von "hinten" aufgerufen wird. Wie vermeide ich diese Rekursion? procedure TForm1.OnButtonClick; begin for i := 0 to 2323324 do begin // ... Application.ProcessMessages; if FAborted then Break; end; end; |
Re: Wie Procedure abbrechen
Deaktivier den Button nach dem man draufgeklickt hat.
|
Re: Wie Procedure abbrechen
Zitat:
setze eine weitere Boolean Variable ein, die Du am Anfang der Procedure auf TRUE setzt und am Ende auf FALSE. z.B.
Delphi-Quellcode:
mfG
procedure TForm1.Button1Click;
begin if (FRunning) then Exit; FRunning := True; for i := 0 to 2323324 do begin // ... Application.ProcessMessages; if FAborted then Break; end; FRunning := False; end; mirage228 |
Re: Wie Procedure abbrechen
Zitat:
Delphi-Quellcode:
MfG
procedure TForm1.OnButtonClick;
begin Button1.Enabled:= False;//Button1 gesperrt for i := 0 to 2323324 do begin // ... Application.ProcessMessages; if FAborted then Break; end; Button1.Enabled:= True;//Button1 wird wieder aktiviert end; Binärbaum |
Re: Wie Procedure abbrechen
Ich würde empfehlen, die langwierige Berechnung in einen seperaten Thread zu verlagern. Das hat den Vorteil, dass du durch die Priorität besser die Rechnerauslastung rgulieren kannst.
Und außerdem ist die Reaktionszeit zwischen des Klickens des Stop-Button und des eigentlichen Stopps geringer. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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