已发布的属性默认值在设计时重置
Published properties defaults reset in Design-time
我正在开发一些组件 - 自定义按钮。我安装了它,但在设计时自定义发布的属性重置为零。首先,我在谈论颜色 - 它重置为 clBlack
(或 clBtnFace
为 Color
属性)。 Caption
重置为空字符串。我的意思是,当我在设计时将组件放入窗体时,Object Inspector 中的所有自定义属性都重置为零(颜色为 clBlack
等)。我可以手动更改它,但为什么我在代码中设置的默认值不起作用?问题仅在设计时。当我在 运行 时间内创建组件时,它工作正常。这是代码(例如 Color
属性)。
基地class
TpfCustomButton = class(TCustomControl)
...
published
...
property Color;
...
end;
主要代码
TpfCustomColoredButton = class(TpfCustomButton)
...
public
constructor Create(AOwner: TComponent);
...
end;
constructor TpfCustomColoredButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Color := [=11=]E1E1E1;//Look at this: setting Color
...
end;
组件代码
TpfColoredButton = class(TpfCustomColoredButton)
published
...
property Action;
property Align;
//And some other standard properties
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('PF Components', [TpfColoredButton]);
end;
...
此外,只是为了测试我正在尝试这样的代码:
TpfColoredButton = class(TpfCustomColoredButton)
public
constructor Create(AOwner: TComponent);
...
constructor TpfColoredButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption := 'abc';
end;
并且在设计时 Caption
是空的,但同样,如果我在 运行 时创建它,我们会看到我们预期的 Caption=abc
。在 运行-time 我创建了这样的新对象(并且它工作正常):
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
pf: TpfColoredButton;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
pf := TpfColoredButton.Create(Self);
pf.Parent := Self;
end;
您正在派生的 class 构造函数中更改 属性 的默认值,但您没有在 属性 声明中指定相同的默认值来更新其 RTTI,由 Object Inspector 和 DFM 流使用。
此外,您的派生构造函数中缺少 override
。这就是为什么在设计时创建组件时您的属性没有正确初始化的原因。您的派生构造函数甚至没有被调用。而在 运行 时间,您直接调用派生的构造函数。
改变这个:
TpfCustomColoredButton = class(TpfCustomButton)
...
public
constructor Create(AOwner: TComponent);
...
end;
为此:
TpfCustomColoredButton = class(TpfCustomButton)
...
published
...
property Color default [=11=]E1E1E1;
...
public
constructor Create(AOwner: TComponent); override;
...
end;
对默认值与其基 classes 不同的派生 classes 的所有其他已发布属性执行相同操作。
我正在开发一些组件 - 自定义按钮。我安装了它,但在设计时自定义发布的属性重置为零。首先,我在谈论颜色 - 它重置为 clBlack
(或 clBtnFace
为 Color
属性)。 Caption
重置为空字符串。我的意思是,当我在设计时将组件放入窗体时,Object Inspector 中的所有自定义属性都重置为零(颜色为 clBlack
等)。我可以手动更改它,但为什么我在代码中设置的默认值不起作用?问题仅在设计时。当我在 运行 时间内创建组件时,它工作正常。这是代码(例如 Color
属性)。
基地class
TpfCustomButton = class(TCustomControl)
...
published
...
property Color;
...
end;
主要代码
TpfCustomColoredButton = class(TpfCustomButton)
...
public
constructor Create(AOwner: TComponent);
...
end;
constructor TpfCustomColoredButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Color := [=11=]E1E1E1;//Look at this: setting Color
...
end;
组件代码
TpfColoredButton = class(TpfCustomColoredButton)
published
...
property Action;
property Align;
//And some other standard properties
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('PF Components', [TpfColoredButton]);
end;
...
此外,只是为了测试我正在尝试这样的代码:
TpfColoredButton = class(TpfCustomColoredButton)
public
constructor Create(AOwner: TComponent);
...
constructor TpfColoredButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Caption := 'abc';
end;
并且在设计时 Caption
是空的,但同样,如果我在 运行 时创建它,我们会看到我们预期的 Caption=abc
。在 运行-time 我创建了这样的新对象(并且它工作正常):
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
pf: TpfColoredButton;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
pf := TpfColoredButton.Create(Self);
pf.Parent := Self;
end;
您正在派生的 class 构造函数中更改 属性 的默认值,但您没有在 属性 声明中指定相同的默认值来更新其 RTTI,由 Object Inspector 和 DFM 流使用。
此外,您的派生构造函数中缺少 override
。这就是为什么在设计时创建组件时您的属性没有正确初始化的原因。您的派生构造函数甚至没有被调用。而在 运行 时间,您直接调用派生的构造函数。
改变这个:
TpfCustomColoredButton = class(TpfCustomButton)
...
public
constructor Create(AOwner: TComponent);
...
end;
为此:
TpfCustomColoredButton = class(TpfCustomButton)
...
published
...
property Color default [=11=]E1E1E1;
...
public
constructor Create(AOwner: TComponent); override;
...
end;
对默认值与其基 classes 不同的派生 classes 的所有其他已发布属性执行相同操作。