Перейти к содержанию
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

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

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