Код: Выделить всё
TNewThread = class(TThread)
private
{ Private declarations }
s: string;
Bool: Boolean;
protected
procedure SyncProc;
procedure Execute; override;
procedure DoTerminate; override;
end;
var
Form1: TForm1;
a: string;
DownloadStatus: Boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
NewThread: TNewThread;
begin
Button1.Enabled := False;
NewThread := TNewThread.Create(True); // Поток создан и остановлен
NewThread.FreeOnTerminate := True; // Уничтожить поток после завершения работы
NewThread.Resume; // Запуск потока
end;
procedure TNewThread.Execute;
var
HTTP: TIdHTTP;
MS: TMemoryStream;
begin
Bool := True; // Статус выполнения операции (успешно)
HTTP := TIdHTTP.Create(nil);
MS := TMemoryStream.Create;
try
try
HTTP.Get('http://rvs.ucoz.ru/files/programs/il2sfbc_update.7z', MS);
MS.SaveToFile('il2sfbc_update.7z');
except
on E: Exception do
begin
Bool := False; // Статус выполнения операции (накрылось медным тазом)
s := E.Message;
end;
end;
finally
HTTP.Free;
MS.Free;
end;
Synchronize(SyncProc); // Синхронизация с основным потоком
end;
procedure TNewThread.SyncProc;
begin
DownloadStatus := Bool; // Синхронизация Boolean
a := s; // Синхронизация string
end;
procedure TNewThread.DoTerminate;
begin
// Что-то... Если нужно до вызова внешнего OnTerminate (если назначен)
inherited;
// Что-то... Если нужно после вызова внешнего OnTerminate (если назначен)
Form1.Button1.Enabled := True;
if DownloadStatus then MessageBox(0, 'Скачивание прошло успешно', 'Информация', MB_ICONInformation) else MessageBox(0, PChar('Произошла ошибка при скачивании. ' + a), 'Ошибка', MB_ICONError)
end;