ExitProcess из события OnShow MainForm в Delphi - PullRequest
8 голосов
/ 26 мая 2009

У меня есть приложение, которое при запуске проверяет некоторые условия и запускает внешнюю программу в событии OnShow главной формы. Проблема в том, что если при запуске внешней программы возникает ошибка, я хочу, чтобы приложение было немедленно завершено. Но есть проблема, связанная с тем, что EurekaLog перехватывает мои исключения и каким-то образом нарушает цикл обработки сообщений, отменяя все вызовы Application.Teminate и любые другие обычные методы выключения.

Итак, вот мой вопрос, будет ли ExitProcess наилучшим способом немедленного завершения моего приложения, когда это условие существует?

Ответы [ 5 ]

11 голосов
/ 27 мая 2009

К моменту запуска OnShow вы слишком далеко зашли в программу, чтобы решить, что на самом деле не хотите, чтобы она запускалась. Вы должны сделать это определение раньше. OnShow не место, чтобы решить, что форма не должна быть показана.

Это то, что вы должны проверить, прежде чем создавать основную форму. Поместите свои проверки в файл DPR, и если вы решите, что программа не должна запускаться, просто позвоните exit.

begin
  Application.Initialize;
  if not ApplicationShouldReallyStart then
    exit;
  Application.CreateForm(TMainAppForm, MainAppForm);
  Application.Run;
end.

Введите собственную реализацию ApplicationShouldReallyStart. (И это действительно должна быть отдельная функция, а не встроенная в файл DPR. Среда IDE запутывается, если блок begin - end в файле DPR становится слишком сложным.)

Кроме этого, не звоните ExitProcess. Позвоните Halt вместо этого. Halt вызывает ExitProcess, но также вызывает разделы завершения модуля и другие специфичные для Delphi задачи завершения процесса.

2 голосов
/ 27 мая 2009

Работа С система, а не ПРОТИВ это! Вы не можете просто умереть посреди вещей. Если вы хотите умереть, делайте это в соответствии с правилами - WM_CLOSE или, возможно, своей собственной процедурой, которая говорит, почему он умирает, а затем отправляет WM_CLOSE.

1 голос
/ 26 мая 2009

Вам лучше отправить сообщение wmClose в окно. В противном случае у вас есть большой шанс попасть в беду из-за других сообщений, отправленных в форму.

0 голосов
/ 27 мая 2009

Хотя я полностью согласен с Робом Кеннеди здесь, я хочу отметить, что вы можете использовать процедуры EurekaLog для управления поведением диалогов об ошибках. Например:

uses
  ExceptionLog, ECore;
...
begin
  ForceApplicationTermination(tbTerminate);
  // ... <- Bad code goes there
end;

Таким образом, приложение будет закрыто сразу после отображения диалога об ошибке.

0 голосов
/ 27 мая 2009

Я написал небольшое приложение для проверки теории, и вот что я бы предложил.

Вызовите метод ЗАКРЫТЬ.

Следующий пример блока закрывает приложение без ошибок в D2009.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
   close;
end;

end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...