Variant属性可以有默认值吗?
我写了一个组件,他有一个Variant
属性,我想为其设置一个默认值。Variant属性可以有默认值吗?
TMyComponent = class(TComponent)
private
FVariantValue : Variant;
published
property VariantValue : Variant read FVariantValue write FVariantValue default False;
end;
在编译时,我得到了VariantValue财产线以下错误:
E2026常量表达式预期
做同样的事情用Boolean
财产不会造成任何有点错误。
我读了一点documentation但我没有发现关于Variant属性默认值的任何内容。
在这里要小心。 default
指令不会执行任何操作来设置属性本身的值。它只影响值是否明确保存在.dfm
文件中。如果为属性指定default
值,则仍需确保构造函数将后备字段初始化为该值。
Properties : Storage Specifiers
当保存组件的状态,组件的published属性的存储说明符进行检查。如果某个属性的当前值从默认值不同(或者如果没有默认值)和存储符是真,则该属性的值被保存。否则,该属性的值不会被保存。
注意:属性值不会自动初始化为默认值。也就是说,仅当属性值被保存到表单文件时,缺省指令控制,而不是新创建的实例上的属性的初始值。
这仅仅是一个暗示,组件流系统,它并不需要在.dfm
明确存储该值 - 您的合同的组成部分,是确保你真正支持字段初始化到该值。适当的地方做这种类型的初始化是在组件的构造:
constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FVariantValue := False;
end;
也就是说,False
是一个布尔值,而不是一个变体,所以它不能被用来作为Variant
类型的常量表达式。由于变体是复杂类型,因此不能将其表示为单个常量,因此不能具有default
属性。
每雷米,如果你想确保当后盾变种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;
变体属性不能有默认值。
你的答案是没有enogh,当你说不能最好的东西请有默认值,请尝试解释为什么,这是有道理的。 – Sami
因为设计师做出了这个决定。我不能说为什么。只有他们可以。 –
做的是建立
FVariantValue := false;
在构造
或procedure AfterConstruction; override;
对于DFM流的目的,如果你不想在Variant包含一个False值时将属性存储在DFM中,你可以使用'stored'说明符而不是'default'说明符,其中'stored'是指转换为无参数方法,如果Variant包含False值则返回False,否则返回True。 –
@RemyLebeau非常聪明 - 不确定这是OP实际需要的,但我已经更新了这个例子。 –