标签:
源码中包含了所有的支持单元,其它单元后续会慢慢讲解
unit uReadHtmlThread;
interface
uses
uSimpleThread, uIdhttpEx;
type
TReadHtmlThread = class; // 提前申明 TReadHtmlThread 是一个类,后面好办事
TReadStatus = (rsOK, rsErr);
// 这里就用上TReadHtmlThread ,不然要写个 Sender:TObject 用起来不方便
TOnReadStatus = procedure(Sender: TReadHtmlThread; AStatus: TReadStatus) of object;
TReadHtmlThread = class(TSimpleThread)
private
FIdHttp: TIdhttpEx; // 这是我改进后的 TIdhttp
FOnReadStatus: TOnReadStatus;
FUrl: string;
FNewUrl: string;
FHtml: string;
FListIndex: integer; // 我工用中用的,请把它当成一个参数即可。
FPosInList: integer; // 同上
procedure InitIdhttp; // 重新创建 FIdhttp, 如果读网页出错了,就用一下它(经验之谈)
procedure ReadHtml; // 本例重点,请仔细看
procedure DoReadHtml; // 本例重点,请仔细看
procedure SetOnReadStatus(const Value: TOnReadStatus);
procedure DoOnReadStatus(AStatus: TReadStatus); // 执行事件,关于事件均可参考此写法
procedure SetHtml(const Value: string);
procedure SetUrl(const Value: string);
procedure SetListIndex(const Value: integer);
procedure SetPosInList(const Value: integer);
public
constructor Create; reintroduce; // 再次把 Create 的参数去掉,为以后线程池做准备
{ 因为线程池会用到泛型的 LIST ,泛型定义时可以写一个约束条件 如:
TSimpleThing<T:TXXObject,Constructor> 这个 Constructor 要求 T 的Create没有参数
}
destructor Destroy; override;
procedure StartThread; override; // 启动线程,注意看!!!
property OnReadStatus: TOnReadStatus read FOnReadStatus write SetOnReadStatus;
property Url: string read FUrl Write SetUrl;
property NewUrl: string read FNewUrl;
property Html: string Read FHtml Write SetHtml;
property ListIndex: integer read FListIndex write SetListIndex;
property PosInList: integer read FPosInList write SetPosInList;
end;
implementation
{ TReadHtmlThread }
uses
uOperateIndy, SysUtils;
{uOperateIndy 是我写的一个单元,操作Idhttp简便方法}
destructor TReadHtmlThread.Destroy;
begin
WaitThreadStop; // 在父类中说了为什么要写这句
if Assigned(FIdHttp) then
FIdHttp.Free;
inherited;
end;
procedure TReadHtmlThread.DoOnReadStatus(AStatus: TReadStatus);
begin
if Assigned(FOnReadStatus) then
FOnReadStatus(self, AStatus);
end;
procedure TReadHtmlThread.DoReadHtml;
begin
// 这才是重点
InitIdhttp;
FNewUrl := FUrl;
if IdhttpGet(FIdHttp, FUrl, FHtml) then
begin
FNewUrl := FIdHttp.Url.URI; //重定向后的 Url
DoOnReadStatus(rsOK)
end
else
DoOnReadStatus(rsErr);
end;
procedure TReadHtmlThread.InitIdhttp;
begin
if Assigned(FIdHttp) then
begin
FIdHttp.Free;
end;
FIdHttp := TIdhttpEx.Create(nil);
end;
procedure TReadHtmlThread.ReadHtml;
begin
ExeProcInThread(DoReadHtml); // 哈哈,就一句!
end;
procedure TReadHtmlThread.SetHtml(const Value: string);
begin
FHtml := Value;
end;
procedure TReadHtmlThread.SetListIndex(const Value: integer);
begin
FListIndex := Value;
end;
procedure TReadHtmlThread.SetOnReadStatus(const Value: TOnReadStatus);
begin
FOnReadStatus := Value;
end;
procedure TReadHtmlThread.SetPosInList(const Value: integer);
begin
FPosInList := Value;
end;
procedure TReadHtmlThread.SetUrl(const Value: string);
begin
FUrl := Value;
end;
procedure TReadHtmlThread.StartThread;
begin
inherited;
ReadHtml; // 其实还是这一句,哈哈
end;
constructor TReadHtmlThread.Create;
begin
inherited Create(false);
end;
end.
标签:
原文地址:http://www.cnblogs.com/lackey/p/5371557.html