中国开发网: 论坛: 程序员情感CBD: 贴子 294176
pcplayer
[技术贴]方法的指针有点奇怪
先定义一个数据类型:

TMyMethod = procedure(S:string) of object;


有两个类方法:

procedure TForm1.PrintHello(S: string);
begin
Label1.Caption:=Label1.Caption+' : '+S;
end;

procedure TForm1.SayHello(S: string);
begin
Memo1.Lines.Add(S);
end;

----------
然后,下面有个 Button1 的 click 过程,运行结果符合想象:

procedure TForm1.Button1Click(Sender: TObject);
var
AMethod,BMethod,CMethod,DMethod:TMyMethod;
AP,BP,CP,DP:Pointer;
begin
AMethod:=SayHello;
AP:=@@AMethod;
FList.Add(AP);

BMethod:=self.PrintHello;

AP:=@@BMethod;
FList.Add(AP);

CP:=FList.Items[0];
CMethod:=TMyMethod(CP^);
CMethod('aaa');

DP:=FList.Items[1];
DMethod:=TMyMethod(DP^);
DMethod('aaa');
end;
----------------------------
上面代码里的 FList 是一个 TList,是 TForm1 的私有变量。

运行完上述代码后,可以认为 FList 里面已经有上述2个方法的指针的。而且的确在上面的代码里,从 FList 里取出指针来转换为方法的类型后,执行结果符合预期。

然后,再来个Button2 的click,还是从 FList 里面取方法指针来运行,代码和上面的完全一样:

procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
AMethod:TMyMethod;
AP:Pointer;
begin
for i:=0 to FList.Count-1 do
begin
AP:=FList.Items[i];
AMethod:=TMyMethod(AP^);
AMethod('哈哈!'); 《----- 执行这一句的时候出 AV 错误。
end;
end;

问题是,Button2 里的代码和 Button1 里的代码完全相同的啊!谁能解释一下这是为什么?

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录