Variant属性可以具有默认值吗?

时间:2017-04-13 14:15:18

标签: delphi properties default-value variant

我编写了一个具有Variant属性的组件,我想为其设置默认值。

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

在编译时,我在VariantValue属性行上收到以下错误:

  

E2026预期的常量表达式

使用Boolean属性执行相同操作不会导致任何类型的错误。

我读了一点documentation但我没有发现Variant属性的默认值。

3 个答案:

答案 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;