我想创建一个名为TMyDropDownButton
的TSpeedButton
后代,并带有一个TButtonGroup
字段。当我推TSpeedButton
时,TButtonGroup
应该出现在正确的位置(由于这里列出了一些其他属性值)。
这个TButtonGroup
属性应该是只读的(程序在调用inherited
构造函数之前在Create()
构造函数中创建它),并且应该被发布(将设计时的值保存到DFM中)。
但是,当我将TMyDropDownButton
示例放置到表单上时,默认情况下TButtonGroup
属性是未设置的。当我将写访问器添加到TButtonGroup
属性时,我可以链接删除的TButtonGroup
,但我不使用t want this. I want the
TButtonGroup property to be linked to the
TButtonGroup instance 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.
1条答案
按热度按时间t40tm48m1#
TButtonGroup
是TComponent
的后代,所以为了让你的组件将它用作Object Inspector中的嵌套属性,你必须调用它的SetSubComponent()
方法,例如:否则,对象检查器将期望您将属性链接到外部组件,正如您已经发现的那样。
此外,您不能从组件的构造函数内部将
TButtonGroup.Parent
属性设置为组件的Parent
属性,因为此时尚未分配组件的Parent
。如果您需要
TButtonGroup
使用分配给您的组件的相同Parent
,则必须覆盖组件的虚拟SetParent()
方法,例如: