pceyes
尊榮會員
發表:70 回覆:657 積分:1140 註冊:2003-03-13
發送簡訊給我
|
[原]一个简单的函数回调演示 http://www.wa666.cn/?action=show&id=52 作用是取得網頁的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);
-
- public
-
- 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;
-
- 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.
------ 努力會更接近成功
|