我有一个具有从基类派生的
FileName
属性的组件。基类在 FileName
上设置 .Create
。如果属性为空,组件不会覆盖基类值。如果我将它设置为空白以外的值,它会覆盖基类值。
单步执行并在设置属性的
FileName
属性上设置断点我注意到断点只有在我设置一个值时才会命中,如果我将其留空则不会命中。
这是否意味着在 Delphi/C++Builder 内部只保存/存储非空白/空字符串的属性,以便在加载属性时没有可用的属性?
有什么东西可以控制吗?
TIA!!
这是否意味着在 Delphi/C++Builder 内部只保存/存储非空白/空字符串的属性,以便在加载属性时没有可用的属性?
说的对。根据 Properties: Storage Specifiers 文档:
如果一个属性没有 stored 指令,它被视为 stored True 被指定。
...
要覆盖继承的 default 值而不指定新值,请使用 nodefault 指令。 default 和 nodefault 指令仅支持序数类型和集合类型,前提是集合的基类型的上限和下限的序数值介于 0 和 31 之间;如果声明这样的属性时没有使用 default 或 nodefault,则它被视为指定了 nodefault。对于实数、指针和字符串,分别有一个隐式默认值 0、nil 和 ''(空字符串)。
...
保存组件状态时,检查组件发布属性的存储说明符。如果一个属性的当前值不同于它的 default 值(或者如果没有 default 值)并且 stored 说明符是 True,那么属性的值被保存。否则,属性的值不会被保存。
注意: 属性值不会自动初始化为默认值。也就是说,默认指令只控制属性值何时保存到表单文件,而不是新创建的实例上的属性初始值。
换句话说,字符串属性的默认值为空字符串,如果该属性的当前值为空,或者其
stored
指令的计算结果为 False
,则该属性不会保存到 DFM。