Прежде чем приступить к решению проблемы, стоит отметить, что в вопросе описывается ситуация, когда создается модальное окно FireMonkey (FMX) внутри динамически загружаемой библиотеки (DLL), и после закрытия этого окна значок программы остается в панели задач Windows. Это нежелательное поведение, которое необходимо исправить.
Шаги для решения проблемы:
Шаг 1: Изменение процедуры ShowMainForm
В функции ShowMainForm необходимо убрать вызов Application.Terminate, так как это приводит к неожиданному завершению работы приложения, включая его сообщение-цикл. Вместо этого, после закрытия формы, необходимо просто освободить ресурсы, связанные с формой.
Шаг 2: Обработка сообщений окна приложения
Для корректной работы с окнами в FMX необходимо зарегистрировать обработчик сообщений окна, используя функцию RegisterApplicationHWNDProc из модуля FMX.Platform.Win. Это позволит системе корректно обрабатывать создание и уничтожение окон.
uses
FMX.Platform.Win;
var
_AppHandle: HWND;
function GetAppHandle: HWND;
begin
Result := _AppHandle;
end;
function InitializeDLL(AppHandle: HWND): HRESULT; stdcall;
begin
try
if AppHandle = 0 then Exit(E_HANDLE);
if _AppHandle <> 0 then Exit(E_FAIL);
InitGDIP;
_AppHandle := AppHandle;
RegisterApplicationHWNDProc(GetAppHandle);
Result := S_OK;
except
Result := E_UNEXPECTED;
end;
end;
procedure FinalizeDLL; stdcall;
begin
FreeGDIP;
// Дополнительно можно освободить другие ресурсы
end;
Шаг 3: Вызов FinalizeForms
Перед освобождением GDI+ можно вызвать FinalizeForms, чтобы освободить другие ресурсы, используемые FMX, например, менеджер стилей, фильтров и т.д. Однако, следует быть осторожным, чтобы не вызвать эту функцию дважды, что может привести к ошибкам доступа.
Шаг 4: Удаление DLL при закрытии хост-приложения
В функции FormDestroy хост-приложения необходимо не только освободить библиотеку, но и убедиться, что все ресурсы, созданные в DLL, корректно освобождены.
procedure TFormHost.FormDestroy(Sender: TObject);
begin
if FLibHandle <> 0 then begin
FinalizeDLL; // Предполагается, что функция FinalizeDLL существует
FreeLibrary(FLibHandle);
FLibHandle := 0;
end;
end;
Шаг 5: Тестирование изменений
После внесения изменений, необходимо тщательно протестировать приложение, чтобы убедиться, что значок в панели задач исчезает после закрытия формы и что приложение не приводит к сбоям при закрытии.
Заключение
Следуя этим шагам, вы должны устранить проблему с оставшимся значком в панели задач после закрытия динамической формы FMX. Важно помнить о корректном освобождении ресурсов и правильной обработке сообщений окон.
При работе с модальным окном FireMonkey в динамически загружаемой библиотеке после его закрытия значок программы остается в панели задач Windows, что требует исправления.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.