Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И всет-таки Release или Free для формы? [D7, WinXP]


gosha73 ©   (2007-03-02 17:26:00) 

Привет друзья.
Здалася таким вот вопросом поскольку испытал на себе проблемы при использовании метода Free для формы. Метод Release работает замечательно, никаких AV и проблем.
Но, усомнился только в одном. Все свои формы я создаю с владельцем равным nil, а не Application как это обычно все используют. Не сочтите за рекламу, но почитал вот эту http://delphi.about.com/od/beginners/l/aa070203b.htmстатью и теперь в сомнениях весь, потому как там написано:
Caution is needed with a Nil owner, however. You must take care to destroy the form object yourself, using the Free method. If you try to use Release for a form (or any object) with a Nil owner, your program will crash later with an access violation.
Но у меня ни разу не вываливалась программа с AV при таком раскладе, но когда я уничтожаю форму с помощью Free иногда вылазиют AV. Подскажите пожалуйста, кому верить?
Заранее спасибо.


Плохиш   (2007-03-02 18:44:00) [1]

Там, кстати, в комментариях это написано...


Плохиш   (2007-03-02 18:40:00) [2]


> gosha73   (02.03.07 17:50) [6]

Ты про это чтоли?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1153&mode=print

procedure TForm2.WndProc(var Msg:TMessage);
begin
 inherited;
 S[2]:='x' {*}
end;

Так всё правильно, в inheritedпроизойдёт вызов обработчика сообения, в котором форма уничтожится с помощью Free. Т.о. получается, что статейка-то лажовая...
АФФтар статейки даже не задумался о том, почему в VCL в WndProc сначала идёт своя обработка, а потом вызов inherited, да и сообщения всегда проверяют.


gosha73   (2007-03-02 17:50:00) [3]

Да я тоже это понимаю, автор статьи походу прогнал и только других в заблуждение вводит. Хотя и CM_RELEASE тоже не так идеален. Почитал про это сообщение в королевстве дельфи сейчас.
Ну в принципе вопрос для меня закрыт. Всем спасибо.


DrPass   (2007-03-02 17:43:00) [4]


> you try to use Release for a form (or any object) with a
> Nil owner, your program will crash later with an access
> violation.

Чушь какая-то. Release делает тот же самый Free, только не напрямую, а посылкой сообщения


Плохиш   (2007-03-02 17:39:00) [5]


> gosha73   (02.03.07 17:29) [3]
> Справку читал, поэтому использую Release, но в справке не
> указано про момент с владельцем формы равным nil.

А что там должно быть указано? В Release посылается себе сообщение, по получению которого, вызывается Free.

А свой вопрос задай автору той статьи, чёй-то у него программа crash-ается, никак из-за ошибки в 17й строке.


gosha73   (2007-03-02 17:29:00) [6]

Справку читал, поэтому использую Release, но в справке не указано про момент с владельцем формы равным nil.


Desdechado   (2007-03-02 17:28:00) [7]

Release в отличие от Free дожидается завершения всех обработчиков формы и только потом ее убивает.
Про nil-хозяина ничего не скажу, практически не использую.


Плохиш   (2007-03-02 17:27:00) [8]

Тебе тоже кусок справки сюда скопировать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо