Перейти к содержанию
  • Регистрация
  • 0
m.medvedb

Клонирование компонента в RunTime

Вопрос

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 1

Добрый день,

 

FireMonkey вводит специальный метод TFmxObject.Clone, позволяющий выполнить копирование объекта (без внутреннего состояния) и всех его дочерних объектов путем сериализации/десериализации объекта в памяти.

 

Соответственно, чтобы получить копию объекта нужно использовать метод:

function TFmxObject.Clone(const AOwner: TComponent): TFmxObject;

У этого метода есть важные особенности:

  1. Этот метод не копирует родителя Parent у копируемого объекта.
  2. Этот метод не копирует обработчики событий.
  3. Этот метод не копирует внутреннее состояние объекта. Только если это состояние сериализуется самим объектом.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От brunnengi
      Здравствуйте.
       
      Пытаюсь создать свой компонент. Оригинал того что хочу сделать громоздкий, поэтому упростил до минимума (ибо даже минимум не работает).
      За базу нового компонента взял TLayout. В него добавил Rectangle. Хотел что бы при клике по Rectangle выходило сообщение через ShowMessage; Но реакции нету.
       
      Вот код:
      unit PayCardItemVer1Unit; interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts, FMX.Objects, System.UITypes, FMX.Graphics, FMX.Dialogs; type TPayCardItemVer1 = class(TLayout) private FRectangle1 : TRectangle; procedure rcClick(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TPayCardItemVer1]); end; { TPayCardItemVer1 } constructor TPayCardItemVer1.Create(AOwner: TComponent); begin inherited; FRectangle1 := TRectangle.Create(self); FRectangle1.Fill.Kind := TBrushKind.bkSolid; FRectangle1.Fill.Color := $FFFF78C9; FRectangle1.Align := TAlignLayout.alContents; FRectangle1.Parent := self; FRectangle1.HitTest := true; FRectangle1.OnClick := rcClick; end; destructor TPayCardItemVer1.Destroy; begin inherited; end; procedure TPayCardItemVer1.rcClick(Sender: TObject); begin ShowMessage('rc Click OK!'); end; end.  Подскажите пожалуйста, что я не так делаю.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...