初始化private var会创建AccessViolation

时间:2010-02-01 12:24:10

标签: delphi

来自C#背景我正在努力学习Delphi。 我在表单中遇到Access违规,按下创建TLight实例的按钮。 无论我在哪里尝试访问我的私人FState,我都会遇到访问冲突。

我错过了什么?

unit Light;
interface
uses sysUtils;

type
  TLightStates = (Red, Orange, Green);
type
  TLight = class
    private
      Fstate : TLightStates;
    published
      Constructor Create(); overload;
      procedure SetState(const Value: TLightStates);
      Property State : TLightStates
        read Fstate
        write SetState;
  end;

implementation
{ TLight }
    constructor TLight.Create;
    begin
      Fstate := TLightStates.Red;
    end;

    procedure TLight.SetState(const Value: TLightStates);
    begin
      Fstate := Value;
    end;
end.

2 个答案:

答案 0 :(得分:3)

您是否在测试代码中创建了一个设置了属性State的对象?

var
  x: TLight;
begin
  x := TLight.Create;
  x.Light := Orange;
  x.Free; 
end;

查看代码,这应该可以正常工作。

另一件事:你为什么用重载来指定构造函数:你从TObject派生而且它没有虚构造函数,所以不应该在这里指定重载。

答案 1 :(得分:2)

关于上述代码的一条评论:

var
  x: TLight;
begin
  x := TLight.Create;
  TRY  
    x.Light := Orange;
  FINALLY
    x.Free; 
  END;
end;

“try”和“finally”(上面使用大写字母表示可读性)确保释放x。 正如您现在所知,Delphi中没有垃圾收集,因此释放您的对象是必须 ......

关于您的初始代码: 您的创建应该是虚拟和公共的。 次要评论:

  1. TLightStates =(红色,橙色,绿色) 应该是TLightState = (红色,橙色,绿色)(自那以后没有“s” 添加“s”通常意味着a 一套TLightState)
  2. 理想情况下,您的SetState过程应该受到保护而不是 出版。
  3. HTH, kuzkot