При создании установщика с помощью Inno Setup для удаления папки во время деинсталляции приложения пользователем вы хотите отображать прогресс-бар. Однако при использовании события CurUninstallStepChanged для удаления папки и отображения прогресс-бара с стилем npbstMarquee, прогресс-бар не отображается при запуске файла unins000.exe. В этой статье мы рассмотрим, почему это происходит и как это исправить.
Описание проблемы
При использовании события CurUninstallStepChanged для удаления папки и отображения прогресс-бара с стилем npbstMarquee, прогресс-бар не отображается при запуске файла unins000.exe. Это происходит потому, что при деинсталляции приложения пользователем, Inno Setup запускает процесс удаления в фоновом режиме, и поэтому прогресс-бар не обновляется визуально.
Подтвержденный ответ
Чтобы отобразить и анимировать прогресс-бар, необходимо обработать сообщения в очереди. Это можно сделать с помощью функции AppProcessMessage из ответа на вопрос "Inno Setup: How to modify long running script so it will not freeze GUI?" на StackOverflow.
При использовании функции DelTree интервал между вызовами AppProcessMessage будет слишком большим, чтобы анимировать прогресс-бар плавно. В этом случае вам придется реализовать удаление папки рекурсивно, чтобы часто обрабатывать сообщения в очереди.
Ниже приведен пример кода, который демонстрирует, как удалить папку и отобразить прогресс-бар с помощью стиля npbstMarquee во время деинсталляции приложения пользователем:
procedure DeleteFolder();
var
FindRec: TFindRec;
fullPath: string;
tmpMsg: string;
StatusText: string;
deletePath: string;
begin
{ find all and delete }
UninstallProgressForm.ProgressBar.Style := npbstMarquee;
StatusText := UninstallProgressForm.StatusLabel.Caption;
UninstallProgressForm.StatusLabel.WordWrap := True;
UninstallProgressForm.StatusLabel.AutoSize := True;
fullPath := 'C:\ProgramData\TestPath';
if FindFirst(ExpandConstant(fullPath + '\*'), FindRec) then
try
repeat
if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and
(FindRec.Name <> '.') and (FindRec.Name <> '..') then begin
deletePath := AddBackslash(fullPath) + FindRec.Name;
tmpMsg := 'Deleting...' + #13#10 + deletePath;
UninstallProgressForm.StatusLabel.Caption := tmpMsg;
AppProcessMessage(msg); // Добавляем вызов функции AppProcessMessage
DelTree(deletePath, True, True, True);
end;
until
not FindNext(FindRec);
finally
UninstallProgressForm.StatusLabel.Caption := StatusText;
FindClose(FindRec);
end;
UninstallProgressForm.ProgressBar.Style := npbstNormal;
end;
{ Uninstall event }
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
case CurUninstallStep of
usUninstall:
begin
DeleteFolder();
end;
end;
end;
В этом примере мы добавляем вызов функции AppProcessMessage перед вызовом функции DelTree в цикле, чтобы часто обрабатывать сообщения в очереди и анимировать прогресс-бар плавно.
Альтернативный ответ
Если вам не нужно удалять папку во время деинсталляции приложения пользователем, вы можете использовать секцию [UninstallDelete] в скрипте Inno Setup, чтобы удалить папку автоматически. В этом случае прогресс-бар будет отображаться автоматически, и вам не придется писать дополнительный код для отображения прогресс-бара.
Надеюсь, этот ответ поможет вам решить проблему с отображением прогресс-бара при удалении папки в Inno Setup.
Краткое описание: При деинсталляции приложения пользователем с помощью Inno Setup не отображается прогресс-бар при удалении папки, если используется событие `CurUninstallStepChanged` и стиль прогресс-бара `npbstMarquee`, из-за того, что удаление происходи
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.