[阅读: 490] 2006-03-11 17:33:24
先定义一个数据类型:
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 里的代码完全相同的啊!谁能解释一下这是为什么?