В 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
. Как этого избежать?
К сожалению, Форма заявления не восстанавливается. Только после нажатия на значок на панели задач форма восстанавливается.
Вместо этого попробуйте использовать свойство 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;