微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

inno-setup – 如何在“PrepareToInstall”中显示进度?

我正在处理的安装程序在PreparetoInstall函数中完成大部分工作,因为我需要做的每件事都可能失败,因此这是处理这些事情的适当位置,以防它们失败.通过在函数的结果中传递错误消息,可以自动报告任何故障.安装程序实际上只复制了3个小文件.

问题是该向导似乎在此功能期间冻结(或不响应),只显示一个标题为“准备安装……”的空白页面,而实际上,它正在通过我的安装过程.

我想用一个简单的程序ShowProgress(const S:String)向用户显示进度;它向用户显示它实际上在做什么.我怎样才能做到这一点?

这就是我正在进行的安装,我想将每个调用包装到Log()…

function PreparetoInstall(var NeedsRestart: Boolean): String;
var
  R: Integer;
begin
  Result:= '';
  try
    Log('Doing this...');
    R:= DoThis;
    case R of
      0: begin
        Result:= '';
      end;
      1: begin
        Result:= 'Error message 1 was raised while doing this.';
      end;
      else begin
        Result:= 'Unexpected error doing this: ' + IntToStr(R);
      end;
    end;

    if Result = '' then begin
      Log ('Doing that...');
      R:= DoThat;
      case R of
        0: begin
          Result:= '';
        end;
        1: begin
          Result:= 'Error message 1 was raised while doing that.';
        end;
        else begin
          Result:= 'Unexpected error doing that: ' + IntToStr(R);
        end;
      end;
    end;

    if Result = '' then begin
      Log ('Doing something else...');
      R:= DoSomethingElse;
      case R of
        0: begin
          Result:= '';
        end;
        1: begin
          Result:= 'Error message 1 was raised while doing something else.';
        end;
        else begin
          Result:= 'Unexpected error doing something else: ' + IntToStr(R);
        end;
      end;
    end;

    //A few more blocks like above

    //Error logging
    if Result <> '' then begin
      Log('FAILURE: '+Result);
    end;

  except
    Result:= 'EXCEPTION';
    Log('EXCEPTION');
  end;
end;

解决方法

我把你所有的答案混合在一起,我发现了另一个可能的解决方案.

我知道这不是一个所谓的“优雅解决方案”.
无论如何,它是一个快速解决方案,可以避免您使用自定义控件开发一个单独的DLL来管理安装程序和DLL之间的通信.

以下方法描述了如何创建自定义页面,该页面是在PreparetoInstall设置阶段期间显示的Page Inno Setup的副本.
此副本必须具有与原始副本相同的外观和感觉,以及开发人员可用于指示PreparetoInstall设置阶段当前步骤的进度条和标签.

我们来看一些代码.
首先,准备自定义页面

[Code]
var
  PreparetoInstallWithProgresspage : TOutputProgressWizardPage;

现在定义PreparetoInstall函数添加我们的自定义内容

function PreparetoInstall(var NeedsRestart: Boolean): String;
var
  ResultCode:   Integer;
begin
  PreparetoInstallWithProgresspage.SetProgress(0,0);
  PreparetoInstallWithProgresspage.Show;

  try
    // First preinstallation step: suppose to kill currently app you are going to update 
    PreparetoInstallWithProgresspage.SetText('Exiting MyApp Running Instances'),'');

    ExecuteCmd('taskkill','/F /IM MyApp');
    // Set progress bar to 10%
    PreparetoInstallWithProgresspage.SetProgress(1,10);

    // Second preinstallation step
    // DoSomething usefull...
    // Set progress bar to 20% after done
    PreparetoInstallWithProgresspage.SetProgress(2,10);

    // ...do other preinstallation steps till the end
    PreparetoInstallWithProgresspage.SetProgress(10,10);
  finally
    PreparetoInstallWithProgresspage.Hide;
  end;
end;

在此安装阶段,我们完成了准备安装阶段的步骤,因此Inno Setup的认PreparetoInstall页面显示一段时间.

现在,用户可能无法理解页面更改,因为我们的PreparetoInstallWithProgresspage具有与原始页面相同的外观.

为了让我们的页面具有相同的外观和感觉,我们可以使用SetupMessage函数获取原始Inno Setup PreparetoInstall页面的2个字符串.
使用SetupMessage,我们可以避免复制和本地化我们的自定义页面的字符串来复制原件.

像这样:

procedure InitializeWizard;
var
  A: AnsiString;
  S: String;
begin
  // The string msgWizardPreparing has the macro '[name]' inside that I have to replace with the name of my app,stored in a define constant of my script.
  S := SetupMessage(msgPreparingDesc); 
  StringChange(S,'[name]','{#MY_APPNAME}');
  A := S;
  PreparetoInstallWithProgresspage := CreateOutputProgresspage(SetupMessage(msgWizardPreparing),A);
end;

我希望这有帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐