Inno Setup:如何操作 运行 部分的进度条?

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

类似这个问题:
How to set the progress bar value in the [Run] section of the Inno Setup install script?

当 Inno Setup 到达 [Run] 部分时,进度条显示在 100% 并停在该位置。

我在这个 Run 部分安装了很多文件,我希望在安装每个程序时重新启动进度条并控制它。

状态消息很容易更改 (StatusMsg),但我缺少一些进度。你们能帮帮我吗?

示例:

[Run]
Filename: "msiexec.exe"; Parameters: "/i ""msxml.msi"" /quiet"; \
    StatusMsg: "MSXML..."; Flags: runascurrentuser
Filename: "msiexec.exe"; Parameters: "/i ""capicom_dc_sdk.msi"" /quiet"; \
    StatusMsg: "CAPICOM..."; Flags: runascurrentuser

因为我想在安装过程中控制进度条,所以我不知道该怎么做。我想也许可以使用 BeforeInstall 参数,创建一个代码通过执行 WizardForm.ProgressGauge.Position = 0; 之类的操作将进度条设置为 0,而在 AfterInstall 参数中,相反,WizardForm.ProgressGauge.Position = 100;,但是如何在安装过程中更改?

谢谢。

更新进度条会比较困难,而另一个进程是运行。

我看不到努力的意义,因为您不太可能知道子安装程序的进度,所以您不知道将进度条更新到什么。

除特殊情况外,当子安装程序提供 API 来报告其进度时。
例如,参见:

  • .

要根据子安装程序完成的数量更新进度条,您可以这样做:

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

[Code]

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

要将安装文件的部分进度范围和其余部分划分给 运行 子安装程序,请参阅


另一种选择是使用“选取框”(=无限)进度条样式。

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

甚至可以在 Windows XP 上运行,尽管不再列在官方 Microsoft 文档中。在 Windows XP SP3 上测试。