unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls; const CFileName = 'D:\serverlist.txt'; CUrl = 'http://ver.bo.sohu.com/version/serverlist.txt'; CBlock = 1024; type TForm1 = class; TDownThread = class(TThread) private FOwner: TForm1; protected procedure Execute; override; public constructor Create(AOwner: TForm1); end; TForm1 = class(TForm) Button1: TButton; IdHTTP1: TIdHTTP; IdTCPClient1: TIdTCPClient; Button2: TButton; Edit1: TEdit; ProgressBar1: TProgressBar; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private FThread: TDownThread; FFile: TFileStream; FFileSize: Integer; { Private declarations } protected procedure Execute; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TDownThread } constructor TDownThread.Create(AOwner: TForm1); begin inherited Create(True); FOwner := AOwner; end; procedure TDownThread.Execute; begin while not Terminated do FOwner.Execute; end; { TForm1 } procedure TForm1.Execute; begin FFile.Position := FFile.Size; IdHttp1.Request.ContentRangeStart := FFile.Position; IdHttp1.Request.ContentRangeEnd := IdHttp1.Request.ContentRangeStart + CBlock; if IdHttp1.Request.ContentRangeEnd > FFileSize then IdHttp1.Request.ContentRangeEnd := FFileSize; IdHttp1.Get(CUrl, FFile); if FFile.Size = FFileSize then FThread.Terminate; end; procedure TForm1.Button1Click(Sender: TObject); begin FThread.Resume; end; procedure TForm1.Button2Click(Sender: TObject); begin FThread.Suspend; end; procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin ProgressBar1.Position := FFile.Position; end; procedure TForm1.FormCreate(Sender: TObject); begin if FileExists(CFileName) then FFile := TFileStream.Create(CFileName, fmOpenWrite) else FFile := TFileStream.Create(CFileName, fmCreate); IdHttp1.Head(CUrl); FFileSize := IdHttp1.Response.ContentLength; ProgressBar1.Min := 0; ProgressBar1.Max := FFileSize; ProgressBar1.Position := FFile.Size; FThread := TDownThread.Create(Self); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin FThread.Free; FFile.Free; end; end.