3

编译本单元时:

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 行,它编译得很好。有人可以解释为什么吗?我需要将日期作为类变量来存储日期间隔。

4

2 回答 2

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;

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

于 2012-11-06T17:53:11.613 回答
2

class var扩展到该字段fTest,使其成为类字段。避免了var之前那个简单的地方fTest

于 2012-11-06T18:24:15.437 回答