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

Fab*_*zio 5 delphi properties variant default-value

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

TMyComponent = class(TComponent)
private
  FVariantValue : Variant;
published
  property VariantValue : Variant read FVariantValue write FVariantValue default False;
end;
Run Code Online (Sandbox Code Playgroud)

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

E2026预期的常量表达式

VariantValue属性执行相同操作不会导致任何类型的错误.

我阅读了一些文档,但我没有发现Variant属性的默认值.

J..*_*... 9

这里要小心.该default指令不执行任何操作来设置属性本身的值.它仅影响值是否明确保存在.dfm文件中.如果default为属性指定值,则仍必须确保构造函数将支持字段初始化为该值.

属性:存储说明符

保存组件的状态时,将检查组件的已发布属性的存储说明符.如果属性的当前值与其默认值不同(或者如果没有默认值)且存储的说明符为True,则保存属性的值.否则,不保存属性的值.

注意:属性值不会自动初始化为默认值.也就是说,默认指令仅在属性值保存到表单文件时控制,而不是在新创建的实例上保存属性的初始值.

这只是组件流系统的一个提示,它不需要将此值显式存储在.dfm- 合同的一部分是确保您实际将支持字段初始化为该值.进行此类初始化的适当位置是在组件的构造函数中:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FVariantValue := False;
end;
Run Code Online (Sandbox Code Playgroud)

也就是说,它False是一个布尔值,而不是一个变体,所以它不能用作Variant类型的常量表达式.由于变体是复杂类型,因此不能将其表示为单个常量,因此不能具有default属性.

Per Remy,如果要确保变量.dfm在后备变量时未保存在文件中,则False可以使用stored带有无参数方法的指令,该方法False在变量求值为布尔值时返回False.例如 :

 property VariantValue : Variant read FVariantValue write FVariantValue stored IsVariantValueStored;
Run Code Online (Sandbox Code Playgroud)

哪里

function TMyComponent.IsVariantValueStored : Boolean;
begin
  Result := not VarIsType(FVariantValue, varBoolean);
  if not Result then
    Result := FVariantValue;
end;
Run Code Online (Sandbox Code Playgroud)

  • 出于DFM流的目的,如果您不希望在Variant包含False值时将属性存储在DFM中,则可以使用`stored`说明符而不是`default`说明符,其中`stored`指的是一个无参数的方法,如果Variant包含False值则返回False,否则返回True. (4认同)