Перейти к содержанию
Fire Monkey от А до Я
  • 0

Какое назначение у свойства TFmxObject.Stored?


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
  • Администраторы
Опубликовано

Добрый день,

 

Код работает корректно. ShowMessage появляется, когда я нажимаю на контрол мышкой.

 

Вопрос: Вам нужно, чтобы ShowMessage появлялся в DesignTime или только в RunTime?

  • 0
Опубликовано

Ярослав здравствуйте.

Я только начал осваивать создание своих компонентов.

До этого не заморачивался и делал нужные элементы интерфейса в run-time прям во врем программы.

Но в этот раз решил сделать "по-христиански" и создать как компонент.

Я вроде делал. И в какой то момент времени все заработало. Потом я добавил в published свойство для указания цвета для Rectangle.

Сделал build, install. Компонет проверил и вроде заработало.

Потом начал добавлять еще один rectangle и с тех пор все вот так вот, не пашет и все.

Это я просто делюсь с вами своими эмоциями.))

 

Мне надо что бы событие было в Run-Time.

На форме FireMonkey мне посоветовали добавить

FRectangle.Stored := False; 

 

Я если так сделать, то работает.

Но я не до конца понимаю что это за "уловка" такая. Что несет с собой Stored?

  • 0
  • Администраторы
Опубликовано

Назначение свойства Stored

Stored - нужно, чтобы указать нужно ли сохранять созданный объект в ресурсы формы или нет. Например, стилевые объекты не должны сериализоваться и сохраняться в ресурсы формы поскольку стиль загружается динамически в рантайме. И если он сериализуется в дизайн тайме, то в рантайме будет двойная загрузка стиля. Первый раз из ресурсов, второй раз уже динамически механизмом стилизации. Что как вы понимаете не верно. Поэтому у таких объектов, создаваемых в рантайме Stored устанавливается в False.

 

Это свойство никак не влияет на работу обработки событий мыши. Без stored все должно работать корректно. 

 

В чем ошибка?

Однако у вас есть ошибка, которая к этому поведению и привела и связана с неиспользованием свойства Stored.

  1. Первый раз, когда вы бросаете компонент на форму, он создает в дизайн тайме прямоугольник и привязывает его к вашему контролу. Все бы ничего, но когда вы сохраняете форму, ваш прямоугольник сериализуется в ресурсы формы.
  2. Затем идет запуск программы. Вначале отрабатывает конструктор вашего компонента и он, естественно, создает прямоугольник в рантайме. Но затем идет чтение еще одного прямоугольника, который читается и располагается поверх созданного контролом прямоугольника. Но в отличии от первого он уже не имеет заданного обработчика.
  3. В итоге в рантайме, созданный прямоугольник располагается внизу. А затем он перекрывается аналогичными прямоугольниками, созданными из ресурсов формы.

Вот и весь секрет

  • 0
Опубликовано

Переделал. Вроде работает. 

Спасибо большое за помощь и за разъяснение!  

Не скажу что я понял все на 100%, но на 80-87% усвоил.

Большее понимание придет наверное с практикой/опытом.)))

Еще раз спасибо! 

  • 0
  • Администраторы
Опубликовано

Не за что.

 

Чтобы легче было понимать, нужно разобраться со следующими основополагающими темами по созданию компонентов:

  1. Сериализация/Десериализация компонентов в DesingTime.
  2. Назначение Design Time и Run Time
  3. В чем отличие работы контролов в Design Time и RunTime

Вроде этих тем должно быть достаточно...

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...