Если вы сделаете панель инструментов владельцем кнопки инструмента, вам нужно иметь опубликованное свойство, чтобы иметь возможность устанавливать его свойства в инспекторе объектов.Это также позволит освободить его позже.Локальная переменная в вашем примере кода предполагает, что это не так.
type
ZMyToolbart = class(TToolbar)
private
FHalloButton: TToolButton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property HalloButton: TToolButton read FHalloButton write FHalloButton;
end;
constructor ZMyToolbart.Create(AOwner: TComponent);
begin
inherited;
Parent := Owner as TWinControl;
FHalloButton := TToolButton.Create(Self);
FHalloButton.Parent := Self;
FHalloButton.Caption := 'Hallo';
end;
destructor ZMyToolbart.Destroy;
begin
FHalloButton.Free;
inherited;
end;
Это, вероятно, не даст вам того, что вы хотите, вы увидите свойства кнопки в дополнительном свойстве в OI, а не как другие кнопки.Если вы хотите, чтобы ваша кнопка отображалась как обычные кнопки инструментов, сделайте ее владельцем форму, а не панель инструментов.
Тогда кнопка будет выбираться сама по себе.Это также означает, что кнопка может быть удалена во время разработки (а также во время выполнения), следовательно, вы захотите получить уведомление об удалении и установить для нее ссылку на ноль.
Наконец, вы хотите создать кнопку только во время разработки, поскольку во время выполнения кнопка будет создана в потоковом режиме из файла .dfm, и тогда у вас будет две кнопки.
И не забудьте зарегистрировать класс кнопки:
type
ZMyToolbart = class(TToolbar)
private
FHalloButton: TToolButton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
[...]
constructor ZMyToolbart.Create(AOwner: TComponent);
begin
inherited;
Parent := Owner as TWinControl;
if Assigned(FHalloButton) then
Exit;
if csDesigning in ComponentState then begin
FHalloButton := TToolButton.Create(Parent);
FHalloButton.Parent := Self;
FHalloButton.FreeNotification(Self);
FHalloButton.Caption := 'Hallo';
end;
end;
destructor ZMyToolbart.Destroy;
begin
FHalloButton.Free;
inherited;
end;
procedure ZMyToolbart.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (AComponent = FHalloButton) and (Operation = opRemove) then
FHalloButton := nil;
end;
initialization
RegisterClass(TToolButton);