Каков правильный способ прекратить применение delphi?
Я хотел бы закончить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, что это правильный способ сделать это. Кроме того, я хотел бы знать, если что-то не так в том, что я на самом деле делаю сейчас.
В принципе, мой код выглядит следующим образом:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
Правильно ли это остановить приложение Delphi или это должно быть сделано по-другому?
Ответы
Ответ 1
Application.Terminate()
прерывает контуры сообщений в TApplication.Run()
и TForm.ShowModal()
, что позволяет основному потоку нормально выйти, выполнить необходимые очистки и т.д.
Vcl.Forms.TApplication.Terminate
Завершает выполнение приложения.
Вызвать Terminate
, чтобы программно завершить приложение. Вызывая Terminate
, а не освобождая объект приложения, вы позволяете приложению закрываться упорядоченным образом.
Terminate
вызывает функцию Windows API PostQuitMessage
, чтобы выполнить упорядоченное завершение работы приложения. Terminate
не является непосредственным. Terminate
вызывается автоматически в сообщении WM_QUIT и при закрытии основной формы.
Halt()
, с другой стороны, является немедленным ненормальным прекращением. В принципе, вырывание процесса из памяти. Используйте его только в экстремальных ситуациях, когда нет другого варианта.
System.Halt
Инициирует ненормальное завершение программы.
Halt выполняет ненормальное завершение программы и возвращается в операционную систему.
Чтобы выполнить нормальное завершение приложения Delphi, вызовите метод Terminate
для глобального объекта Application
. Если приложение не использует модуль, который предоставляет объект Application
, вызовите процедуру Exit
из основного блока программы.
Ответ 2
Я хотел бы закончить приложение Delphi без выполнения какого-либо другого кода.
Ни то, ни другое не будет Application.Terminate
и Halt
. Первый выполняет упорядоченное завершение. Выполняется много кода. Вызов Halt
более надежен. Это ненормальное прекращение. Но код завершения блока выполнен.
Если вы хотите как можно быстрее выйти, выполнив минимальный код кода, вызовите ExitProcess
. Чтобы последний шаг Halt
и вызывая ExitProcess
, вы избегаете всех шагов, которые Halt
принимает, прежде чем он вызывает ExitProcess
.
Ответ 3
Просто, чтобы оставить точку на дополнительной проблеме, если код должен быть в основной форме OnCreate.
Попробуйте использовать такой код в событии Main Form OnCreate. Он работает не так, как ожидалось, отображается основная форма, после чего приложение завершается.
Чтобы увидеть это, добавьте еще одну форму и поставьте на нее длинный цикл.
Кажется, что все Application.CreateForm
в главном проекте проекта выполнены.
Пример кода:
procedure TMyMainForm.FormCreate(Sender: TObject);
begin
ShowMessage('[1] This must allways be shown');
if mrOK=MessageDlg('Exit?',mtConfirmation,[mbOK,mbCancel],0)
then begin
Application.Terminate;
Exit;
end;
ShowMessage('[2] This must not allways be shown');
end;
procedure TMyOtherForm.FormCreate(Sender: TObject);
begin
ShowMessage('[3] This must not allways be shown');
end;
С этим кодовым сообщением отображаются сообщения [1] и [3].
Только способ не показывать [3] - вызвать Halt.
Примечание. Почему такой код на MainForm OnCreate? Простой ответ может быть, exe проверяет условия для запуска и видит, что они не встречаются (недостающие файлы и т.д.), Грубый (извините за это), просто потому, что я хочу/нуждаюсь.