我们正在努力在Delphi Xe2平台上的firemonkey中创建自定义组件。我正在使用firemonkey自定义组件创建已发布的属性。我已设置默认值,如布尔值,自定义类型,但我设置默认整数值。我正在使用类TControl1 = class(TControl)。 发布时间 属性测试:整数读取FTest写入设置测试默认值10; 在组件查看器上,我的自定义组件显示0 default.Sorry表示我的英语不好。 请任何人帮助我
答案 0 :(得分:4)
如果我没记错的话,default
指令不会设置您的私人成员FTest
。您必须在组件的构造函数中初始化它,如下所示:
TControl1 = class(TControl)
private
FTest: Integer;
procedure SetTest(Value: Integer);
public
constructor Create(AOwner: TComponent); override;
published
property Test: Integer read FTest write SetTest default 10;
end;
.
.
.
constructor TControl1.Create;
begin
inherited;
FTest := 10;
end;
答案 1 :(得分:3)
指定default
属性值不会在运行时将该值赋给该属性。它所做的就是控制财产的存储方式。如果在存储属性时属性的值等于 default ,则VCL流式框架将省略该属性。
documentation这样说:
声明属性时,可以为其指定默认值。 VCL使用默认值来确定是否将属性存储在表单文件中。如果未指定属性的默认值,则VCL始终存储属性。
...
声明默认值不会将该属性设置为该值。组件的构造函数方法应在适当时初始化属性值。但是,由于对象始终将其字段初始化为0,因此构造函数不一定要将整数属性设置为0,将字符串属性设置为null,或将布尔属性设置为False。
换句话说,您必须在组件的构造函数中初始化属性,除了设置默认值。并且您有责任确保将其初始化为与default
指定的值相同的值。
我个人总是发现设计中固有的重复有点令人沮丧。设计师成功地将语言构建为违反DRY principle。您提出这个问题的事实说明了设计的弱点。指定default
值后,您会惊讶于编译器似乎忽略了您并要求您再次设置它。