【问题标题】:Inno Setup - Installation progress bar does not reach 100%Inno Setup - 安装进度条未达到 100%
【发布时间】:2017-01-10 22:50:11
【问题描述】:

我使用此代码显示经过的时间、时间百分比和估计的时间进度:

[Code]
function GetTickCount: DWORD;
  external 'GetTickCount@kernel32.dll stdcall';

var
  StartTick: DWORD;
  PercentLabel: TNewStaticText;
  ElapsedLabel: TNewStaticText;
  RemainingLabel: TNewStaticText;

function TicksToStr(Value: DWORD): string;
var
  I: DWORD;
  Hours, Minutes, Seconds: Integer;
begin
  I := Value div 1000;
  Seconds := I mod 60;
  I := I div 60;
  Minutes := I mod 60;
  I := I div 60;
  Hours := I mod 24;
  Result := Format('%.2d:%.2d:%.2d', [Hours, Minutes, Seconds]);
end;

procedure InitializeWizard;
begin
  PercentLabel := TNewStaticText.Create(WizardForm);
  PercentLabel.Parent := WizardForm.ProgressGauge.Parent;
  PercentLabel.Left := 0;
  PercentLabel.Top := WizardForm.ProgressGauge.Top +
    WizardForm.ProgressGauge.Height + 12;

  ElapsedLabel := TNewStaticText.Create(WizardForm);
  ElapsedLabel.Parent := WizardForm.ProgressGauge.Parent;
  ElapsedLabel.Left := 0;
  ElapsedLabel.Top := PercentLabel.Top + PercentLabel.Height + 4;

  RemainingLabel := TNewStaticText.Create(WizardForm);
  RemainingLabel.Parent := WizardForm.ProgressGauge.Parent;
  RemainingLabel.Left := 0;
  RemainingLabel.Top := ElapsedLabel.Top + ElapsedLabel.Height + 4;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpInstalling then
    StartTick := GetTickCount;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then
  begin
    Cancel := False;
    if ExitSetupMsgBox then
    begin
      Cancel := True;
      Confirm := False;
      PercentLabel.Visible := False;
      ElapsedLabel.Visible := False;
      RemainingLabel.Visible := False;
    end;
  end;
end;

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
var
  CurTick: DWORD;
begin
  CurTick := GetTickCount;
  PercentLabel.Caption :=
    Format('Done: %.2f %%', [(CurProgress * 100.0) / MaxProgress]);
  ElapsedLabel.Caption := 
    Format('Elapsed: %s', [TicksToStr(CurTick - StartTick)]);
  if CurProgress > 0 then
  begin
    RemainingLabel.Caption :=
      Format('Remaining: %s', [TicksToStr(
        ((CurTick - StartTick) / CurProgress) * (MaxProgress - CurProgress))]);
  end;
end;

这段代码用我的代码展示了这一点:

如何更新进度条以 100% 匹配进度条的结尾?

我需要添加更多信息吗? (对不起我的英语不好)

【问题讨论】:

    标签: progress-bar inno-setup pascalscript


    【解决方案1】:

    没什么,你可以做的。

    在带有 Aero 主题的现代 Windows 版本中,进度条具有“动画”效果。当您更改进度条位置时,它不会直接跳转到该位置,而是会为跳转设置动画。要使动画正常工作,必须抽出窗口消息队列。

    在安装的最后一步(复制文件后),Inno Setup 会短暂停止,并且不会抽出队列。因此,虽然进度条实际上设置为 100% 的位置,并且 CurInstallProgressChanged 被调用,CurProgress 等于 MaxProgress,但在视觉上进度条还没有达到 100%,因为动画正在等待。而且动画实际上永远不会完成,因为进度条在动画被允许完成之前就被隐藏了。


    如果您在 Windows 中禁用视觉主题,将​​进度条恢复为传统的无动画模式,您将看到问题消失了。

    以下屏幕截图均来自同一安装的 Windows 7。

    Windows 经典主题:

    Windows 7 Aero 主题:


    您所能做的就是使用此处显示的 hack:
    Disabling .NET progressbar animation when changing value?

    procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
    begin
      WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position - 1;
      WizardForm.ProgressGauge.Update;
      { ... }
    end;
    

    虽然你会失去动画效果。

    你显然仍然无法达到 100%,但你可以非常接近它:

    【讨论】:

    • 非常感谢马丁!
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多