我编写了一个具有Variant
属性的组件,我想为其设置默认值。
TMyComponent = class(TComponent)
private
FVariantValue : Variant;
published
property VariantValue : Variant read FVariantValue write FVariantValue default False;
end;
在编译时,我在VariantValue属性行上收到以下错误:
E2026预期的常量表达式
使用Boolean
属性执行相同操作不会导致任何类型的错误。
我读了一点documentation但我没有发现Variant属性的默认值。
答案 0 :(得分:9)
这里要小心。 default
指令不会设置属性本身的值。它仅影响值是否显式保存在.dfm
文件中。如果为属性指定default
值,则仍必须确保构造函数将支持字段初始化为该值。
Properties : Storage Specifiers
保存组件的状态时,将检查组件已发布属性的存储说明符。如果属性的当前值与其默认值不同(或者如果没有默认值)且存储的说明符为 True ,然后保存属性的值。否则,不会保存属性的值。
注意:属性值不会自动初始化为默认值。也就是说,默认指令仅在属性值保存到表单文件时控制,而不是在新创建的实例上保存属性的初始值。
这只是组件流系统的一个提示,它不需要在.dfm
中明确地存储该值 - 您的合同部分是为了确保您实际上将支持字段初始化为该值。进行此类初始化的适当位置在组件的构造函数中:
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FVariantValue := False;
end;
也就是说,False
是一个布尔值,而不是一个变体,所以它不能用作Variant
类型的常量表达式。由于变体是复杂类型,因此不能表示为单个常量,因此不能具有default
属性。
Per Remy,如果要确保在后备变体为.dfm
时变量未保存在False
文件中,则可以使用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;
答案 1 :(得分:4)
变体属性不能具有默认值。
答案 2 :(得分:1)
最好的办法是设置
FVariantValue := false;
构造函数中的或procedure AfterConstruction; override;