gpt4 book ai didi

delphi - Variant 属性可以有默认值吗?

转载 作者:行者123 更新时间:2023-12-03 15:04:40 26 4
gpt4 key购买 nike

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

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

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

E2026 Constant expression expected

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

我读了一点documentation但我没有找到任何有关 Variant 属性默认值的信息。

最佳答案

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

Properties : Storage Specifiers

When saving a component's state, the storage specifiers of the component's published properties are checked. If a property's current value is different from its default value (or if there is no default value) and the stored specifier is True, then the property's value is saved. Otherwise, the property's value is not saved.

Note: Property values are not automatically initialized to the default value. That is, the default directive controls only when property values are saved to the form file, but not the initial value of the property on a newly created instance.

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

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

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

根据 Remy 的说法,如果您想确保当支持变体为 False 时变体不会保存在 .dfm 文件中,您可以使用 使用无参数方法存储的指令,当变体计算结果为 bool 值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;

关于delphi - Variant 属性可以有默认值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43394647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com