2010-02-01 67 views
0

从C#背景发送我想学Delphi。 我在我的表单中遇到访问冲突,我按下了一个创建TLight实例的按钮。 无论我尝试访问我的私人FState,我都会遇到访问冲突。初始化私人变量创建AccessViolation

我错过了什么?

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. 

回答

3

你创建你的测试代码的对象,向财产状态设置?

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

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

另一件事:为什么你指定了带重载的构造函数:你从TObject派生,它没有虚拟构造函数,所以在这里不应该指定重载。关于上面这段代码

+0

啊哈,我没有初始化它在C#枚举不需要创建。我压倒一切的原因是因为我在教程中看到了这种情况;)我现在看到这是毫无意义的。 Thx – 2010-02-01 12:35:35

+2

@Ritsaert - 你其实意味着重写而不是重载;覆盖会导致应用于非虚拟方法时的语法错误;超载可以应用于任何方法,这里只是没有意义。 – kludg 2010-02-01 13:03:18

+1

>我没有初始化它,因为在C#中不需要创建枚举。 delphi枚举不需要被实例化。在C#中,您可以声明一个对象,以便它自动创建(并销毁)。令人遗憾的是,德尔福没有这个。 – 2010-02-01 13:34:50

2

一个评论:

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

“try”和“最后”(以上用于可读性大写)确保x将被释放。 正如你可能已经知道,有在Delphi中没有垃圾收集,以便释放你的对象是一个必须 ...

关于您最初的一段代码: 你创造应该是虚拟和公众。 小意见:

  1. TLightStates =(红,橙,绿) 实际上应该TLightState = (红,橙,绿)(无 “S”,因为 添加一个 “s” 通常会意味着 TLightState)
  2. 您的SetState程序理想情况下应该被保护,而不是 已发布。

心连心, kuzkot

+2

绝对没有必要将Create声明为虚构构造函数 - 这至少是毫无意义的。 – kludg 2010-02-01 13:10:47

+0

-1。不回答这个问题,并且对于代码来说过于迂腐,真的很好。请将*注释*用于与手头问题无关的事物。 (一旦你获得了更多的声望点,你将被允许发表评论。)欢迎来到Stack Overflow。 – 2010-02-01 15:47:32

+2

同意这应该是一个评论。但“过于迂腐”?我看到了一些有效的观点 - 终极试用,枚举命名约定,不会让制定者发布。 – 2010-02-01 15:53:41