Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.31;
Скачать: CL | DM;

Вниз

Правильное завершение работы своего приложения   Найти похожие ветки 

 
Юра   (2002-10-22 11:51) [0]

Во-первых, прав ли я, считая, что корректно задавать запрос на подтверждение завершения реботы "Действительно ли вы хотите..." в обработчике 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:00) [1]

Во-первых: прав. Именно в OnCloseQuery и надо задавать этот вопрос.


 
Snake ©   (2002-10-22 12:04) [2]

Знаешь такой анекдот?
Сын приходит к отцу-программисту:
-Папа, а почему солнце каждое утро всходит, а вечером заходит?
Папа не отрываясь от монитора:
-Каждое говоришь...
-Ну да.
-И работает каждый день нормально?
-Работает.
-Ну и оставь так, ничего не меняй!!!


 
Skier ©   (2002-10-22 12:05) [3]

>Юра

про :

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;


 
Андрей Прокофьев ©   (2002-10-22 12:14) [4]

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:21) [5]

>Андрей Прокофьев
Особой разницы нет,
т.к. экземпляр TYourForm всё
равно будет уничтожен...


 
Андрей Прокофьев ©   (2002-10-22 12:28) [6]

>Skier © (22.10.02 12:21)
Разве в Destroy формы не будет произведено удаление
List1, List2? при List* := TYourList.Create(Self)?
А им уже Free сделано.



 
Skier ©   (2002-10-22 12:33) [7]

>Андрей Прокофьев

Ты заметил что List1.Free;
List2.Free; идёт перед
inherited Destroy; ?!

Вообще, конечно, можно и
не вызывать
List1.Free и List2.Free, но это, IMHO,
плохой стиль.
Лучше при работе с
памятью всё делать явно, по возможности,
конечно...


 
Игорь Шевченко ©   (2002-10-22 12:36) [8]

Skier © (22.10.02 12:33)

И не нужно вызывать, Андрей прав :-)


 
Андрей Прокофьев ©   (2002-10-22 12:39) [9]

2 Skier © (22.10.02 12:33)
>Ты заметил что List1.Free;
>List2.Free; идёт перед
>inherited Destroy; ?!

Конечно. Я об этом и говорю.
будет в Destroy формы делаться Free/Destroy для компонентов,
Owneroм которых оня является?





 
Skier ©   (2002-10-22 12:40) [10]

>Игорь Шевченко

Наверное это уже превратилось
не в вопроc : "Правильно или нет",
а в вопрос стиля.
Я например всегда так пишу, хотя,
конечно, знаю что это необязательно...


 
Юра   (2002-10-22 12:40) [11]

>Skier
List1 := TYourList.Create(Self);
List1.Parent := Self;

Хм.
Если так:
List1:=TList.Create;
Разве у TList есть свойство Parent? Всегда был уверен, что все объекты класса TList надо уничтожать руками.


 
Андрей Прокофьев ©   (2002-10-22 12:41) [12]

2 Игорь Шевченко © (22.10.02 12:36)
Но так-то безвредно?
FreeAndNil(List1);
FreeAndNil(List2)


 
Skier ©   (2002-10-22 12:42) [13]

>Андрей Прокофьев
если ты про AV,то
его не будет...


 
Игорь Шевченко ©   (2002-10-22 12:45) [14]

Андрей Прокофьев © (22.10.02 12:41)

Угу, безвредно.

Но: все это (и Skier, и ты предлагаете безопасные способы, но совершенно лишние) делается автоматом, следовательно является лишним кодом. Я сторонник писать как можно меньше кода - сопровождать легче.

Каждый потомок TComponent в своем деструкторе
вызывает метод Owner.RemoveComponent (Self), если вызывать его по методу Skier"а, так что два раз Free не произойдет.

С уважением к участникам дискуссии,


 
Skier ©   (2002-10-22 12:45) [15]

>Юра


> Всегда был уверен, что все объекты класса TList надо уничтожать
> руками.


Если у тебя TList,то ты
абсолютно прав.



Страницы: 1 вся ветка

Текущий архив: 2002.10.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
4-101579
Zion
2002-09-16 15:09
2002.10.31
FindFirst и все все все =)


1-101196
МВВ
2002-10-21 14:20
2002.10.31
Hint из DLL


14-101514
TTCustomDelphiMaster
2002-10-11 21:17
2002.10.31
К Белорусам


1-101240
Маша
2002-10-22 10:26
2002.10.31
Прошу помощи ...


3-101170
Hlor
2002-10-11 13:40
2002.10.31
Как просуммировать поле