2

我们正在努力在 Delphi Xe2 平台上的 firemonkey 中创建自定义组件。我正在使用 firemonkey 自定义组件创建已发布的属性。我设置了默认值,例如布尔值、自定义类型,但我正在设置默认整数值。我正在使用类 TControl1 = 类(TControl)。Published Property Test : Integer read FTest write Set Test default 10; 在组件查看器上,我的自定义组件显示 0 默认值。抱歉我的英语不好。请任何人帮助我

4

2 回答 2

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;
于 2012-09-03T08:12:11.860 回答
3

指定default属性值不会在运行时将该值分配给属性。它所做的只是控制属性的存储方式。如果在存储该属性时该属性的值等于默认值,则 VCL 流式传输框架将忽略该属性。

文档是这样说的:

声明属性时,可以为其指定默认值。VCL 使用默认值来确定是否将属性存储在表单文件中。如果您没有为属性指定默认值,VCL 将始终存储该属性。

...

声明默认值不会将该属性设置为该值。组件的构造方法应该在适当的时候初始化属性值。但是,由于对象总是将其字段初始化为 0,因此构造函数不必将整数属性设置为 0、字符串属性设置为 null 或布尔属性设置为 False。

换句话说,除了设置默认值之外,还必须在组件的构造函数中初始化属性。您有责任确保将其初始化为与指定为default.

我个人一直发现设计中固有的重复有点令人沮丧。设计者成功地在语言中构建了违反DRY 原则的内容。您提出这个问题的事实说明了设计的弱点。指定该default值后,您会惊讶于编译器似乎忽略了您并要求您再次设置它。

于 2012-09-03T08:26:31.907 回答