Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-14729
LongIsland
2002-11-12 16:14
2002.12.05
Поздравьте, что ль..


1-14562
FireWorks
2002-11-26 10:27
2002.12.05
Как заполнить комбобокс из текстового файла


1-14507
ev1972
2002-11-26 09:51
2002.12.05
Преобразование Image BMP -> RLE


14-14769
VID
2002-11-13 18:35
2002.12.05
РЕФЕРАТ - 1


14-14813
DiamondShark
2002-11-13 23:18
2002.12.05
Еще про C++





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский