{ Unit PrimeThread } type TPrimeThrd = class(TThread) private FTestNumber: integer; FResultString: string; protected function IsPrime: boolean; procedure Execute; override; public property TestNumber: integer write FTestNumber; property ResultString: string read FResultString; end; procedure TPrimeThrd.Execute; begin if IsPrime then FResultString := IntToStr(FTestNumber) + ' is prime.' else FResultString := IntToStr(FTestNumber) + ' is not prime.'; if not Terminated then {Line B} PostMessage(PrimeFrm.Handle, WM_THREAD_COMPLETE, 0, 0); end; { Unit PrimeForm } procedure TPrimeFrm.HandleThreadCompletion(var Message: TMessage); begin if Assigned(FThread) then begin FThread.WaitFor; ResultsMemo.Lines.Add(FThread.ResultString); FThread.Free; FThread := nil; end; end;