Как создать Delphi компонент, внутри которого есть другой компонент - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь написать свой собственный компонент на Delphi, но я застрял с чем-то. Я не уверен, как контролировать создание объектов внутри компонента и убедиться, что это происходит только один раз во время разработки и один раз во время выполнения. Чтобы проиллюстрировать мою проблему, я создал очень простой компонент с новой кнопкой TUQButton, который создает другой компонент (TLabel) и назначает его переменной FNewLabel при создании:

unit UQButton;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TUQButton = class(TButton)
  private
    FNewLabel : TLabel;
  published
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MYPROJECT', [TUQButton]);
end;

{ TUQButton }

constructor TUQButton.Create(AOwner: TComponent);
begin
  inherited;
  if not Assigned(FNewLabel) then
  begin
    FNewLabel := TLabel.Create(Self);
    FNewLabel.Parent := Self;
    FNewLabel.Position.X := Self.Position.X + Self.Width + 10;
    FNewLabel.Position.Y := Self.Position.Y;
    FNewLabel.Text := 'Hello World 1';
  end;
end;

destructor TUQButton.Destroy;
begin
  if Assigned(FNewLabel) then FreeAndNil(FNewLabel);
  inherited;
end;

end.

Моя проблема заключается в том, что во время разработки кажется создать новый экземпляр, когда я переключаюсь с кода на вкладку «Дизайн», и больше экземпляров, когда я открываю / закрываю проект. Таким образом, в одно мгновение я мог иметь 10 ярлыков, плавающих вокруг. Очевидно, я делаю это неправильно. я попытался управлять созданием объекта, проверив DesignState, но бывают ситуации, когда он не работает, и он по-прежнему создает новые случайные копии объекта TLabel:

if (FNewLabel <> nil) and not (csLoading in ComponentState) then
begin
  //create object
end;

У меня есть теория, что я могу создавать подобъекты, когда компонент сбрасывается на форма, но я не уверен, что это правильный подход:

procedure TMyComponent.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opInsert) and (csDesigning in ComponentState) then 
  begin
    //AComponent was dropped on the form
  end;
end;

другой вопрос, если я снова открою проект, проект, кажется, забыл о FNewLabel, который я создал, и переменная больше не назначается. Как я могу избежать этого?

Спасибо, ребята, заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...