函数指针 (100分)

  • 主题发起人 主题发起人 quanta
  • 开始时间 开始时间
Q

quanta

Unregistered / Unconfirmed
GUEST, unregistred user!
TForm2 = class
private
; ;i: integer;
public
; ;procedure proc;
end; ;

procedure TForm2.proc;
begin
; i := 1; //此处出错,在i前加上类名则可以(即 Form2.i :=1),
; ; ; ; ; //小弟只是搞不明白为什么
end;


procedure TForm1.Call; ;
var ; ; ; ; ; ; ; ; ; ;
; p: procedure of object
begin ; ; ; ; ; ; ; ; ;
; p := Form2.proc; ; ;
; p; ; ; ; ; ; ; ; ; ; ;
end; ; ; ; ; ; ; ; ; ; ;
 
我试过,没有出错啊
 
正常情况下,没有发现出错。
不过,老兄是否忘记了将FORM2 := TFORM2。CREATE(。。。);???
 
这是由于没有了解函数指针的缘故。你定义的函数指针p,其类型为procedure of object,
这说明p是指向某个对象的成员函数。注意,是对象,不是类,类的意思可以肤浅的理解成
是类型,而对象,是类的一个实例。错误由此而产生。
p := Form2.proc,Form2若没有创建的话(即Form2:= TForm2.Create),在Form2内部,是
没有成员变量i的(想想,它都没有创建,在内存中根本没有i的位置),这时调用p,肯定
会出一个地址非法访问的错误(若没有错误,那小心了,把1不知写到内存哪个地方去了,这
时……)。若Form2创建了,且调用p之前没有Free,肯定不会产生错误。

至于这个问题:
; i := 1; //此处出错,在i前加上类名则可以(即 Form2.i :=1),
; ; ; ; ; //小弟只是搞不明白为什么
i:= 1,实际上是Self.i:= 1,和Form2.i :=1是两码事,当调用Form2.proc时,Self就是
Form2。若不理解Self是什么意思,找些Delphi的书籍看看。
不知是否回答了你的问题?
 
To Racer: Thank u very much! I've found the cause.
In my case,Form1 & Form2 r all auto-create form, but i mistakenly initial the
p in the oncreate event of Tform1, but now form2 havn't created yet(note:
form2 create after form1), so the associated mem with form2 haven't been allocated
, thus when i ref any var member of form2, error occured.
I've an additional request-- may i make friends with u?!
;My Emai: oihome@263.net QQ:32544767
 
后退
顶部