C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Свой визуальный компонент  (Прочитано 2695 раз)
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Свой визуальный компонент
« : 29 Август 2014, 20:05:15 »

Привет всем. Я создал свой компонент на основе 5-ти других. Код такой (не обращайте внимание на то, что все это хозяйство написано на FMX):
Код
//--- IconLabel.h -------------------------------------------------------------------------------------------
class PACKAGE TIconLabel : public TLayout
{
private:
TImage *FIcon;
TLabel *FCaption;
TLabel *FDescription;
TFloatAnimation *FAnimation;
 
protected:
 
public:
__fastcall TIconLabel(TComponent* Owner);
__fastcall ~TIconLabel();
 
__published:
__property TImage *Icon = {read=FIcon};
__property TLabel *Caption = {read=FCaption};
__property TLabel *Description = {read=FDescription};
__property TFloatAnimation *Animation = {read=FAnimation};
};
 
//--- IconLabel.cpp -----------------------------------------------------------------------------------------
__fastcall TIconLabel::TIconLabel(TComponent* Owner)
: TLayout(Owner)
{
FIcon = new TImage(this);
FIcon->Parent = this;
FIcon->HitTest = false;
 
FCaption = new TLabel(this);
FCaption->Parent = this;
FCaption->HitTest = false;
 
FDescription = new TLabel(this);
FDescription->Parent = this;
FDescription->HitTest = false;
 
FAnimation = new TFloatAnimation(this);
FAnimation->Parent = this;
 
HitTest = true;
}
 
 
 
__fastcall TIconLabel::~TIconLabel()
{
FIcon->Free();
FCaption->Free();
FDescription->Free();
FAnimation->Free();
}

Установил я этот компонент, положил его на форму, настроил все свои "встроенные" компоненты. Но мне понадобился еще один экземпляр. Я выделил на форме только что мной настроенный свой компонент, нажал Ctrl+C, выделил форму и нажал Ctrl+V. И получил ... как бы не совсем свой компонент. В структуре объектов я стал видеть все компоненты, которые должны были быть внутри моего компонента.

Подскажите, что я не так сделал?
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Свой визуальный компонент
« Ответ #1 : 30 Август 2014, 17:50:02 »

М-дя... Видимо то, что я делаю компонент на FMX, имеет значение...
Я попробовал сделать подобное, но только на VCL. При копировании компонента в дизайнере, он копируется как один объект, а не смесь нескольких.
Но все таки, я правильно создаю свой компонент или нет?
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Свой визуальный компонент
« Ответ #2 : 01 Сентябрь 2014, 07:54:43 »

Правильно.
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Свой визуальный компонент
« Ответ #3 : 01 Сентябрь 2014, 17:45:23 »

Спасибо за ответ, что я создаю компонент правильно. Проблему помогли решить на форуме по FMX.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Свой визуальный компонент
« Ответ #4 : 02 Сентябрь 2014, 08:32:10 »

Ииии.. решено-то как?
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Свой визуальный компонент
« Ответ #5 : 02 Сентябрь 2014, 15:20:01 »

Цитата: POV от 02 Сентябрь 2014, 08:32:10
Ииии.. решено-то как?
Ах да! Простите  
У компонентов в библиотеке FMX есть свойство Stored. Оно указывает, сохранять ли объект в ресурсы формы. Так вот его надо было установить в false. Подробнее тут http://fire-monkey.ru/topic/510-pochemu-dlia-moego-komponenta-vremenno-sozdavae/

У меня возник еще вопрос. Если создавать компонент в VCL на основе, например, TPanel и создавать в конструкторе какой то другой компонент, то нужно ли в деструкторе этот компонент удалять явно? Или же он будет автоматически удалён при удалении родителя?
« Последнее редактирование: 02 Сентябрь 2014, 15:25:23 от d7d1cd » Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Свой визуальный компонент
« Ответ #6 : 02 Сентябрь 2014, 15:20:46 »

Блаарю
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Свой визуальный компонент
« Ответ #7 : 02 Сентябрь 2014, 20:36:20 »

В результате эксперимента с приложением, динамически создающего контролы с последующим удалением родителя этих контролов, а так же диспетчером задач, выяснил: если удалить родителя компонента, то память, занятая компонентом, освобождается. Но припоминается мне, что, кажется, volvo877 на этом форуме что-то рассказывал про данную тему и там были какие-то ньюансы...

У меня чем дальше в лес, тем больше дров.  При динамическом создании компонента необходимо указать параметр конструктора. Что нужно там указать? чтобы было правильно: приложение, форму или родителя (если это не форма)?
Код
TButton *Button = new TButton( ? ); // Вместо ? надо Application, Form1 или Panel1?
Button->Parent = Panel1;
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Свой визуальный компонент
« Ответ #8 : 03 Сентябрь 2014, 07:09:23 »

Цитата: d7d1cd от 02 Сентябрь 2014, 20:36:20
У меня чем дальше в лес, тем больше дров.  При динамическом создании компонента необходимо указать параметр конструктора. Что нужно там указать? чтобы было правильно: приложение, форму или родителя (если это не форма)?
Код
TButton *Button = new TButton( ? ); // Вместо ? надо Application, Form1 или Panel1?
Button->Parent = Panel1;

Как правило, указывается форма.
Записан
d7d1cd
Участник


Сказали спасибо: +59/-24
Offline

Сообщений: 1005


Re: Свой визуальный компонент
« Ответ #9 : 03 Сентябрь 2014, 09:29:11 »

А если родителем будет не форма, а TPanel, которая так же создается динамически и в процессе работы программы будет удаляться. Тогда можно будет не удалять все созданные на ней компоненты, а просто удалить TPanel. Из разных источников я выяснил, что при удалении владельца компонентов, сами компоненты удаляются автоматически. Но тут тоже есть замечание: экспериментальным путем я установил, что память, выделенная под динамические компоненты, освобождается при удалении родителя, независимо от того, кто у компонентов владелец. Какое то несоответствие с моими источниками информации.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #10 : 03 Сентябрь 2014, 14:35:04 »

Нет, неверно. Компонент удаляется из памяти не родителем (Parent), а владельцем (Owner). Владельцем всех компонентов на форме (независимо от родителя) является сама форма (владельцем формы является Application). Поэтому этот же принцип следует использовать и при динамическом создании форм и компонентов. Если, конечно, нет желания как-то особо управлять выделением / освобождением памяти.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.054 секунд. Запросов: 19.