初始化私人变量创建AccessViolation
从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.
你创建你的测试代码的对象,向财产状态设置?
var
x: TLight;
begin
x := TLight.Create;
x.Light := Orange;
x.Free;
end;
看着代码,这应该可以正常工作。
另一件事:为什么你指定了带重载的构造函数:你从TObject派生,它没有虚拟构造函数,所以在这里不应该指定重载。关于上面这段代码
一个评论:
var
x: TLight;
begin
x := TLight.Create;
TRY
x.Light := Orange;
FINALLY
x.Free;
END;
end;
“try”和“最后”(以上用于可读性大写)确保x将被释放。 正如你可能已经知道,有在Delphi中没有垃圾收集,以便释放你的对象是一个必须 ...
关于您最初的一段代码: 你创造应该是虚拟和公众。 小意见:
- TLightStates =(红,橙,绿) 实际上应该TLightState = (红,橙,绿)(无 “S”,因为 添加一个 “s” 通常会意味着 TLightState)
- 您的SetState程序理想情况下应该被保护,而不是 已发布。
心连心, kuzkot
绝对没有必要将Create声明为虚构构造函数 - 这至少是毫无意义的。 – kludg 2010-02-01 13:10:47
-1。不回答这个问题,并且对于代码来说过于迂腐,真的很好。请将*注释*用于与手头问题无关的事物。 (一旦你获得了更多的声望点,你将被允许发表评论。)欢迎来到Stack Overflow。 – 2010-02-01 15:47:32
同意这应该是一个评论。但“过于迂腐”?我看到了一些有效的观点 - 终极试用,枚举命名约定,不会让制定者发布。 – 2010-02-01 15:53:41
啊哈,我没有初始化它在C#枚举不需要创建。我压倒一切的原因是因为我在教程中看到了这种情况;)我现在看到这是毫无意义的。 Thx – 2010-02-01 12:35:35
@Ritsaert - 你其实意味着重写而不是重载;覆盖会导致应用于非虚拟方法时的语法错误;超载可以应用于任何方法,这里只是没有意义。 – kludg 2010-02-01 13:03:18
>我没有初始化它,因为在C#中不需要创建枚举。 delphi枚举不需要被实例化。在C#中,您可以声明一个对象,以便它自动创建(并销毁)。令人遗憾的是,德尔福没有这个。 – 2010-02-01 13:34:50