Форум: "Основная";
Текущий архив: 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.009 c