Проблема: Как восстановить приложение после предыдущего свертывания?

В Windows 11, Delphi 12.1 у меня есть простое приложение Delphi VCL с одной кнопкой:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.Minimize;
  ShowMessage('Test');
  Application.Restore;
end;

К сожалению, Форма заявления не восстанавливается. Только после нажатия на значок на панели задач форма восстанавливается.

Как я могу программно восстановить форму после вызова ShowMessage?

Обновлено:

Тем временем я нашел очень простое решение:

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Application.Minimize;
  Application.MainForm.Visible := False;

  ShowMessage('Test');

  Application.MainForm.Visible := True;
  //Application.Restore;
end;

Однако значок панели задач исчезает, когда отображается диалоговое окно ShowMessage. Как этого избежать?


1
83
1

Ответ:

Решено

К сожалению, Форма заявления не восстанавливается. Только после нажатия на значок на панели задач форма восстанавливается.

Вместо этого попробуйте использовать свойство WindowState формы:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.WindowState := wsMinimized;
  ShowMessage('Test');
  Self.WindowState := wsNormal;
end;

Однако значок панели задач исчезает, когда отображается диалоговое окно ShowMessage.

Это потому, что Application.MainFormOnTaskbar по умолчанию имеет значение True. Вы скрываете/показываете окно, которому принадлежит кнопка панели задач, поэтому кнопка также скрывается/показывается.

Как этого избежать?

Вам нужно будет установить Application.MainFormOnTaskbar = False в основном .dpr файле до вызова Application.Run(). Это сделает окно Application владельцем кнопки панели задач. Также следует учитывать поведение Application.Minimize()/Application.Restore().

Однако это фактически приведет к тому, что управление окнами форм VCL будет вести себя так же, как и во времена до Vista, что может вызвать другие побочные эффекты в Vista +, для устранения которых предназначен MainFormOnTaskbar=True. Так что будьте очень осторожны с этим.

Альтернатива — просто переместить окно формы за пределы экрана, а затем вернуть его обратно.

А пока я нашел очень простое решение

Вместо этого вы можете использовать методы Hide() и Show() формы:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Hide;
  ShowMessage('Test');
  Self.Show;
end;