当前位置:主页>仓库管理软件> 列表

请问:如何从函数名称得到函数的指针?

销售管理软件版1楼: 请问:
有没有办法从函数名称得到函数的指针? 类似于GetProcAddress(HDll,FuncName).
Tform的Public函数,不是published。所以不能用methodaddress().

2楼: 好像是申明个指针变量再赋值一下吧.. 如最好用的财务软件

3楼: GetProcAddress用于从DLL中获得方法指针,在一般单元中,用MethodAddress获得
published类型的方法指针,但对其他(如public、private)类的方法却无非获得地址信息。
我是这么解决:
定义过程类型,然后通过此类型的变量(就是指向过程或函数的指针)获得方法指针。
type PMethods = procedure of Object;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
procedure MethodForTest;
published
procedure SayHello;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
showmessage(''FormClick!'');
end;

procedure TForm1.MethodForTest;


begin
showmessage(''Procedure For Test'');
end;

procedure TForm1.SayHello;
begin
showmessage(''Hello!'');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
P_Method :PMethods; //方法类型变量
sData :string;
aPtr :Pointer; //普通指针变量
begin
aPtr :=Pointer(@self.Onclick); //直接转换
sData :=MethodName(aPtr); //对于此published方法可以用MethodName获得信息
sData :=Format(''%x : %s'',[integer(aPtr),sData]);
Memo1.Lines.Add(sData);

P_Method :=self.SayHello; //published型,方法类型变量赋值
aPtr :=@P_Method;
sData :=MethodName(aPtr);
sData :=Format(''%x : %s'',[integer(aPtr),sData]);
Memo1.Lines.Add(sData);

P_Method :=self.MethodForTest; //public型赋值给方法类型变量
aPtr :=@P_Method;
sData :=MethodName(aPtr); //不能获取
sData :=Format(''%x : %s'',[integer(aPtr),sData]);
Memo1.Lines.Add(sData); //只显示地址而没有显示MethodName


end;

显示结果:
Memo1
455A58 : FormClick
455A9C : SayHello
455A74 :

4楼: 我在做一个plugin程序,需要调用主程序的function或procedure。
Jonson_sunshine的方法不适用于plugin。应该没有任何办法,根据函数名称得到函数的指针。对plugin,就算用interface,也无法做的比较灵活。如果你想使用什么函数,你也必须在主程序的interface中写好。这不算好的plugin系统。如果我把所有的函数和过程全部published.这样不用interface,也可以调用任何函数。
大家还有好的想法没有?

5楼: plugin没做过,而且你的具体结构是怎样呢?
用接口如何不够灵活?
可不可以试试DLL封装?

6楼: To Jonson_sunshine:
我现在用Jedi的plugin component.免费的,你应该有吧。
我的主程序已经做好,用户可以使用。如何在不改变主程序的情况下,实现新增加的功能或替换原来旧的函数?这就是Plugin的作用。例如数据备份和恢复。
我的plugin在主程序的菜单中自动添加备份和恢复的菜单项,屏蔽原有的函数,调用plugin中的函数。这是客户化的办法。另外你无法预测,客户提出什么,以后增加什么功能,不好在主程序中预留。所以说Interface和DLL封装不适用。

销售管理软件版7楼: 结分了。