Eigentlich ist das Problem ganz einfach zu lösen.
Man braucht dazu ein Flag, einen Start- und einen Stopbutton und zwei kleine Hilfsfunktionen:
Delphi-Quellcode:
TForm1=class(TForm)
pivate
FRunning : Boolean;
// =True wenn Arbeitsprocedure läuft
procedure DoWork;
// die Arbeitsprocedure; kann längere Zeit laufen
protected
function IsRunning:Boolean;
procedure UpdateButtons;
end;
....
function TForm1.IsRunning:Boolean;
begin
// wichtig, VCL muss die Gelegenheit bekommen
// auf einen Klick auf Stopbutton zu reagieren
Application.ProcessMessages;
Result := FRunning;
end;
// Start- und Stopbutton an- bzw. abschalten
procedure TForm1.UpdateButtons;
begin
ButtonStart.Enabled :=
not FRunning;
ButtonStop.Enabled := FRunning;
end;
procedure TForm1.StartButtonClick(Sender:TObject)
begin
FRuning := True;
UpdateButtons;
DoWork;
FRunning := False;
UpdateButtons;
end;
procedure TForm1.StopButtonClick(Sender:TObject)
begin
FRuning := False;
end;
// die Arbeitsprocedure
// hier kann man alles mögliche tun,
// man muss nur regelmässig die Funktion IsRunning aufrufen
// und mit Exit abbrechen falls nötig
procedure TForm1.DoWork;
begin
for i:=1
to 1000
do
begin
if not IsRunning
then Exit;
....
end;
end;