![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Очередной вопрос о создании компонентов в 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, ты должен сделать это обязательно перед выходом из программы.