Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
Юра   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.021 c
14-101440
MVova
2002-10-10 11:36
2002.10.31
Почему ICQ а не MSN


4-101564
Aldor
2002-09-18 16:41
2002.10.31
Как в WIN2000 можно зарегистрить приложение как сервис


3-101104
Dark Hunter
2002-10-09 17:33
2002.10.31
Текстовый поиск в MS SQL Server


3-101149
KidMan
2002-10-08 22:53
2002.10.31
BDE и инсталл шиилдс


6-101400
snike
2002-08-29 11:20
2002.10.31
Аутентификация SMTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский