Подтвердить что ты не робот

Каков правильный способ прекратить применение delphi?

Я хотел бы закончить приложение Delphi без выполнения какой-либо другой строки кода, и мне интересно, что это правильный способ сделать это. Кроме того, я хотел бы знать, если что-то не так в том, что я на самом деле делаю сейчас. В принципе, мой код выглядит следующим образом:

//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;

Правильно ли это остановить приложение Delphi или это должно быть сделано по-другому?

4b9b3361

Ответ 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 проверяет условия для запуска и видит, что они не встречаются (недостающие файлы и т.д.), Грубый (извините за это), просто потому, что я хочу/нуждаюсь.