Я думаю, что это решение может быть несколько более элегантным, чем принятый ответ:
bottomNavigationView.getMenu().getItem(menuItemIndex).setChecked(true)
где menuItemIndex - индекс выбранного элемента.
К тому времени, когда 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.
Работайте С системой, а не ПРОТИВ ее! Вы не можете просто умереть посреди событий. Если вы хотите умереть, сделайте это в рамках правил - WM_CLOSE или, возможно, вашей собственной процедуры, которая говорит, почему он умирает, а затем отправляет WM_CLOSE.
Лучше отправить в окно сообщение wmClose. В противном случае у вас есть большой шанс попасть в беду из-за других сообщений, отправленных через форму.
Я написал небольшое приложение для проверки теории, и вот что я могу предложить.
Вызов метода 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.
Хотя я полностью согласен с Робом Кеннеди здесь, я хочу отметить, что вы можете использовать подпрограммы EurekaLog для управления поведением диалогового окна ошибок. Например:
uses
ExceptionLog, ECore;
...
begin
ForceApplicationTermination(tbTerminate);
// ... <- Bad code goes there
end;
Таким образом, приложение будет закрыто сразу после отображения диалогового окна с ошибкой.