При разработке приложений на Delphi часто возникает потребность в создании независимых окон, которые не влияют друг на друга при закрытии. Вопрос, поставленный Roy M Klever, заключается в том, как сделать так, чтобы в приложении, использующем вкладки в стиле браузера Chrome, можно было открывать несколько форм, не ограничиваясь одной, и при этом закрытие любой формы не приводило к закрытию всего приложения.
Решение проблемы
Для создания независимых окон в Delphi необходимо избегать использования Application.MainForm. Вместо этого следует создавать формы напрямую через Form := TMyForm.Create(Application). Это позволяет избежать установки формы в качестве главной.
Для корректного завершения работы приложения необходимо добавить обработчик события OnClose для каждой формы, который будет проверять, остались ли в приложении другие формы. Если форм больше нет, то приложение должно быть закрыто:
if Screen.FormCount = 1 then
Application.Terminate;
CloseAction := caFree;
В файле DPR необходимо заменить Application.Run на цикл, который будет обрабатывать сообщения до тех пор, пока приложение не будет завершено:
repeat
try
Application.HandleMessage;
except
Application.HandleException(Application);
end;
until Application.Terminated;
Для управления элементами в панели задач можно использовать два подхода:
Одиночный элемент в панели задач: Установить Application.MainFormOnTaskbar в False, что позволит использовать скрытый обработчик TApplication. При клике на элемент панели задач все окна будут приведены в передний план. Необходимо перехватить сообщение WM_CLOSE для скрытого обработчика, чтобы закрыть все окна.
Несколько элементов в панели задач: Установить Application.MainFormOnTaskbar в True и переопределить метод CreateParams формы, установив Params.WndParent в 0. Каждый элемент панели задач будет управлять своей формой.
Заключение
Создание независимых окон в Delphi требует внимательной разработки и учета множества деталей. Важно избегать использования Application.MainForm, а также правильно обрабатывать события закрытия окон. Это позволит сделать каждую форму равноправным элементом приложения, который может быть закрыт отдельно без влияния на остальные формы.
Вопрос связан с разработкой приложения на Delphi, где необходимо создать безопасные и независимые формы, чтобы закрытие одной формы не приводило к закрытию всего приложения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS