相关帖子参考这里 http://expert.csdn.net/Expert/topic/1552/1552016.xml?temp=.3661463这是louislingjjw(云 意)的方法 关于类的方法: (不是类方法,这里指object pascal中的静态方法,相当于C++的成员函数) 1: 带有隐含参数 self 2: 方法是方法,数据是数据。 3:Delphi的方法是一个结构 type TMethod = record Code: Pointer; //方法的入口地址 Data: Pointer; //类实例指针(Self参数) end;我们调用类的方法,其实分为2个部分, 1:调用方法的代码,通过类来获得方法入口地址。 2:访问对象的数据(也可能不访问),通过类的方法的那个隐含参数Self来访问。我做了一个测试: TMyObject = class private FName: string; public procedure ChangeName(AName: string); procedure ShowPrivate; end;procedure TMyObject.ChangeName(AName: string); begin FName := AName; //修改私有变量 ShowMessage('My name is to be changed to ' + AName); end;procedure TMyObject.ShowPrivate; begin ShowMessage('My name is ' + FName); end;procedure TForm1.Button1Click(Sender: TObject); type TCallFun = procedure(AName: string) of object; var E: TMyObject; M: TMethod; begin E := TMyObject.Create; M.Code := @TMyObject.ChangeName; //这里设置要访问的方法的入口地址 M.Data := @Pointer(E)^; //设置Self参数,即类实例指针 TCallFun(M)('Xbl'); E.ShowPrivate; //My name is Xbl E.Free; end;
To : fancier(OP&&C/C++)@Pointer(E)^与Pointer(E)有什么区别吗? 我在程序中试验了,好像没有发生什么意外?
http://expert.csdn.net/Expert/topic/1552/1552016.xml?temp=.3661463这是louislingjjw(云 意)的方法
关于类的方法: (不是类方法,这里指object pascal中的静态方法,相当于C++的成员函数)
1: 带有隐含参数 self
2: 方法是方法,数据是数据。
3:Delphi的方法是一个结构
type
TMethod = record
Code: Pointer; //方法的入口地址
Data: Pointer; //类实例指针(Self参数)
end;我们调用类的方法,其实分为2个部分,
1:调用方法的代码,通过类来获得方法入口地址。
2:访问对象的数据(也可能不访问),通过类的方法的那个隐含参数Self来访问。我做了一个测试:
TMyObject = class
private
FName: string;
public
procedure ChangeName(AName: string);
procedure ShowPrivate;
end;procedure TMyObject.ChangeName(AName: string);
begin
FName := AName; //修改私有变量
ShowMessage('My name is to be changed to ' + AName);
end;procedure TMyObject.ShowPrivate;
begin
ShowMessage('My name is ' + FName);
end;procedure TForm1.Button1Click(Sender: TObject);
type
TCallFun = procedure(AName: string) of object;
var
E: TMyObject;
M: TMethod;
begin
E := TMyObject.Create;
M.Code := @TMyObject.ChangeName; //这里设置要访问的方法的入口地址
M.Data := @Pointer(E)^; //设置Self参数,即类实例指针
TCallFun(M)('Xbl');
E.ShowPrivate; //My name is Xbl
E.Free;
end;
我在程序中试验了,好像没有发生什么意外?