unit PrimeForm;
 
interface
 
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;
 
type
 TPrimeFrm = class(TForm)
 NumEdit: TEdit;
 SpawnButton: TButton;
 ResultsMemo: TMemo;
 procedure SpawnButtonClick(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
 private
 { Private declarations }
 FThreadRefCount: integer;
 procedure HandleTerminate(Sender: TObject);
 public
 { Public declarations }
 end;
 
var
 PrimeFrm: TPrimeFrm;
 
implementation
 
uses PrimeThread;
 
{$R *.DFM}
 
procedure TPrimeFrm.SpawnButtonClick(Sender: TObject);
 
var
 NewThread: TPrimeThrd;
 
begin
 NewThread := TPrimeThrd.Create(True);
 NewThread.FreeOnTerminate := True;
 try
 with NewThread do
 begin
 TestNumber := StrToInt(NumEdit.Text);
 Inc(FThreadRefCount);
 OnTerminate := HandleTerminate;
 Resume;
 end;
 except on EConvertError do
 begin
 NewThread.Free;
 ShowMessage('No ha introducido un nmero vlido!');
 end;
 end;
end;
 
procedure TPrimeFrm.FormCreate(Sender: TObject);
begin
 FThreadRefCount := 0;
end;
 
procedure TPrimeFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 CanClose := true;
 if FThreadRefCount > 0 then
 begin
 if MessageDlg('Hay hilos activos. An as desea salir?',
 mtWarning, [mbYes, mbNo], 0) = mrNo then
 CanClose := false;
 end;
end;
 
procedure TPrimeFrm.HandleTerminate(Sender: TObject);
begin
 Dec(FThreadRefCount);
end;
 
end.