Вопрос, поднятый пользователем, заключается в проблеме восстановления окна логина в программе, написанной на Delphi 10, после его минимизации через панель задач Windows. Проблема возникает из-за неправильной организации порядка создания форм и использования методов Application.CreateForm и Application.MainForm.
Описание проблемы
Программа, написанная на Delphi 10, отображает диалоговое окно входа перед запуском основной программы. Если в момент, когда диалоговое окно активно, пользователь минимизирует программу, кликнув на панель задач Windows, окно логина останется минимизированным навсегда.
Пример кода, вызывающего проблему
unit Unit1;
interface
class function TForm1.Execute: Boolean;
var
Dlg: TForm1;
begin
Dlg:= TForm1.Create(nil);
try
Result:= Dlg.ShowModal = mrOk;
finally
Dlg.Free;
end;
end;
var Project1.dpr
begin
if not TForm1.Execute then
Exit;
Application.Initialize;
Application.MainFormOnTaskbar := True;
//Moving TForm1.Execute here has no effect
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
Подтвержденное решение
Для решения проблемы необходимо изменить порядок создания форм. Сначала следует создать основную форму, а затем отобразить форму логина. После успешного входа, если это необходимо, можно уничтожить форму логина. В случае отказа от входа, программа может быть завершена.
Вот пример корректного кода:
program LoginDemo;
uses
Vcl.Forms, Vcl.Dialogs, Vcl.Controls,
LoginDemoMain in 'LoginDemoMain.pas' {DemoMainForm},
LoginDemoDialog in 'LoginDemoDialog.pas' {DemoLoginForm};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TDemoMainForm, DemoMainForm);
Application.ShowMainForm := False; // Скрываем основную форму
Application.Run;
// Отображаем форму логина
if TDemoLoginForm.Create(nil) do
try
if DemoLoginForm.ShowModal <> mrOK then
begin
ShowMessage('Invalid login, sorry...');
Exit;
end;
finally
DemoLoginForm.Free;
end;
// Если вход успешный, показываем основную форму
DemoMainForm.Show;
// Основной цикл программы продолжает работу
end.
Комментарии к решению
Важно, что первая форма, созданная с помощью Application.CreateForm, становится основной формой программы, и её нельзя изменить позже.
Форму логина следует создать вручную, используя Create, а не Application.CreateForm.
После закрытия формы логина и успешного входа, основную форму можно отобразить с помощью Show.
Альтернативный ответ и дополнительные комментарии
Некоторые пользователи предлагали свои варианты решения, но они не учитывают, что после вызова Application.Run основная форма становится неотъемлемой частью приложения.
Необходимо быть осторожным при использовании Application.CreateForm для формы логина, чтобы не сделать её основной формой программы.
Заключение
Изменение порядка создания форм и использования методов Application.CreateForm и Application.MainForm позволяет решить проблему восстановления окна логина после его минимизации. Следует тщательно планировать порядок инициализации форм в приложении, чтобы избежать подобных проблем.
Проблема заключается в неправильной инициализации форм в программе на Delphi 10, из-за чего окно логина минимизируется навсегда после использования панели задач Windows, и необходимо изменить порядок создания форм для корректного решения этой проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.