布尔值设置为true的类默认属性在运行时给出false

Jus*_*tMe 8 delphi delphi-2010

我有一个带布尔属性的简单组件类:

  TmyClass = class(TComponent)
    private
      fSomeProperty: boolean;
    published
      property SomeProperty: boolean 
                  read fSomeProperty 
                  write fSomeProperty
                  default true;

  end;
Run Code Online (Sandbox Code Playgroud)

我把它放在我的表单上,将其设置为true(SomeProperty设置为false,为什么?),但是当我尝试从运行时访问SomeProperty时它会给我错误.为什么会这样?

ain*_*ain 15

那是因为说明default符实际上没有将值赋给属性,它只是向流系统说明哪个值是默认值(因此不需要保存).您仍然需要将构造函数中的prop/field初始化为所需的默认值.这在btw 的帮助中有记载,请阅读" 存储说明符 "部分

  • 正如@ain所说,请阅读帮助或DocWiki的存储说明符部分.这说:`注意:属性值不会自动初始化为默认值.也就是说,默认指令仅在属性值保存到表单文件时控制,而不是在新创建的实例上保存属性的初始值. (2认同)
  • 所以要修复它,添加构造函数代码`FSomeProperty:= true` (2认同)

klu*_*udg 6

您还应该在构造函数中将该属性设置为True - 否则它是一个错误:

constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited;
  FSomeProperty:= True;
  ...
end;
Run Code Online (Sandbox Code Playgroud)

默认值确定将存储在*.DFM文件中的内容.如果设置FSomePropertyTrue设计时,默认值为FSomePropertyis True,则FSomeProperty不会存储在*.DFM中.

如果未在构造函数中初始化FSomeProperty,则会出现True您所描述的错误 - 在运行时FSomeProperty出现False,尽管它是True在设计时设置的.