![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильное завершение работы своего приложения [D5, Win2k]
Юра © (2002-10-22 11:51:00)Во-первых, прав ли я, считая, что корректно задавать запрос на подтверждение завершения реботы "Действительно ли вы хотите..." в обработчике OnCloseQuery, а не в OnClose, исходя из следующих соображений:
------
При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:
FormCloseQuery - действие по умолчанию, устанавливает переменную CanClose в значание TRUE и продолжает закрытие формы.
FormClose
FormDestroy
Если приложение активно и вы пытаетесь завершить работу Windows (Shut Down), происходят следующие события (с соблюдением последовательности):
FormCloseQuery
FormDestroy
http://users.kpi.kharkov.ua/program/delphi/delphi.htm
-------
Во-вторых, прочитал, что приложения Дельфи некорректно отрабатывают WM_QUERYENDSESSION вообще, не давая Windows завершиться и при использовании компонента TRxTrayIcon в частности. Попробовал - все завершается корректно.
Чем чревата необработка WM_QUERYENDSESSION при использовании TRxTrayIcon?
И наконец - если в OnClose прописано нечто типа
List1.Free;
List2.Free;
то невыполнение этих операторов при завершении работы Windows приведет к чему?
Сейчас я ловлю в приложении WM_QUERYENDSESSION и по нему высвобождаю ресурсы, но мне интересно для общего развития - что будет, если этого не делать.
Игорь Шевченко (2002-10-22 12:45:00) [1]Андрей Прокофьев © (22.10.02 12:41)
Угу, безвредно.
Но: все это (и Skier, и ты предлагаете безопасные способы, но совершенно лишние) делается автоматом, следовательно является лишним кодом. Я сторонник писать как можно меньше кода - сопровождать легче.
Каждый потомок TComponent в своем деструкторе
вызывает метод Owner.RemoveComponent (Self), если вызывать его по методу Skier"а, так что два раз Free не произойдет.
С уважением к участникам дискуссии,
Skier (2002-10-22 12:45:00) [2]>Юра
> Всегда был уверен, что все объекты класса TList надо уничтожать
> руками.
Если у тебя TList,то ты
абсолютноправ.
Skier (2002-10-22 12:42:00) [3]>Андрей Прокофьев
если ты про AV,то
его не будет...
Андрей Прокофьев (2002-10-22 12:41:00) [4]2 Игорь Шевченко © (22.10.02 12:36)
Но так-то безвредно?
FreeAndNil(List1);
FreeAndNil(List2)
Skier (2002-10-22 12:40:00) [5]>Игорь Шевченко
Наверное это уже превратилось
не в вопроc : "Правильно или нет",
а в вопрос стиля.
Я например всегда так пишу, хотя,
конечно, знаю что это необязательно...
Юра (2002-10-22 12:40:00) [6]>Skier
List1 := TYourList.Create(Self);
List1.Parent := Self;
Хм.
Если так:
List1:=TList.Create;
Разве у TList есть свойство Parent? Всегда был уверен, что все объекты класса TList надо уничтожать руками.
Андрей Прокофьев (2002-10-22 12:39:00) [7]2 Skier © (22.10.02 12:33)
>Ты заметил что List1.Free;
>List2.Free; идёт перед
>inherited Destroy; ?!
Конечно. Я об этом и говорю.
будет в Destroy формы делаться Free/Destroy для компонентов,
Owneroм которых оня является?
Игорь Шевченко (2002-10-22 12:36:00) [8]Skier © (22.10.02 12:33)
И не нужно вызывать, Андрей прав :-)
Skier (2002-10-22 12:33:00) [9]>Андрей Прокофьев
Ты заметил что List1.Free;
List2.Free; идёт перед
inherited Destroy; ?!
Вообще, конечно, можно и
не вызывать
List1.Free и List2.Free, но это, IMHO,
плохой стиль.
Лучше при работе с
памятью всё делать явно, по возможности,
конечно...
Андрей Прокофьев (2002-10-22 12:28:00) [10]>Skier © (22.10.02 12:21)
Разве в Destroy формы не будет произведено удаление
List1, List2? при List* := TYourList.Create(Self)?
А им уже Free сделано.
Skier (2002-10-22 12:21:00) [11]>Андрей Прокофьев
Особой разницы нет,
т.к. экземпляр TYourForm всё
равно будет уничтожен...
Андрей Прокофьев (2002-10-22 12:14:00) [12]Skier © (22.10.02 12:05)
destructor TYourForm.Destroy;
begin
List1.Free;
List2.Free;
inherited Destroy;
end;
Это по-моему, неправильно.
Или вообще не делать Free (уничтожит форма) либо:
FreeAndNil(List1);
FreeAndNil(List2)
Skier (2002-10-22 12:05:00) [13]>Юра
про :
List1.Free;
List2.Free;
немного не полятно...
Если ты создал List1 и List2
в design-time,то зачем их
освобождать - это сделает сама форма.
Если ты создаешь List1 и List2
в run-time,то сделай примерно так
constructor TYourForm.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
List1 := TYourList.Create(Self);
List1.Parent := Self;
List2 := TYourList.Create(Self);
List2.Parent := Self;
end;
destructor TYourForm.Destroy;
begin
List1.Free;
List2.Free;
inherited Destroy;
end;
Snake (2002-10-22 12:04:00) [14]Знаешь такой анекдот?
Сын приходит к отцу-программисту:
-Папа, а почему солнце каждое утро всходит, а вечером заходит?
Папа не отрываясь от монитора:
-Каждое говоришь...
-Ну да.
-И работает каждый день нормально?
-Работает.
-Ну и оставь так, ничего не меняй!!!
Игорь Шевченко (2002-10-22 12:00:00) [15]Во-первых: прав. Именно в OnCloseQuery и надо задавать этот вопрос.