6 Classes, IdHttp, IdException, SysUtils, Dialogs, IdComponent;
9 THttpWorkEvent = procedure(Sender: TObject; LoadBytes: integer) of object;
11 THTTPDownloadThread = class(TThread)
20 FOnSuccess: TNotifyEvent;
21 FOnConnectionFailed: TNotifyEvent;
22 FLastErrorMessage: String;
23 FOnHttpWork: THttpWorkEvent;
25 FLastTriggeredLoadBytes: integer;
26 FTriggerWorkEventBy: integer;
27 procedure SetProxyPort(const Value: integer);
28 procedure SetProxyServer(const Value: String);
29 procedure SetOnConnectionFailed(const Value: TNotifyEvent);
30 procedure SetOnSuccess(const Value: TNotifyEvent);
31 procedure SetOnHttpWork(const Value: THttpWorkEvent);
32 procedure WorkHandler(Sender: TObject; AWorkMode: TWorkMode;
33 const AWorkCount: Integer);
34 procedure SetTriggerWorkEventBy(const Value: integer);
36 procedure Execute; override;
38 procedure DoConnectionFailed;
41 constructor Create(const Host, URL, Post: String); reintroduce;
42 property RecvString: String read FRecvString;
43 property ProxyServer: String read FProxyServer write SetProxyServer;
44 property ProxyPort: integer read FProxyPort write SetProxyPort;
45 property OnConnectionFailed: TNotifyEvent read FOnConnectionFailed write SetOnConnectionFailed;
46 property OnSuccess: TNotifyEvent read FOnSuccess write SetOnSuccess;
47 property OnHttpWork: THttpWorkEvent read FOnHttpWork write SetOnHttpWork;
48 property LastErrorMessage: String read FLastErrorMessage;
49 property TriggerWorkEventBy: integer read FTriggerWorkEventBy write SetTriggerWorkEventBy;
55 \88Ù
\82È
\82é
\83X
\83\8c\83b
\83h
\82ª
\8f\8a\97L
\82·
\82é VCL
\82Ì
\83\81\83\
\83b
\83h/
\8aÖ
\90\94/
\83v
\83\8d\83p
\83e
\83B
\82ð
56 \95Ê
\82Ì
\83X
\83\8c\83b
\83h
\82Ì
\92\86\82©
\82ç
\88µ
\82¤
\8fê
\8d\87\81A
\94r
\91¼
\8f\88\97\9d\82Ì
\96â
\91è
\82ª
\94
\90¶
\82µ
\82Ü
\82·
\81B
58 \83\81\83C
\83\93\83X
\83\8c\83b
\83h
\82Ì
\8f\8a\97L
\82·
\82é
\83I
\83u
\83W
\83F
\83N
\83g
\82É
\91Î
\82µ
\82Ä
\82Í Synchronize
59 \83\81\83\
\83b
\83h
\82ð
\8eg
\82¤
\8e\96\82ª
\82Å
\82«
\82Ü
\82·
\81B
\91¼
\82Ì
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\8eQ
\8fÆ
\82·
\82é
\82½
\82ß
60 \82Ì
\83\81\83\
\83b
\83h
\82ð
\83X
\83\8c\83b
\83h
\83N
\83\89\83X
\82É
\92Ç
\89Á
\82µ
\81ASynchronize
\83\81\83\
\83b
\83h
\82Ì
61 \88ø
\90\94\82Æ
\82µ
\82Ä
\93n
\82µ
\82Ü
\82·
\81B
63 \82½
\82Æ
\82¦
\82Î
\81AUpdateCaption
\83\81\83\
\83b
\83h
\82ð
\88È
\89º
\82Ì
\82æ
\82¤
\82É
\92è
\8b`
\82µ
\81A
65 procedure THTTPDownloadThread.UpdateCaption;
67 Form1.Caption := 'THTTPDownloadThread
\83X
\83\8c\83b
\83h
\82©
\82ç
\8f\91\82«
\8a·
\82¦
\82Ü
\82µ
\82½';
70 Execute
\83\81\83\
\83b
\83h
\82Ì
\92\86\82Å Synchronize
\83\81\83\
\83b
\83h
\82É
\93n
\82·
\82±
\82Æ
\82Å
\83\81\83C
71 \83\93\83X
\83\8c\83b
\83h
\82ª
\8f\8a\97L
\82·
\82é Form1
\82Ì Caption
\83v
\83\8d\83p
\83e
\83B
\82ð
\88À
\91S
\82É
\95Ï
72 \8dX
\82Å
\82«
\82Ü
\82·
\81B
74 Synchronize(UpdateCaption);
77 { THTTPDownloadThread }
79 constructor THTTPDownloadThread.Create(const Host, URL, Post: String);
81 inherited Create(true);
85 FTriggerWorkEventBy := 1024; // KB
\92P
\88Ê
\82ÅOnHttpWork
\83C
\83x
\83\93\83g
\94
\90¶
88 procedure THTTPDownloadThread.DoConnectionFailed;
90 FOnConnectionFailed(self);
93 procedure THTTPDownloadThread.DoHttpWork;
95 FOnHttpWork(self, FLoadBytes);
98 procedure THTTPDownloadThread.DoSuccess;
103 procedure THTTPDownloadThread.Execute;
105 TmpStr: TStringStream;
110 FLastTriggeredLoadBytes := 0;
113 Http := TIdHTTP.Create(nil);
115 Http.ProxyParams.ProxyServer := ProxyServer;
116 Http.ProxyParams.ProxyPort := ProxyPort;
117 Http.OnWork := WorkHandler;
118 if FPost = '' then begin
119 FRecvString := Http.Get(FURL);
121 TmpStr := TStringStream.Create(FPost);
122 FRecvString := Http.Post(FURL, TmpStr);
124 if Assigned(FOnSuccess) then Synchronize(DoSuccess);
126 on E:EIdException do begin
127 //ShowMessage(E.Message);
128 FLastErrorMessage := E.Message;
129 if Assigned(FOnConnectionFailed) then Synchronize(DoConnectionFailed);
134 if TmpStr <> nil then TmpStr.Free;
138 procedure THTTPDownloadThread.SetOnConnectionFailed(
139 const Value: TNotifyEvent);
141 FOnConnectionFailed := Value;
144 procedure THTTPDownloadThread.SetOnHttpWork(const Value: THttpWorkEvent);
146 FOnHttpWork := Value;
149 procedure THTTPDownloadThread.SetOnSuccess(const Value: TNotifyEvent);
154 procedure THTTPDownloadThread.SetProxyPort(const Value: integer);
159 raise EIdException.Create('Tried to change proxy without suspending');
162 procedure THTTPDownloadThread.SetProxyServer(const Value: String);
165 FProxyServer := Value
167 raise EIdException.Create('Tried to change proxy without suspending');
170 procedure THTTPDownloadThread.SetTriggerWorkEventBy(const Value: integer);
172 FTriggerWorkEventBy := Value;
175 procedure THTTPDownloadThread.WorkHandler(Sender: TObject;
176 AWorkMode: TWorkMode; const AWorkCount: Integer);
178 if AWorkMode = wmRead then
179 //Inc(FLoadBytes, AWorkCount);
180 FLoadBytes := AWorkCount;
181 if (FLastTriggeredLoadBytes div FTriggerWorkEventBy) <>
182 (FLoadBytes div FTriggerWorkEventBy) then begin
183 if Assigned(FOnHttpWork) then Synchronize(DoHttpWork);
184 FLastTriggeredLoadBytes := FLoadBytes;