如何创建一个带有 Vcl.ButtonGroup.TButtonGroup 类型的 Published 字段的 VCL 控件

问题描述 投票:0回答:1

我想创建一个名为

TSpeedButton
TMyDropDownButton
后代,它有一个
TButtonGroup
字段。当我按下
TSpeedButton
时,
TButtonGroup
应该出现在正确的位置(由于这里有一些其他属性值)。

这个

TButtonGroup
属性应该是只读的(程序在调用
Create()
构造函数之前在
inherited
构造函数中创建它),并且应该被发布(将设计时值保存到 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.
delphi properties vcl
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.