Главная страница
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.018 c
1-14554
РоманВитов
2002-11-26 23:31
2002.12.05
строки


1-14525
[BAD]Angel
2002-11-25 15:56
2002.12.05
ПОМОГИТЕЕ!!!


1-14523
NONAME00
2002-11-25 22:59
2002.12.05
DOS


3-14420
LSW
2002-11-16 23:24
2002.12.05
Помгите разобраться с SQL в Paradox таблице


1-14613
^Sanya
2002-11-24 10:41
2002.12.05
Есть ли ошибка в моём коде?