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

时间:2012-11-06 17:16:41

标签: 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;
  public
    property OnTest: TNotifyEvent read fTest;  // Line 15.
  end;

implementation

{$R *.dfm}

end.

我收到以下编译错误:

  

[DCC错误] Test.pas(15):E2356属性访问器必须是实例字段或方法

但是,如果我在第12行发表评论,它就会编好。有人可以解释原因吗?我需要将日期作为类变量来存储日期间隔。

2 个答案:

答案 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