2017-04-13 153 views
5

我写了一个组件,他有一个Variant属性,我想为其设置一个默认值。Variant属性可以有默认值吗?

TMyComponent = class(TComponent) 
private 
    FVariantValue : Variant; 
published 
    property VariantValue : Variant read FVariantValue write FVariantValue default False; 
end; 

在编译时,我得到了VariantValue财产线以下错误:

E2026常量表达式预期

做同样的事情用Boolean财产不会造成任何有点错误。

我读了一点documentation但我没有发现关于Variant属性默认值的任何内容。

回答

9

在这里要小心。 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; 
+4

对于DFM流的目的,如果你不想在Variant包含一个False值时将属性存储在DFM中,你可以使用'stored'说明符而不是'default'说明符,其中'stored'是指转换为无参数方法,如果Variant包含False值则返回False,否则返回True。 –

+0

@RemyLebeau非常聪明 - 不确定这是OP实际需要的,但我已经更新了这个例子。 –

4

变体属性不能有默认值。

+3

你的答案是没有enogh,当你说不能最好的东西请有默认值,请尝试解释为什么,这是有道理的。 – Sami

+2

因为设计师做出了这个决定。我不能说为什么。只有他们可以。 –

1

做的是建立

FVariantValue := false; 
在构造

procedure AfterConstruction; override;

相关问题