Я пытаюсь написать свой собственный компонент на 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, который я создал, и переменная больше не назначается. Как я могу избежать этого?
Спасибо, ребята, заранее!