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

Почему для моего контрола при копировании компонента в Design-Time не копируется внутренняя картинка?


d7d1cd

Вопрос

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

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

Уверен, что мой вопрос элементарен. Но я первый раз пишу свой компонент, поэтому прошу строго не судить.

Ссылка на комментарий

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

  • 0

С синтаксисом плюсов я не знаком, по этому подскажу только направление, до сути доберетесь сами

__published:
__property TImage *Icon = {read=FIcon}{write=FIcon};
__property TLabel *Caption = {read=FCaption}{write=FCaption};
__property TLabel *Description = {read=FDescription}{write=FDescription};
__property TFloatAnimation *Animation = {read=FAnimation}{write=FAnimation};

или так

__published:
__property TImage *Icon = {read=FIcon,write=FIcon};
__property TLabel *Caption = {read=FCaption,write=FCaption};
__property TLabel *Description = {read=FDescription,write=FDescription};
__property TFloatAnimation *Animation = {read=FAnimation,write=FAnimation};

думаю суть вы уловили, дальше сами...

Ссылка на комментарий
  • 0

М-м-м... Код я добавил. Однако при копировании в дизайнере, содержимое моего компонента не копируется. Копируются только свойства контейнера моих компонентов (TLayout). Ткните меня носом уже :)

Ссылка на комментарий
  • 0
  • Администраторы

Не правильно написаны сеттеры. Сеттеры должны использовать метод копирования объектов Assign. А не прямое присваивание указателя полю.

Ссылка на комментарий
  • 0

Сделал вот так (пока что на примере TImage):

//--- IconLabel.h -------------------------------------------------------------------------------------------
class PACKAGE TIconLabel : public TLayout
{
private:
    TImage *FIcon;
    void __fastcall SetIcon(TImage *icn);
 __published:
    __property TImage *Icon = {read=FIcon, write=SetIcon};}; 


//--- IconLabel.cpp ---------------------------------------------------------------------------------
void __fastcall TIconLabel::SetIcon(TImage *icn)
{
FIcon->Assign(icn);}
Но желаемого эффекта я не получил. Подскажите, что я опять не так делаю?
Ссылка на комментарий
  • 0
  • Администраторы

На счет  сеттера я ошибся, не обратил внимание, что это TImage.

Ошибка в неправильном подходе создания собранного компонента. 

  1. Вы создаете в конструкторе объект TImage и добавляете его прямо к компоненту.
  2. Если вы не сбрасываете для TImage stored, то TImage будет сериализован в ресурсы формы (fmx - файл). НО при открытии формы заново, ваш компонент создаст опять новый объект TImage и + при чтении данных из ресурсов, общий механизм десериализации объектов восстановит старый TImage и в итоге вы получите два TImage
  3. Если вы говорите, что TImage не должен сохраняться в ресурсы. То при копировании объекта TImаge не будет копироваться, так как при копировании объекта в IDE по сути происходит копирование части ресурсов, относимые к этому объекту.
  4. В вашем случае нужно создать поля для хранения именно картинки TBitmap, открыть доступ к этому полю на запись и чтения. И в сеттере выполнять присваивание вашей картинки из поля TBitmap в TImage, который вы создаете динамически, но не сохраняете его в ресурсы (Stored = False)

P.S. Кстати, такая тема частично уже обсуждалась на форуме: Как добавить в свой компонент TImage и дать возможность менять картинку? посмотрите

Ссылка на комментарий
  • 0

Теперь более понятно стало. А если я буду динамически создавать свой компонент, а через некоторое время работы удалять, то при создании в какое значение я должен установить свойство Stored?

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

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