变量属性是否可以具有默认值?



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

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

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

E2026 预期常量表达式

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

我阅读了一些文档,但没有找到任何关于Variant属性默认值的信息。

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

属性 : 存储说明符

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

: 属性值不会自动初始化为默认值。也就是说,默认指令仅控制何时将属性值保存到窗体文件中,而不控制新创建的实例上属性的初始值。

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

constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FVariantValue := False;
end;

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

根据 Remy,如果要确保在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;

变量属性不能具有默认值。

最好的办法是设置

FVariantValue := false;

在构造函数或procedure AfterConstruction; override;

最新更新