![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И всет-таки 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]Тебе тоже кусок справки сюда скопировать?