Delphi 为什么我得到E2356属性访问器必须是实例字段或方法

Delphi 为什么我得到E2356属性访问器必须是实例字段或方法,delphi,delphi-2007,Delphi,Delphi 2007,编制本单元时: 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; p

编制本单元时:

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 Error]Test.pas(15):E2356属性访问器必须是实例字段或方法


但如果我把第12行注释掉,它就可以编译了。有人能解释一下原因吗?我需要将日期作为类变量来存储日期间隔。

该错误应该是自解释的。让我们试着去构造它

属性访问器必须是实例字段或方法

属性访问器是
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;

我赞成前者,因为它在类字段和实例字段之间提供了更清晰的区分。

类变量扩展到
fTest
字段,使其成为类字段。为了避免将简单的
var
放在
fTest

之前,第二个测试表单是我编译的实际单元。原因似乎是类变量。如果知道它为什么会这样,那就太好了。好的,现在更新让一切都清楚了。我已经相应地更新了我的答案。谢谢,你知道了!它实际上隐藏了一个潜在的bug,因为我以前有一堆由类的所有实例共享的类变量。不管怎么说,它似乎能工作,但现在我做对了。是的,这里的语法很弱。将其与C#进行比较。有很多模棱两可的地方。这就是为什么我总是使用重复的私有声明来分隔类字段和实例字段。使用与函数中变量相同的格式和缩进样式来处理带有
var
class var
的类字段将有助于暴露此错误。也就是说,将
[class]var
单独放在一行上,并缩进它下面的所有内容。然后更清楚的是,
FTest
StartDate
EndDate
具有相同的分类;我们已经接受过培训,知道缩进中的差异不会从
类var
标题中释放
FTest