Inno Setup: How to manipulate progress bar on Run section?

It would be rather difficult to update the progress bar, while another process is running.

I do not see a point of endeavoring it, as you are unlikely able to tell the progress of the sub-installer, so you won’t know what to update the progress bar to.

Except for special cases, when the sub-installer provides an API to report its progress.
For an example, see:


To update the progress bar according to number of sub-installers finished, you can do:

[Run]
FileName: "process1"; BeforeInstall: SetProgress(0); AfterInstall: SetProgress(33)
FileName: "process2"; AfterInstall: SetProgress(66)
FileName: "process3"; AfterInstall: SetProgress(100)

[Code]

procedure SetProgress(Position: Integer);
begin
  WizardForm.ProgressGauge.Position :=
    Position * WizardForm.ProgressGauge.Max div 100;
end;

To divide part of the progress range for installing files and the rest to running the sub-installers, see
Inno Setup – Prevent extraction of files from setting progress bar to 100%


Another option is to use a “marquee” (= infinite) progress bar style.

See Progress bar control styles.

[Run]
FileName: "process1"; BeforeInstall: SetMarqueeProgress(True)
FileName: "process2"
FileName: "process3"; AfterInstall: SetMarqueeProgress(False)

[Code]

procedure SetMarqueeProgress(Marquee: Boolean);
begin
  if Marquee then
  begin
    WizardForm.ProgressGauge.Style := npbstMarquee;
  end
    else
  begin
    WizardForm.ProgressGauge.Style := npbstNormal;
  end;
end;

enter image description here

Works even on Windows XP, despite not being listed in the official Microsoft documentation anymore. Tested on Windows XP SP3.

enter image description here

Leave a Comment