Вопрос о скрытии основного окна в приложении Delphi без потери иконки в панели задач является довольно распространенным. Пользователь, использующий Delphi XE6, столкнулся с проблемой, когда при скрытии основного окна исчезала и иконка приложения в панели задач. Это происходит потому, что Windows-приложениям предоставляется только один виртуальный рабочий стол (Taskbar Button), который по умолчанию связан с главным окном приложения.
Обходной путь
Один из способов обойти данное ограничение - создание дополнительного окна, которое будет видно пользователю панели задач, в то время как основное окно будет скрыто. Вот шаги, как это можно сделать:
Создание окна с собственным Taskbar-элементом
Дополнительное окно можно настроить так, чтобы оно имело собственный Taskbar-элемент. Для этого нужно изменить стиль окна, добавив WS_EX_APPWINDOW.
pascal
procedure TWorkForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
Динамическое создание второго окна
Создайте второе окно непосредственно перед тем, как переключиться на него. Это обеспечит появление нового Taskbar-элемента.
Скрытие основного окна
После создания второго окна можно скрыть основное окно, и Taskbar-элемент, связанный с ним, также исчезнет.
Возможность переключения обратно
Если требуется возможность возврата к основному окну, вызовите метод Show основного окна вместо его закрытия.
Важные замечания
Если второе окно сложное и требует времени для создания, его можно создать в скрытом режиме, а затем показать, когда создание будет завершено.
Обеспечьте корректное завершение работы основного окна, например, при закрытии второго окна.
Пример кода
unit ULoginForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TLoginForm = class(TForm)
BLogIn: TButton;
procedure BLogInClick(Sender: TObject);
private
public
end;
var
LoginForm: TLoginForm;
LoggingOut: Boolean;
implementation
uses Unit2;
{$R *.dfm}
procedure TLoginForm.BLogInClick(Sender: TObject);
begin
// Создание второго окна
Application.CreateForm(TWorkForm, WorkForm);
// Скрытие основного окна
Self.Hide;
// Очистка полей ввода и т.д.
end;
unit UWorkForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TWorkForm = class(TForm)
BLogOut: TButton;
procedure CreateParams(var Params: TCreateParams); override;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure BLogOutClick(Sender: TObject);
private
public
end;
var
WorkForm: TWorkForm;
implementation
uses Unit1;
{$R *.dfm}
procedure TWorkForm.BLogOutClick(Sender: TObject);
begin
LoggingOut := True;
Close;
end;
procedure TWorkForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
procedure TWorkForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not LoggingOut then
begin
LoginForm.Show;
LoginForm.Close;
CanClose := True;
end
else
begin
LoginForm.Show;
LoggingOut := False;
CanClose := True;
end;
end;
end.
Заключение
Таким образом, можно скрыть основное окно в Delphi-приложении, не теряя при этом иконку в панели задач, создав дополнительное окно с собственным Taskbar-элементом и переключаясь между ними по мере необходимости.
Сокрытие основного окна в приложении Delphi без потери иконки в панели задач достигается за счет создания дополнительного окна, которое будет отображаться вместо скрытого главного окна, сохраняя тем самым видимость приложения в панели задач.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.