【发布时间】:2014-03-24 15:34:24
【问题描述】:
我正在编写一个包含许多属性的组件,这些属性将出现在 Delphi IDE 对象检查器中(已发布的属性)...
type
TMyComponent = class(TComponent)
private
FMyProperty: String;
published
property MyProperty: String read FMyProperty write SetMyProperty default 'Something';
end;
但是,它不允许我将默认值应用于字符串属性...
[DCC Error] MyUnit.pas(278): E2146 Default values must be of ordinal, pointer or small set type
所有其他属性默认值都可以正常工作(整数、枚举等)。
我的目标是 A) 如果字符串属性是默认值,则不将其保存到 DFM,并且 B) 如果不是默认值,则将 Object Inspector 中的值显示为 Bold,并且如果是常规的。该组件有 130 多个属性,其中大约 50 个是字符串属性,其中一些具有相当大的默认值。
为什么不允许我用默认值声明字符串属性?这是 Delphi 的一个缺点,还是无法默认字符串的技术原因?
编辑
如果您真的想知道我在做什么,我将封装 Inno Setup 并将功能包装到一个具有扩展属性/集合编辑器的组件中。本主题仅与 Setup 部分有关,它实际上包含 100 多个属性。这些属性中只有大约 20 个预计会实际用于简单实现,因此我不希望所有其余的字符串属性都增大 DFM 的大小(如果它们设置为默认值)。根据组件的设置方式,它会生成一个 Inno Setup 脚本文件。
【问题讨论】:
-
呃,因为编译器不支持?
-
@TLama 我看到了,但为什么呢?字符串这么常见,为什么编译器会跳过
string这样的常见类型? -
这个问题只针对编译器设计者。就我个人而言,从我的角度来看,我没有看到任何阻碍实现所有类型的东西。以类似的方式,您可以问,为什么
default说明符给出的值不用于初始化属性值。 -
@TLama 我正在初始化构造函数中的所有默认值(超过 100 个属性)。不过这与问题无关,所以我没有包括在内。
-
但回到你的问题。只需创建一个
stored指令方法,当属性字段等于默认值时,该方法将返回 False。 ...正如雷米在他的回答中显示的那样...
标签: delphi properties components default-value