编译本单元时:
unit Test;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
class var StartDate, EndDate: TDateTime; // Line 12
fTest: TNotifyEvent;
public
property OnTest: TNotifyEvent read fTest; // Line 15.
end;
implementation
{$R *.dfm}
end.
我收到以下编译错误:
[DCC错误] Test.pas(15):E2356属性访问器必须是实例字段或方法
但是,如果我在第12行发表评论,它就会编好。有人可以解释原因吗?我需要将日期作为类变量来存储日期间隔。
答案 0 :(得分:8)
该错误应该是不言自明的。让我们试着去构建它。
属性访问器必须是实例字段或方法。
属性访问者是read
之后的表达式。如果您的属性是可写的,那么write
后面的表达式也将是属性访问者。
因此,在您的代码中,属性访问者为fTest
。
实例字段是该类的普通字段。因此,类字段不符合条件。类似地,实例方法是类的普通方法。类方法不是实例方法。实际上,任何不是类方法的方法都是实例方法。
因此,错误表明fTest
不是实例字段。
这是正确的。这是一个班级领域。
private
class var StartDate, EndDate: TDateTime;
fTest: TNotifyEvent; // class var applies to fTest also
我猜你并不是说fTest
是一个类字段。你需要写这样的类:
TForm1 = class(TForm)
private
class var StartDate, EndDate: TDateTime;
private
fTest: TNotifyEvent;
public
property OnTest: TNotifyEvent read fTest;
end;
或者也许:
TForm1 = class(TForm)
private
class var
StartDate, EndDate: TDateTime;
var
fTest: TNotifyEvent;
public
property OnTest: TNotifyEvent read fTest;
end;
我赞成前者,因为它在类和实例字段之间给出了更明确的区别。
答案 1 :(得分:2)
class var
扩展到fTest
字段,使其成为一个类字段。要避免在var
之前放置一个简单的fTest
。