Форум: "Основная";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
ВнизОчередной вопрос о создании компонентов в run-time Найти похожие ветки
← →
Дмитрий К.К. (2002-11-26 08:16) [0]Приветствую всех!
Правильно ли я понимаю суть вещей?
Если при создании компонента я указываю Owner"ом nil, то потом в OnDestroy формы я должен САМ удалить сей компонент? А если я указываю в качестве владельца Self, то меня потом не должно заботить уничтожение компонента - за меня енто уже сделают?
← →
Song (2002-11-26 08:19) [1]Ты можешь его удалять (TComponent.Free) в любом случае: как и с nil, так и с Self. Но в случае с nil, ты должен сделать это обязательно перед выходом из программы.
← →
Юрий Зотов (2002-11-26 08:20) [2]Так и есть. Любой компонент (а форма - это тоже компонент) перед своим удалением сначала убивает все компоненты, которыми он владеет (т.е. для которых он Owner).
← →
Дмитрий К.К. (2002-11-26 08:23) [3]Спасибо.
А в чем тогда смысл указания владельцем nil (приходится писАть лишний код, можно случайно забыть освободить объект)?
← →
Юрий Зотов (2002-11-26 08:36) [4]В том, чтобы избежать лишних операций, если реально они не нужны. Когда Owner не nil, то автоматом вызываются InsertComponent, Notification и пр. Аналогично и при удалении. Если же Owner=nil, то этого не происходит.
Обычно Owner=nil используется для временных компонентов, причем в конструкциях, гарантирующих удаление, например:
with TSomeComponent.Create(nil) do
try
...
finally
Free
end;
Если же созданный компонент нужен до самого конца работы программы (или формы), то проще действительно назначить ему Owner"а и более о нем не беспокоиться.
← →
Song (2002-11-26 08:36) [5]Так считается более правильным со стороны правил хорошего тона программирования. Если Вы создаёте временный объект, то указывают AOwner nil.
With TStringGrid.Create(nil) Do
try
Parent:=Self;
Hide;
// что-то делаем
finally
Free;
end;
Для системы фиолетово, какой в конечном случае будет AOwner. Но если временных оьбъектов много, и они не будут удаляться, тогда будет понапрасну расходоваться память.
← →
Дмитрий К.К. (2002-11-26 08:41) [6]Спасибо. Ваши ответы оказались очень полезными.
← →
Дмитрий К.К. (2002-11-27 08:30) [7]А можно еще один вопрос?
С Create(nil) разобрались, с Create(Self) - тоже, а зачем делать Create(Application)? Какие преимущества это дает над ситуацией, когда владельцем является форма?
← →
Юрий Зотов (2002-11-27 08:44) [8]Это делается, когда нужно обеспечить существование компонента в течение всего времени работы программы, а не какой-то из ее форм (поскольку формы обычно создаются динамически - кроме главной, конечно). То есть, когда нужен эдакий глобальный компонент (часто это бывает модуль даных). Того же самого можно добиться, сделав владельцем компонента главную форму программы (а вот у самой главной формы владельцем может быть только Application).
Другая причина - иногда в момент создания компонента неизвестно, а существуют ли уже в программе другие компоненты, или они еще не созданы. И тогда его владельцем такого компонента (если он нужен) тоже можно сделать Application (поскольку Application заведомо существует всегда).
А так никаких преимуществ нет. Все это диктуется только логикой работы программы.
← →
Дмитрий К.К. (2002-11-27 09:11) [9]Спасибо. Грамотно, понятно, доступно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c