关于MethodAddress的疑问...(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用MethodAddress得到自己某个函数的地址,然后调用他,
如果该函数内部使用(访问)了可视控件(VCL),比如form,memo等,
就会发生常见的内存访问错误? 怎样解决?
 
cAkk兄,你是在搞学术研究吧。不用它不能实现你的功能吗?
这个好象是不让直接调用的,只有TReader才能用到。
 
>>这个好象是不让直接调用的
当然可以使用,如果不访问VCL就什么问题也没有.

>>你是在搞学术研究吧。不用它不能实现你的功能吗

打个比方: "假如"我想实现一个非常简单的脚本引擎,用户输入一些文本命令,
就可以执行相应的功能. 比如用户输入:"help", 我需要执行"help"函数,
当然,我可以用if ...then来判断:
if command='help' then
help
else if command='dir' then
dir
else if ...
.....

这样太麻烦了,而且不容易扩展,现在我只要用和command一样的名字做函数名,
收到命令后,用MethodAddress(command)得到函数地址,直接执行这个地址
就可以了,这样程序扩充起来就方便多了.
 
//试试下面的程序就知道了!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(self.caption); //如果Button2Click,则Self为nil
Memo1.Lines.Add('Shenqw'); //相当于Self.Memo1.Lines.Add('Shenqw');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
a:TNotifyEvent;
begin
a:=nil;
@a:=MethodAddress('Button1Click');
showmessage(self.caption);
a(Sender);
end;

end.
 
前卫: 你的例子要说明什么问题?
如果我按button2, Memo1.Lines.Add('Shenqw')会出错

你是为了证明我的这个错误吗?
 
我的意识是说直接调用就没了Self指针,当然不能使用VCL.

<font color=red>//如果Button2Click,则Self为nil</font>
 
前卫: 搞定了!哈哈!还是你老兄厉害!! 只要前面加上"form1."就可以了.

不过为什么"直接调用就没了Self指针"呢?
 
直接调用想当于普通函数,普通函数有Self指针吗?
 
cAkk:
快分分吧!我都等不及了!
(如果他再问问题的话,我都快露马脚了: 沈前卫心有余悸地想) {B-)
 
后退
顶部