> Como não parar a aplicação durante um processo longo?



{
Muitas vezes durante um processo longo nossa aplicação fica paralisada, aguardando o termino de um loop e isso pode causar alguns inconvenientes, como permitir que se tenha acesso a outras partes do programa, bem como, até o término do próprio loop.

Então, o que fazer se o usuário deseja cancelar a execução do loop?

Apenas crie uma thread e faça com que o termino do loop dependa do valor de uma variável (Fcanceled nesta dica), a qual pode ser modificada pelo usuário (com o Button2 nesta dica).

Quando o usuário clicar no Button2, fcanceled será False e a thread irá parar o loop.

Durante o loop, você pode clicar na barra de titulo para mostra o menu do sistema, você pode arrastar o form, etc.
}

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Button1: TBitBtn;
Button2: TBitBtn;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FCanceled: Boolean;
public
{ Public declarations }
end;

TThread1 = class(TThread)
protected
constructor Create;
procedure Execute; override;
procedure IncreaseNumber;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TThread1.Create;
begin
inherited Create(false);
end;

procedure TThread1.Execute;
var success: Boolean;
begin
Self.Priority := tpLowest;
with Form1 do
begin
while not FCanceled do
begin
// call Synchronize so that you can create more threads by clicking
// the Start button and all created threads can run synchronously :)
Synchronize(IncreaseNumber);
end;
end;
end;

procedure TThread1.IncreaseNumber;
begin
with Form1 do
Edit1.Text := IntToStr(Succ(StrToInt(Edit1.Text)));
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
Self.Caption := ''Você pode cancelar o Loop'';
Edit1.Text := ''1'';
Edit1.ReadOnly := True;
Button1.Caption := ''Iniciar'';
Button2.Caption := ''Parar'';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FCanceled := False; TThread1.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FCanceled := True;
end;

end
Fonte: http://www.guiadodelphi.com.br/ler.php?codigo=817