ExitProcess от события OnShow MainForm в Delphi

Я думаю, что это решение может быть несколько более элегантным, чем принятый ответ:

bottomNavigationView.getMenu().getItem(menuItemIndex).setChecked(true)

где menuItemIndex - индекс выбранного элемента.

8
задан yozey 26 May 2009 в 19:30
поделиться

5 ответов

К тому времени, когда 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 вызывает ExitProcess , но он также вызывает секции завершения модуля и другие задачи завершения процесса, специфичные для Delphi.

11
ответ дан 5 December 2019 в 12:12
поделиться

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

2
ответ дан 5 December 2019 в 12:12
поделиться

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

1
ответ дан 5 December 2019 в 12:12
поделиться

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

Вызов метода CLOSE.

В следующем примере модуль закрывает приложение без ошибок в 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.
0
ответ дан 5 December 2019 в 12:12
поделиться

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

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

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

0
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: