Inno Setup - индикатор выполнения не отображается при удалении - PullRequest
4 голосов
/ 24 июня 2019

Я использую Inno Setup, чтобы создать свой собственный установщик. Когда пользователь удаляет приложение, я хочу удалить какую-то папку.

Поэтому я использую событие CurUninstallStepChanged для удаления папки и отображения «индикатора выполнения» в стиле npbstMarquee (на основе Inno Setup: как обрабатывать индикатор выполнения в секции [UninstallDelete]? ).

Вот код:

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;
            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;

Если я использую отладку в каждой строке, я вижу, как работает индикатор выполнения. Но когда я использую unins000.exe, тогда может отображаться только Caption, индикатор выполнения не отображается.
Как я могу это исправить?

1 Ответ

4 голосов
/ 24 июня 2019

Необходимо перекачать очередь сообщений, чтобы отобразить / анимировать индикатор выполнения.
Inno Setup: Как изменить долго работающий скрипт, чтобы он не зависал в графическом интерфейсе?

Особенно, вы можете использовать функцию AppProcessMessage из:
Обнаружение моего SQL-сервера в локальной сети по порту прослушивания (Inno Setup)

enter image description here

Хотя с использованием DelTree интервал между вызовами на AppProcessMessage будет слишком большим, чтобы плавно анимировать индикатор выполнения.Вам бы пришлось реализовать рекурсивное удаление явно, чтобы позволить качать очередь достаточно часто.

...