如何在TList中存函数指针并取出来用? (50分)

  • 主题发起人 张鸿林
  • 开始时间

张鸿林

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var ClickEventList:TList ;
click:TNotifyEvent;
begin
ClickEventList:=TList.create;
try
// ClickEventList.Add(Button2.OnClick)
//刚才写错了
ClickEventList.Add(@Button2.OnClick);
click:=TNotifyEvent(ClickEventList.Items[0]^);
if assigned(click1) then
click(sender)
//错误? 如果click:=Button2.OnClick当然就可以
finally
ClickEventList.free;
end;
end;
 
TNotifyEvent(ClickEventList.Items[0]);
 
张无忌兄:
编译通不过
 
ClickEventList.Add(Button2.OnClick)
//这样才行
 
还是不行,因为TList.Add的参数必须为指针类型
我用类似方法存储对象或变量都没有问题
我象,funxtion应该也可以视为变量

不知张无忌兄有没有别的代替方法?
 
那个不行啊,Button2.OnClick本来就是指针,不信你测试呀???
 
编译错误:

ClickEventList.Add(Button2.OnClick);

Not Eouph Actual Parameters

ClickEventList.Add(Button2.OnClick);

Invalid Type Cast
 
ClickEventList.Add(Button3.Onclick(sender));
这样也不行,即使行,也不是我的目的
 
click:=TButton2.OnClick;
ClickEventList.Add(click);
 
不行,同样编译不通过
在做大量测试前,我一般不会随便提问题.
事实上我最早的方法是参考TList.Add的Example作的
 
这样好了,
AClient:pInteger;
AClient:=PInteger(TButton2.OnClick);

ClickEventList.Add(AClient);
 
以下程序我已经测试通过:
procedure TForm1.Button1Click(Sender: TObject);
var
ClickEventList:TList;
click:TNotifyEvent;
Method: TMethod;
begin
ClickEventList:=TList.create;
try
ClickEventList.Add(MethodAddress('Button2Click'));
Method.Code:=ClickEventList.Items[0];
Method.Data:=Self;
Click:=TNotifyEvent(Method);
if assigned(click) then
click(sender);
finally
ClickEventList.free;
end;
end;
 
改一下看看,不过没有调试过的
procedure TForm1.Button1Click(Sender: TObject);
type
pNotifyEvent = ^TNotifyEvent;
var ClickEventList:TList ;
click:pNotifyEvent;
i : integer;
begin
ClickEventList:=TList.create;
try
// ClickEventList.Add(Button2.OnClick)
//刚才写错了
New(pNotifyEvent);
pNotifyEvent^ := @Button2.OnClick;
ClickEventList.Add(pNotifyEvent);
click:=pNotifyEvent(ClickEventList.Items[0]);
if assigned(click1) then
click^(sender)
//错误? 如果click:=Button2.OnClick当然就可以
finally
for i := 0 to ClickEventList.Count - 1 do
begin
click := ClickEventList.items;
dispose(click);
end;
ClickEventList.free;
end;
end;
 
AClient:pInteger;

AClient:=@Button2.OnClick
//还是必须这样表达才行
 
真的不用这样,你测试我的代码看看
 
Button.onclick本来就是地址,你还换什么?
 
我已经把可用的代码贴给你了,你没试吗?你简单地拷贝过去就行了...
 
yanghaijun用了RTTI,速度慢了,只适合published里的方法
 
pNotifyEvent^ := @Button2.OnClick;
有问题,再调试一下才向您报告,
 
所有的方法地址啊,什么类啊,都是指针,可以当Integer来处理的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部