普通方法与对象中的方法的区别(100分)

  • 主题发起人 主题发起人 siking
  • 开始时间 开始时间
S

siking

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.DoTimer(Sender:TObject);//可以
begin
Form1.Caption:=FormatDateTIme('yyyy-mm-dd hh:mm:ss',now);
end;
procedure DoTimer(Sender:TObject);//有错
begin
Form1.Caption:=FormatDateTIme('yyyy-mm-dd hh:mm:ss',now);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
timer1:TTimer;
begin
timer1:=TTimer.Create(nil);
timer1.Interval:=1000;
timer1.OnTimer:=DoTimer;//如果DoTimer是普通函数就编译出错,如果DoTimer是对象中的方法就没问题
timer1.Enabled:=true;
end;
 
什么错误信息?
还有,你声明了没有?
 
timer1.OnTimer中的声明是对象中的方法声明,你传普通方法函数当然出错。普通方法函数和对象方法函数参数个数在表面上看是一样的,但真正的却是不一样的。普通方法函数参数个数你定义多少个参数就有多少个参数个数,而对象方法函数除了你定义的参数个数外,还带有一个隐藏的self对象参数在其中。所以,就算你勉强将普通方法传给Timer的对象方法,在Timer中调用时也会出现参数不符而出错。
 
报的错误是:
Incompatible types: 'method pointer and regular procedure'
是不是一般函数不能赋值给类中的函数?
 
不知道是不是下面的情况
一般函数只是普通的指针地址,在32位的windows操作系统中是一个32位的指针地址,占据了四个字节,而类中的方法则同时包含了方法的指针以及类指针地址,在32位的windows操作系统中占据了八个字节。----摘自<深入核心——VCL架构剖析>
 
不是不能将一般函数赋值给类中的函数,而是要看变量的类型类型定义来看。Timer的OnTimer类型变量是一个类方法指针定义而不是普通函数方法指针定义,当然不能将一般函数赋值给这个OnTimer变量了。
 
普通函数指针和类方法指针都是32位的指针地址。只是普通函数和类方法函数的调用方式是不同的,以类方法调用普通函数是会出现有内存不能读的错误。所以不能将普通函数指针传给类方法函数变量。
 
接受答案了.
 
后退
顶部