作用是取得网页的HTML源码,使用idHttp控件。
       将获取的过程写在线程里,不再主线程内运行,是防止界面的无响应现象。idAntiFree控件虽然可以做到,但是效果不明显。很多时候线程里不可能做太多的事情,可能用来通用化,而且线程之间的通信还是比较麻烦,用消息的方法虽然简单,但是如果我用来接受消息的类是不可视的话,使用AllocateHWnd函数来建立消息句柄将占用资源,所以这个时候使用回调函数是比较折中的办法,虽然不太符合OO设计^_^.
       下面是代码(WinXP SP2 + D2006测试通过)...

unit MainFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdHTTP;
type
TCallBack = procedure(Html: string) of object;

type
TForm1 = class(TForm)
    mmo1: TMemo;
    btn1: TButton;
    edt1: TEdit;
    procedure btn1Click(Sender: TObject);
private
    procedure myCallBack(Html: string);
    { Private declarations }
public
    { Public declarations }
end;

THtmlThreade = class(TThread)
private
    FHttp: TIdHTTP;
    FUrl: string;
    myCallBack: TCallBack;
protected
    procedure Execute; override;
public
    constructor Create(aUrl: string; CallBack: TCallBack);
    destructor Destroy; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.myCallBack(Html: string);
begin
mmo1.Text := Html;
end;

{ THtmlThreade }
procedure THtmlThreade.Execute;
begin
myCallBack(FHttp.Get(FUrl));
end;

constructor THtmlThreade.Create(aUrl: string; CallBack: TCallBack);
begin
inherited Create(True);
FUrl := aUrl;
myCallBack := CallBack;
FHttp := TIdHTTP.Create(nil);
FreeOnTerminate := True;
end;

destructor THtmlThreade.Destroy;
begin
FHttp.Free;
inherited Destroy;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
mythread: THtmlThreade;
begin
mythread := THtmlThreade.Create(edt1.Text, myCallBack);
mythread.Resume;
end;

end.

最后修改:2010 年 08 月 05 日
卧槽,全是白嫖客,服务器不要钱吗?