Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Wie Procedure abbrechen (https://www.delphipraxis.net/41589-wie-procedure-abbrechen.html)

Insider2004 5. Mär 2005 16:21


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?

Binärbaum 5. Mär 2005 16:22

Re: Wie Procedure abbrechen
 
Innerhalb einer for-Schleife kann man mit
Delphi-Quellcode:
Break;
die Schleife verlassen. Prozeduren beendet man mit
Delphi-Quellcode:
Exit;
MfG
Binärbaum

Jasocul 5. Mär 2005 16:24

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.

mirage228 5. Mär 2005 16:25

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:
// Vorher auf false setzen!
FAborted := False;
for i := 0 to 2323324 do
begin
  // ...
  Application.ProcessMessages;
  if FAborted then Break;
end;
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.

In am Abbrechen Button schreibst Du nun
Delphi-Quellcode:
FAborted := True;
mfG
mirage228

Pr0g 5. Mär 2005 16:26

Re: Wie Procedure abbrechen
 
Warscheinlich musst du hin und wieder in der Schleife
Delphi-Quellcode:
Application.ProcessMessages;
aufrufen, damit das Programm die Message beim Klick verarbeitet.


MfG Pr0g

Insider2004 5. Mär 2005 16:36

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;

Luckie 5. Mär 2005 16:39

Re: Wie Procedure abbrechen
 
Deaktivier den Button nach dem man draufgeklickt hat.

mirage228 5. Mär 2005 16:40

Re: Wie Procedure abbrechen
 
Zitat:

Zitat von Insider2004
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;

Hi,

setze eine weitere Boolean Variable ein, die Du am Anfang der Procedure auf TRUE setzt und am Ende auf FALSE.

z.B.
Delphi-Quellcode:
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;
mfG
mirage228

Binärbaum 5. Mär 2005 16:43

Re: Wie Procedure abbrechen
 
Zitat:

Zitat von Insider2004
2. Problem
Das Application.ProcessMessages; macht es möglich, dass meine Procedure nochmals von "hinten" aufgerufen wird. Wie vermeide ich diese Rekursion?

Delphi-Quellcode:
procedure TForm1.OnButtonClick;
begin
  for i := 0 to 2323324 do
    begin
      // ...
      Application.ProcessMessages;
      if FAborted then Break;
    end;
end;

Wenn der Button einmal gedrückt wurde, kann man die Eigenschaft Enabled des Buttons auf False setzen und am Ende der Prozedur wieder auf True:
Delphi-Quellcode:
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;
MfG
Binärbaum

Chewie 5. Mär 2005 17:04

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 00:15 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