Delphi-Quellcode:
procedure foo;
var
u : integer;
begin
u := 0;
repeat
until u = 25;
end;
procedure anotherfoo;
var
u : integer;
begin
u := 25;
end;
Das Problem ist, diese beiden Variablen u haben eine lokale Gültigkeit und wissen absolut nichts voneinander! Du würdest hier eine Variable benötigen mit einem größeren Gültigkeitsbereich.
Delphi-Quellcode:
var
u : integer;
procedure foo;
begin
u := 0;
repeat
until u = 25;
end;
procedure anotherfoo;
begin
u := 25;
end;
Problematisch ist hierbei jetzt nur noch, dass wenn die procedure foo arbeitet man so keine Möglichkeit hat, von aussen die procedure anotherfoo aufzurufen.
Hier ein kleines Beispiel, wie so eine simple Abbruchbedingung in einer Form mit Buttons realisert werden kann
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class( TForm )
btnAbbruch: TButton;
btnStart: TButton;
procedure btnAbbruchClick( Sender : TObject );
procedure btnStartClick(Sender: TObject);
private
{ Private-Deklarationen }
Abbruch : Boolean;
public
{ Public-Deklarationen }
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnAbbruchClick( Sender : TObject );
begin
Abbruch := True;
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
Abbruch := False;
while not Abbruch
do
begin
// ganz tolle Berechnung
// Der Anwendung die Möglichkeit geben anstehende Ereignisse abzuarbeiten
Application.ProcessMessages;
end;
end;
end.
Application.ProcessMessages ist hierbei einer der Schlüssel, denn ansonsten könntest du auf dem Button btnAbbruch Samba tanzen und es würde trotzdem nichts passieren und abgebrochen schon mal gar nichts.
Dieses ist ein simples Beispiel und eigentlich nicht wirklich schöner Stil.
Die Berechnung sollte innerhalb eines Threads erfolgen, den man sehr schon von aussen abbrechen kann.
Aber das würde die Aufgabe hier extrem sprengen, würde aber im Gegenzug die Trennung von Code und Ausgabe sehr elegant machen.