我编写了一个具有Variant
属性的组件,我想为其设置默认值。
TMyComponent = class(TComponent)
private
FVariantValue : Variant;
published
property VariantValue : Variant read FVariantValue write FVariantValue default False;
end;
在编译时,我在VariantValue
属性行上收到以下错误:
E2026 预期常量表达式
对Boolean
属性执行相同的操作不会导致任何类型的错误。
我阅读了一些文档,但没有找到任何关于Variant
属性默认值的信息。
在这里要小心。default
指令不执行任何操作来设置属性本身的值。 它仅影响值是否显式保存在.dfm
文件中。 如果为属性指定default
值,仍必须确保构造函数将支持字段初始化为该值。
属性 : 存储说明符
保存组件的状态时,将检查组件已发布属性的存储说明符。如果属性的当前值与其默认值不同(或者没有默认值),并且存储的说明符为True,则保存属性的值。否则,不会保存属性的值。
注: 属性值不会自动初始化为默认值。也就是说,默认指令仅控制何时将属性值保存到窗体文件中,而不控制新创建的实例上属性的初始值。
这只是对组件流系统的一个提示,即它不需要将此值显式存储在.dfm
中 - 合约的部分是确保您实际将支持字段初始化为该值。执行此类初始化的适当位置是在组件的构造函数中:
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FVariantValue := False;
end;
也就是说,False
是一个布尔值,而不是变体,因此它不能用作Variant
类型的常量表达式。 由于变体是复杂类型,因此不能表示为单个常量,因此不能具有default
属性。
根据 Remy,如果要确保在False
支持变体时变体不会保存在.dfm
文件中,则可以将stored
指令与无参数方法一起使用,该方法在变体计算结果为布尔False
时返回False
。 例如:
property VariantValue : Variant read FVariantValue write FVariantValue stored IsVariantValueStored;
哪里
function TMyComponent.IsVariantValueStored : Boolean;
begin
Result := not VarIsType(FVariantValue, varBoolean);
if not Result then
Result := FVariantValue;
end;
变量属性不能具有默认值。
最好的办法是设置
FVariantValue := false;
在构造函数或procedure AfterConstruction; override;