类或组件中的事件响应的问题,大家看看!(100分)

3

3cs

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有一个类A:
Unit UA;
interface
type
A = Class
private
Fonloop : TNotifyEvent;
Procedure loop;
publish
propert onloop : TNotifyEvent read Fonloop write Fonloop;
end;
procedure strloop;
implementation
procedure A.create(AOwner: TComponent)
begin
...
Fonloop:=loop;
end;

procedure A.loop;
begin
messagedlg('我被调用了!',mtconfirmation,[mbok],0);
end;


procedure strloop;
begin
if assign(Fonloop) then
onloop(self);//这个地方在编译的时候出错,这是为什么?
end;
 
TNotifyEvent 是一个类方法
procedure strloop;
begin
if assign(Fonloop) then
onloop(self);//这个地方在编译的时候出错,这是为什么?
end;
strloop 里怎么知道 Fonloop是什么??肯定出错了.
 
恩,你说的不错,
现在的问题是有没有办法使这个外部过程
procedure strloop;
也能够响应这个A类的方法呢?
 
做构造函数的时候 把它当参数传进去....
 
其实是可以的,TNotifyEvent = TMethod,本质上就是多一个隐含参数 Self: Pointer 的 Procedure。
不过楼上构造一个 helpclass 是正解,这样可维护性什么的更好
 
如果楼主实在要这么做(不明白楼主这个有什么意义),这样写就好了
procedure strloop;
var
Fa: A;
begin
fa := A.Create;
try
if assign(fa.onloop) then
fa.onloop(self);
finally
fa.free;
end;
end;

Procedure loop(Sender: TObject);
这个改一下,TNotifyEvent有个参数
 
其实根本原因是
procedure strloop;不是类的方法,它虽然能访问类的东西,但是不可能有self指针
当然会出错。
 
不知道你想要做什么
如果只是为响应事件的时候能执行strloop的话,很简单A.loop中执行strloop就行了。
procedure A.loop;
begin
strloop;
messagedlg('我被调用了!',mtconfirmation,[mbok],0);
end;
如果是想把strloop作为相应事件的方法可以这么写:
procedure strloop(Self, Sender: TObject);
begin
..........
end;
procedure A.create(AOwner: TComponent)
var
m:TMethod;
begin
...
m.data:=self;
m.code:=@strloop;
Fonloop:=TNotifyEvent(m);
//Fonloop:=loop;
end;
 
我这个Procedure strloop 是一个外部过程(和我定义的类在一个UNIT中而已)。其实在我的程序中是一个外部的回调函数,在这个回调函数中接收了一个系统的消息,一但收到就必须触发ONLoop这个方法的,所以我才有此一问。
 

Similar threads

I
回复
0
查看
461
import
I
I
回复
0
查看
462
import
I
I
回复
0
查看
664
import
I
顶部