Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Очередной вопрос о создании компонентов в run-time [D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


Дмитрий К.К. ©   (2002-11-26 08:16:00) 

Приветствую всех!
Правильно ли я понимаю суть вещей?
Если при создании компонента я указываю Owner"ом nil, то потом в OnDestroy формы я должен САМ удалить сей компонент? А если я указываю в качестве владельца Self, то меня потом не должно заботить уничтожение компонента - за меня енто уже сделают?


Дмитрий К.К.   (2002-11-27 09:11:00) [1]

Спасибо. Грамотно, понятно, доступно.


Юрий Зотов   (2002-11-27 08:44:00) [2]

Это делается, когда нужно обеспечить существование компонента в течение всего времени работы программы, а не какой-то из ее форм (поскольку формы обычно создаются динамически - кроме главной, конечно). То есть, когда нужен эдакий глобальный компонент (часто это бывает модуль даных). Того же самого можно добиться, сделав владельцем компонента главную форму программы (а вот у самой главной формы владельцем может быть только Application).

Другая причина - иногда в момент создания компонента неизвестно, а существуют ли уже в программе другие компоненты, или они еще не созданы. И тогда его владельцем такого компонента (если он нужен) тоже можно сделать Application (поскольку Application заведомо существует всегда).

А так никаких преимуществ нет. Все это диктуется только логикой работы программы.


Дмитрий К.К.   (2002-11-27 08:30:00) [3]

А можно еще один вопрос?
С Create(nil) разобрались, с Create(Self) - тоже, а зачем делать Create(Application)? Какие преимущества это дает над ситуацией, когда владельцем является форма?


Дмитрий К.К.   (2002-11-26 08:41:00) [4]

Спасибо. Ваши ответы оказались очень полезными.


Юрий Зотов   (2002-11-26 08:36:00) [5]

В том, чтобы избежать лишних операций, если реально они не нужны. Когда Owner не nil, то автоматом вызываются InsertComponent, Notification и пр. Аналогично и при удалении. Если же Owner=nil, то этого не происходит.

Обычно Owner=nil используется для временных компонентов, причем в конструкциях, гарантирующих удаление, например:

with TSomeComponent.Create(nil) do
try
...
finally
Free
end;

Если же созданный компонент нужен до самого конца работы программы (или формы), то проще действительно назначить ему Owner"а и более о нем не беспокоиться.


Song   (2002-11-26 08:36:00) [6]

Так считается более правильным со стороны правил хорошего тона программирования. Если Вы создаёте временный объект, то указывают AOwner nil.

With TStringGrid.Create(nil) Do
try
Parent:=Self;
Hide;
// что-то делаем
finally
Free;
end;

Для системы фиолетово, какой в конечном случае будет AOwner. Но если временных оьбъектов много, и они не будут удаляться, тогда будет понапрасну расходоваться память.


Дмитрий К.К.   (2002-11-26 08:23:00) [7]

Спасибо.
А в чем тогда смысл указания владельцем nil (приходится писАть лишний код, можно случайно забыть освободить объект)?


Юрий Зотов   (2002-11-26 08:20:00) [8]

Так и есть. Любой компонент (а форма - это тоже компонент) перед своим удалением сначала убивает все компоненты, которыми он владеет (т.е. для которых он Owner).


Song   (2002-11-26 08:19:00) [9]

Ты можешь его удалять (TComponent.Free) в любом случае: как и с nil, так и с Self. Но в случае с nil, ты должен сделать это обязательно перед выходом из программы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо