我们都知道下面的定义
TNotifyEvent=procedure(Sender:TObject)of Object;
它提供了一个对象成员函数的指针,数据内容中包括对象信息和过程信息,
我希望可以有一种方式可以实现不包括对象信息的指向对象成员的指针.
就想C++中的指向对象成员的指针,
TNotifyEvent=procedure(Sender:TObject)of Object;
它提供了一个对象成员函数的指针,数据内容中包括对象信息和过程信息,
我希望可以有一种方式可以实现不包括对象信息的指向对象成员的指针.
就想C++中的指向对象成员的指针,
解决方案 »
- delphi 如何做一个像飞鸽一样的开始界面。就是打开飞鸽,能够查找到局域网里已经打开飞鸽的机器
- Delphi如何自动隐藏MDI主窗体的toolbar工具栏?
- 问题急!生成双色球110万多组合,如何快速显示到Grid 中?
- 关于一个DBGird显示不同颜色的简单问题(附源码)
- 去掉TWebBrowser的滚动条
- 哪里有中文的Dephi联机帮助下???能提供Dephi的命名规范吗???
- Paradox数据库的备份问题?
- 我连库是用TDATABASE控件,我的程序退出时多退几次系统就会出现记忆体不够的提示,怎么解决
- 有RG-DL的脱壳工具嘛?
- 在wise中什么是表示安装目录的?就象IS for delphi5中的<installdir>,我的数据库文件总放不进程序目录下的data中。
- delphi7怎么使用TCompressionStream进行压缩文件夹,压缩文件是可以的。但是压缩文件夹怎么都搞不定。
- 關於http上傳檔案的指定路徑
我就是需要类似于使用C++成员指针的方法
就是类似于使用C++成员指针的方法,至于其中的Sender参数并不是必须的,你自己定义类型时可以不用,如:
TMyProc=procedure of Object;
TMyFunc=function(a: Integer): Integer of Object;等等
TNotifyEvent=procedure(Sender:TObject)of Object;
不光包括了成员函数地址,而且还包含引用对象的信息.
它的使用,是针对特定对象元素的.我的希望有种方法可以只包含成员函数信息,而不包含引用对象信息;
在使用时,我再通过特定的对象引用.有人用过C++的成员指针(成员数据指针/成员函数指针)吗?
{
long value;
public:
Example(void){ value = 0; }
void set_value(long v){ value = v; }
long get_value(){ return value; }
};void main()
{
long (Example::*fp)() = &Example::get_value;
Example e;
long v = (e.*fp)();
}
这样的成员函数指针只包含类成员函数地址,不指向特定的对象。
Delphi可以用MethodAddress取得说明在published部分类方法的地址,但是不好直接通过指针调用该方法,因为Delphi类方法的调用标准是fastcall,同时Pascal也是强类型语言,但是可以用BASM模拟,例如:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
function GetValue: Integer;
private
{ Private declarations }
value: Integer;
public
{ Public declarations }
procedure SetValue(v: Integer);
end;var
Form1: TForm1;implementation{$R *.dfm}function TForm1.GetValue: Integer;
begin
Result := value;
end;procedure TForm1.SetValue(v: Integer);
begin
value := v;
end;procedure TForm1.Button1Click(Sender: TObject);
var
func: Pointer;
v: Integer;
begin
func := TForm1.MethodAddress('GetValue'); // 取得类方法地址,与具体对象无关
SetValue(10); // 具体对象Form1
asm
mov eax, Form1
mov edx, func
call edx
mov v, eax
end;
ShowMessage(IntToStr(v));
end;
谢谢大家支持!