C cAkk Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #1 我用MethodAddress得到自己某个函数的地址,然后调用他, 如果该函数内部使用(访问)了可视控件(VCL),比如form,memo等, 就会发生常见的内存访问错误? 怎样解决?
O o*o Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #3 cAkk兄,你是在搞学术研究吧。不用它不能实现你的功能吗? 这个好象是不让直接调用的,只有TReader才能用到。
C cAkk Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #4 >>这个好象是不让直接调用的 当然可以使用,如果不访问VCL就什么问题也没有. >>你是在搞学术研究吧。不用它不能实现你的功能吗 打个比方: "假如"我想实现一个非常简单的脚本引擎,用户输入一些文本命令, 就可以执行相应的功能. 比如用户输入:"help", 我需要执行"help"函数, 当然,我可以用if ...then来判断: if command='help' then help else if command='dir' then dir else if ... ..... 这样太麻烦了,而且不容易扩展,现在我只要用和command一样的名字做函数名, 收到命令后,用MethodAddress(command)得到函数地址,直接执行这个地址 就可以了,这样程序扩充起来就方便多了.
>>这个好象是不让直接调用的 当然可以使用,如果不访问VCL就什么问题也没有. >>你是在搞学术研究吧。不用它不能实现你的功能吗 打个比方: "假如"我想实现一个非常简单的脚本引擎,用户输入一些文本命令, 就可以执行相应的功能. 比如用户输入:"help", 我需要执行"help"函数, 当然,我可以用if ...then来判断: if command='help' then help else if command='dir' then dir else if ... ..... 这样太麻烦了,而且不容易扩展,现在我只要用和command一样的名字做函数名, 收到命令后,用MethodAddress(command)得到函数地址,直接执行这个地址 就可以了,这样程序扩充起来就方便多了.
沈 沈前卫 Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #5 //试试下面的程序就知道了! 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.
//试试下面的程序就知道了! 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.
C cAkk Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #6 前卫: 你的例子要说明什么问题? 如果我按button2, Memo1.Lines.Add('Shenqw')会出错 你是为了证明我的这个错误吗?
沈 沈前卫 Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #7 我的意识是说直接调用就没了Self指针,当然不能使用VCL. <font color=red>//如果Button2Click,则Self为nil</font>
C cAkk Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #9 前卫: 搞定了!哈哈!还是你老兄厉害!! 只要前面加上"form1."就可以了. 不过为什么"直接调用就没了Self指针"呢?
沈 沈前卫 Unregistered / Unconfirmed GUEST, unregistred user! 2000-03-09 #12 cAkk: 快分分吧!我都等不及了! (如果他再问问题的话,我都快露马脚了: 沈前卫心有余悸地想) {B-)