【问题标题】:Set Default Integer value of firemonkey component设置firemonkey组件的默认整数值
【发布时间】:2012-08-27 23:13:15
【问题描述】:

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

【问题讨论】:

  • default 属性关键字实际上并不设置字段值。这就是你必须在构造函数中自己做的事情。
  • @Vikas 我认为您的问题已得到解答。请阅读:meta.stackexchange.com/questions/5234
  • constructor方法中设置默认值。

标签: delphi custom-component firemonkey


【解决方案1】:

如果我没记错的话,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;

【讨论】:

    【解决方案2】:

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

    documentation 是这样说的:

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

    ...

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2013-07-11
      • 2021-11-22
      • 1970-01-01
      • 2021-05-21
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多