我想创建一个名为
TSpeedButton
的 TMyDropDownButton
后代,它有一个 TButtonGroup
字段。当我按下 TSpeedButton
时,TButtonGroup
应该出现在正确的位置(由于这里有一些其他属性值)。
这个
TButtonGroup
属性应该是只读的(程序在调用 Create()
构造函数之前在 inherited
构造函数中创建它),并且应该被发布(将设计时值保存到 DFM 中)。
但是,当我将
TMyDropDownButton
实例放置到表单上时,默认情况下 TButtonGroup
属性未设置。当我向 TButtonGroup
属性添加写访问器时,我可以链接一个删除的 TButtonGroup
,但是我没有t want this. I want the
TButtonGroupproperty to be linked to the
TButtonGroupinstance created in the constructor, and preset by the
Loaded()` 方法。
我该怎么做?
这是我的尝试:
unit MyDropDownButton;
interface
uses
System.Classes
, Vcl.ButtonGroup
, Vcl.Buttons
;
type
TMyDropDownButton = class ( TSpeedButton )
private
// Fields
fButtonGroup : TButtonGroup;
protected
procedure Loaded; override;
public
constructor Create( owner_ : TComponent );
destructor Destroy; override;
published
property buttonGroup : TButtonGroup read fButtonGroup;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('myDropDownButton', [TMyDropDownButton]);
end;
procedure TMyDropDownButton.Loaded;
begin
inherited Loaded;
// I need some settings here due to venished props inrelevant for the question
end;
constructor TMyDropDownButton.Create( owner_ : TComponent );
begin
fButtonGroup := TButtonGroup.Create( self );
inherited Create( owner_ );
fButtonGroup.Parent := parent;
end;
destructor TMyDropDownButton.Destroy;
begin
// FreeAndNIL( fButtonGroup );
inherited Destroy;
end;
end.
TButtonGroup
是 TComponent
的后代,所以为了让您的组件将它用作对象检查器中的嵌套属性,您必须调用它的 SetSubComponent()
方法,例如:
constructor TMyDropDownButton.Create( owner_ : TComponent );
begin
inherited Create( owner_ );
fButtonGroup := TButtonGroup.Create( Self );
fButtonGroup.SetSubComponent( True );
...
end;
否则,正如您已经发现的那样,Object Inspector 会希望您将该属性链接到外部组件。
此外,您不能从组件的构造函数内部将
TButtonGroup.Parent
属性设置为组件的 Parent
属性,因为那时您的组件的 Parent
尚未分配。
如果您需要
TButtonGroup
使用分配给您的组件的相同 Parent
,您将必须重写组件的虚拟 SetParent()
方法,例如:
type
TMyDropDownButton = class ( TSpeedButton )
...
protected
...
procedure SetParent(AParent: TWinControl); override;
...
end;
procedure TMyDropDownButton.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
fButtonGroup.Parent := AParent;
end;