Delphi - Создайте пользовательский компонент TToolBar - PullRequest
3 голосов
/ 07 марта 2011

Я хочу создать пользовательский элемент управления панели инструментов (потомок TToolBar), который должен иметь несколько кнопок панели инструментов по умолчанию.

Итак, я создал простой конструктор, который создает 1 кнопку по умолчанию:

constructor ZMyToolbart.Create(AOwner: TComponent);
var
  ToolButton : TToolButton;
begin
  inherited;
  Parent := Owner as TWinControl;
  ToolButton := TToolButton.Create(Self);
  ToolButton.Parent := Self;
  ToolButton.Caption := 'Hallo';
end;

Проблема в том, что после перетаскивания пользовательского элемента управления на форме кнопка панели инструментов видна, но не отображается в инспекторе объектов как часть панели инструментов.

Если попытаться назначить кнопку через свойство кнопки панели инструментов, но это не работает. Может быть, у кого-нибудь есть совет, как это можно сделать? спасибо!

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

Если вы сделаете панель инструментов владельцем кнопки инструмента, вам нужно иметь опубликованное свойство, чтобы иметь возможность устанавливать его свойства в инспекторе объектов.Это также позволит освободить его позже.Локальная переменная в вашем примере кода предполагает, что это не так.

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);
1 голос
/ 07 марта 2011

похоже, что владельцем ToolButton должна быть сама форма, а не панель инструментов. При изменении кода на следующий, панель инструментов отображается под панелью инструментов в инспекторе объектов:

constructor ZMyToolbart.Create(AOwner: TComponent);
var
  ToolButton : TToolButton;
begin
  inherited;
  Parent := Owner as TWinControl;
  ToolButton := TToolButton.Create(Self.Parent);
  ToolButton.Parent := Self;
  ToolButton.Caption := 'Hallo';
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...