Иногда в процессе работы приложения на Delphi возникает ситуация, когда при запуске программы обнаруживается доступное обновление, и начинается загрузка и замена исполняемых пакетов. В случае если один из пакетов используется, пользователю показывается диалоговое окно, позволяющее попробовать снова или отменить действие. Проблема заключается в том, что при отображении диалогового окна еще не создано главной формы приложения, и значок программы не отображается в панели задач.
Описание проблемы
При запуске приложения, если доступно обновление, происходит загрузка и замена исполняемых пакетов. Если в этот момент один из пакетов используется, пользователю предлагается диалоговое окно с выбором действий (попытка снова или отмена). В этот момент главная форма приложения еще не создана, и значок программы отсутствует в панели задач. Стандартный способ решения – использование пользовательской формы диалога и переопределение процедуры CreateParams, как описано в вопросе на Stack Overflow.
Решение с использованием стандартного диалога
В случае, когда (Win32MajorVersion >= 6) and UseLatestCommonDialogs and ThemeServices.ThemesEnabled является ложным, MessageDlg создает диалог в виде TMessageForm, который наследуется от TForm. Если условие истинно, то используется функция TaskDialogIndirect.
Подход с использованием CreateMessageDialog
Возможно использование CreateMessageDialog, чтобы получить экземпляр формы и добавить его в панель задач с помощью ITaskbarList::AddTab. Однако, следует быть осторожным, чтобы избежать пересоздания окон VCL. Более надежный способ – создание формы и переопределение ее CreateParams для создания несвязанного окна или добавления стиля WS_EX_APPWINDOW.
Подтвержденный ответ
Создание пользовательской формы и переопределение CreateParams является предпочтительным решением, так как это обеспечивает более надежное управление окнами и их взаимодействием с панелью задач. Можно добавить стиль WS_EX_APPWINDOW к форме, созданной CreateMessageDialog, но это требует внимания к возможным проблемам с пересозданием окон VCL.
Пример кода
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Taskbar;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FTaskbarList: TTaskbarList;
public
{ Public declarations }
end;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
MessageForm: TMessageForm;
begin
MessageForm := CreateMessageDialog(nil, 'Заголовок', 'Текст сообщения');
with MessageForm.CreateParams do
begin
Style := Style or WS_EX_APPWINDOW;
dwExStyle := dwExStyle or WS_EX_TOOLWINDOW;
end;
if Assigned(FTaskbarList) then
FTaskbarList.AddTab(MessageForm.Handle);
end;
initialization
FTaskbarList := TTaskbarList.Create;
FTaskbarList.Activate;
Альтернативный ответ (не рекомендуется)
Модификация CreateMessageDialog для добавления в панель задач, но с учетом возможных рисков пересоздания окон VCL.
Заключение
В статье был рассмотрен вопрос отображения значка приложения в панели задач во время отображения диалоговых окон в приложениях на Delphi. Предложено решение с созданием пользовательской формы и переопределением параметров создания окна. Приведен пример кода, демонстрирующий, как добавить форму в панель задач.
В процессе разработки на Delphi возникла проблема с отображением значка приложения в панели задач при запуске диалоговых окон для обновления исполняемых пакетов, что связано с тем, что главная форма приложения еще не создана.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.