Inno安装-安装进度条未达到100% [英] Inno Setup - Installation progress bar does not reach 100%

查看:5
本文介绍了Inno安装-安装进度条未达到100%的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

[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%与进度条的末尾匹配?

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

推荐答案

没有太多,您可以对此做些什么。

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

在安装的最后几个步骤中(在复制文件之后),Inno安装程序会短暂停止,并且不会进入队列。因此,虽然进度条实际上被设置为100%的位置,并且CurInstallProgressChanged是在CurProgress等于MaxProgress的情况下调用的,但从视觉上看,进度条还没有达到100%,因为动画是挂起的。而且动画实际上永远不会完成,因为在允许动画完成之前进度条是隐藏的。


如果在Windows中禁用可视主题,则会将进度条恢复为旧版无动画模式,您将看到问题消失了。

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

Windows经典主题:

Windows 7 Aero主题:


您可能所能做的就是使用如下所示的黑客:
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%,但你可以非常接近它:

这篇关于Inno安装-安装进度条未达到100%的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆