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属性的默认值.
这里要小心.该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)