Delphi 使用自定义TToolbar组件防止将TToolbutton流式传输到DFM

Delphi 使用自定义TToolbar组件防止将TToolbutton流式传输到DFM,delphi,components,Delphi,Components,我正在尝试创建一个自定义的TToolbar组件,它显示与当前任务相关的按钮 然而,我发现在设计时添加到组件的按钮存储在DFM中。我不希望按钮被存储(或在设计时可访问),因为我希望动态创建它们 (我意识到,如果csDesigning未处于ComponentState,只需添加按钮就可以防止这种情况发生,但我希望显示工具栏的设计时预览) 以下是组件代码: type TTestToolbar = class(TToolbar) private fTestButton1: TToolBu

我正在尝试创建一个自定义的TToolbar组件,它显示与当前任务相关的按钮

然而,我发现在设计时添加到组件的按钮存储在DFM中。我不希望按钮被存储(或在设计时可访问),因为我希望动态创建它们

(我意识到,如果csDesigning未处于ComponentState,只需添加按钮就可以防止这种情况发生,但我希望显示工具栏的设计时预览)

以下是组件代码:

type
  TTestToolbar = class(TToolbar)
  private
    fTestButton1: TToolButton;
    fTestButton2: TToolButton;
    fTestButton3: TToolButton;
    fTestButton4: TToolButton;

  protected
    procedure SetParent(AParent: TWinControl); override;

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    procedure InitializeButtons();
  published
  end;


constructor TTestToolbar.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TTestToolbar.Destroy;
begin
  FreeAndNil( fTestButton1 );
  FreeAndNil( fTestButton2 );
  FreeAndNil( fTestButton3 );
  FreeAndNil( fTestButton4 );

  inherited;
end;

procedure TTestToolbar.SetParent(AParent: TWinControl);
var
  changed: Boolean;
begin
  changed := AParent <> Parent;

  inherited;

  if changed then
    InitializeButtons();
end;

procedure TTestToolbar.InitializeButtons();
begin
  if Parent = nil then
    exit;  

  FreeAndNil( fTestButton1 );
  FreeAndNil( fTestButton2 );
  FreeAndNil( fTestButton3 );
  FreeAndNil( fTestButton4 );

  fTestButton1 := TToolButton.Create(Self);
  fTestButton1.Parent     := Self;
  fTestButton1.Caption     := 'Btn 1';
  fTestButton1.Hint     := 'Btn 1';

  fTestButton2 := TToolButton.Create(Self);
  fTestButton2.Parent     := Self;
  fTestButton2.Caption     := 'Btn 2';
  fTestButton2.Hint     := 'Btn 2';

  fTestButton3 := TToolButton.Create(Self);
  fTestButton3.Parent     := Self;
  fTestButton3.Caption     := 'Btn 3';
  fTestButton3.Hint     := 'Btn 3';

  fTestButton4 := TToolButton.Create(Self);
  fTestButton4.Parent     := Self;
  fTestButton4.Caption     := 'Btn 4';
  fTestButton4.Hint     := 'Btn 4';
end;

您可以覆盖
TTestoolbar
中的
GetChildren
,以排除内部创建的按钮(
fTestButton1
,…,
fTestButton4
)。根据实现情况,这些按钮将显示在外部创建的按钮之前。当用户在表单设计器中混淆了内部和外部按钮时,您应该处理这种情况。谢谢Peter。这就是解决办法!
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 411
  ClientWidth = 852
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object TestToolbar1: TTestToolbar
    Left = 0
    Top = 0
    Width = 852
    Height = 29
    Caption = 'TestToolbar1'
    TabOrder = 0
    object TToolButton
      Left = 0
      Top = 0
      Hint = 'Btn 4'
      Caption = 'Btn 4'
    end
    object TToolButton
      Left = 23
      Top = 0
      Hint = 'Btn 3'
      Caption = 'Btn 3'
    end
    object TToolButton
      Left = 46
      Top = 0
      Hint = 'Btn 2'
      Caption = 'Btn 2'
    end
    object TToolButton
      Left = 69
      Top = 0
      Hint = 'Btn 1'
      Caption = 'Btn 1'
    end
  end
end