多线程当中创建非可视控件怎么关联继承控件事件
多线程当中创建非可视控件如何关联继承控件事件
讨论一个问题各位
比如:
我们在form中放置一个非可视的控件,idhttp。
然后我们在idhttp控件的OnStatus事件双击,系统会自动生成事件处理程序的框架比如下面这个:
procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
statuspanel1.Caption:=astatustext;
end;
看清楚了
这里有一个过程当中的变量astatustext是系统自动生成的。
我们要作的事情很简单,就是直接在事件处理过程中,获取这个参数,然后赋值给status,这样就可以达到,实时地显示idhttp控件的工作状态。比如正在连接,完成连接这样~!
上面说的那么多,是想请教一下。
这样的情形,当我们放到多线程单元中的时候。
我们用idhttp1:=TIdhttp.create(nil);
这样的代码创建一个idhttp出来。
那么这时候,我们要处理它的onstatus事件。就不行了…………
我们可以手动设置
idhttp1.onstatus:=事件处理过程;
但是这个事件处理过程,无法截取到status状态。
也就是说,它根本无法继承父类的那个参数:astatustext
~~!
我表达的还清楚吧?大家有兴趣可以帮忙看看
模拟一个多线程单元的代码,应该可以更容易理解问题
————————————————————————————————————
unit Unit3;
interface
uses
Classes,dialogs,idhttp;
type
test = class(TThread)
private
tmp:string;
idhttp1:tidhttp;
protected
procedure Execute; override;
procedure showstatus;
public
constructor create(i:string);
end;
implementation
constructor test.create(i:string);
begin
tmp:=i;
inherited create(false);
end;
procedure test.Execute;
begin
idhttp1:=Tidhttp.Create(nil);
idhttp1.Get( 'http://www.baidu.com/ ');
//这里就郁闷了,需要手动设置idhttp1的onstatus处理事件。那到底应该放在idhttp的get之前还是get之后呢?
idhttp1.OnStatus:=showstatus;
end;
procedure test.showstatus;
begin
//然后这里事件处理应该怎么写才可以??难道模仿我们添加idhttp控件在form那样?
//我试过了,把这个过程声名成下面这样,根本没有用
//因为我们这样声名的过程里面的参数AStatusText根本无法识别。也就是没有内容。
{procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
bsskinstatuspanel1.Caption:=astatustext;
end;}
end;
end.
——————————————————————————————————————
------解决方案--------------------
//妖哥,偶是Turbo Delphi
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, idhttp, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, StdCtrls;
type
TForm1 = class(TForm)
IdHTTP2: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
test = class(TThread)
private
tmp:string;
idhttp1:tidhttp;
protected
procedure Execute; override;
procedure IdHTTP1Status(axSender: TObject;
const axStatus: TIdStatus; const asStatusText: String);
public
constructor create(i:string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor test.create(i:string);
begin
讨论一个问题各位
比如:
我们在form中放置一个非可视的控件,idhttp。
然后我们在idhttp控件的OnStatus事件双击,系统会自动生成事件处理程序的框架比如下面这个:
procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
statuspanel1.Caption:=astatustext;
end;
看清楚了
这里有一个过程当中的变量astatustext是系统自动生成的。
我们要作的事情很简单,就是直接在事件处理过程中,获取这个参数,然后赋值给status,这样就可以达到,实时地显示idhttp控件的工作状态。比如正在连接,完成连接这样~!
上面说的那么多,是想请教一下。
这样的情形,当我们放到多线程单元中的时候。
我们用idhttp1:=TIdhttp.create(nil);
这样的代码创建一个idhttp出来。
那么这时候,我们要处理它的onstatus事件。就不行了…………
我们可以手动设置
idhttp1.onstatus:=事件处理过程;
但是这个事件处理过程,无法截取到status状态。
也就是说,它根本无法继承父类的那个参数:astatustext
~~!
我表达的还清楚吧?大家有兴趣可以帮忙看看
模拟一个多线程单元的代码,应该可以更容易理解问题
————————————————————————————————————
unit Unit3;
interface
uses
Classes,dialogs,idhttp;
type
test = class(TThread)
private
tmp:string;
idhttp1:tidhttp;
protected
procedure Execute; override;
procedure showstatus;
public
constructor create(i:string);
end;
implementation
constructor test.create(i:string);
begin
tmp:=i;
inherited create(false);
end;
procedure test.Execute;
begin
idhttp1:=Tidhttp.Create(nil);
idhttp1.Get( 'http://www.baidu.com/ ');
//这里就郁闷了,需要手动设置idhttp1的onstatus处理事件。那到底应该放在idhttp的get之前还是get之后呢?
idhttp1.OnStatus:=showstatus;
end;
procedure test.showstatus;
begin
//然后这里事件处理应该怎么写才可以??难道模仿我们添加idhttp控件在form那样?
//我试过了,把这个过程声名成下面这样,根本没有用
//因为我们这样声名的过程里面的参数AStatusText根本无法识别。也就是没有内容。
{procedure TForm1.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
bsskinstatuspanel1.Caption:=astatustext;
end;}
end;
end.
——————————————————————————————————————
------解决方案--------------------
//妖哥,偶是Turbo Delphi
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, idhttp, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, StdCtrls;
type
TForm1 = class(TForm)
IdHTTP2: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
test = class(TThread)
private
tmp:string;
idhttp1:tidhttp;
protected
procedure Execute; override;
procedure IdHTTP1Status(axSender: TObject;
const axStatus: TIdStatus; const asStatusText: String);
public
constructor create(i:string);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor test.create(i:string);
begin