Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

Очередной вопрос о создании компонентов в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-14656
oleg_er
2002-11-25 15:23
2002.12.05
StatusBar


3-14367
kostik78ua
2002-11-18 11:17
2002.12.05
memo-поля


3-14474
SeRZh
2002-11-19 12:23
2002.12.05
Вопрос новичка


4-14864
dimod
2002-10-21 12:49
2002.12.05
WindowProc - обработка сообщений окна


3-14408
Олеся
2002-11-14 04:55
2002.12.05
Проблема с Restore