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; 解决方法
我把你所有的答案混合在一起,我发现了另一个可能的解决方案.
我知道这不是一个所谓的“优雅解决方案”. 以下方法描述了如何创建自定义页面,该页面是在PrepareToInstall设置阶段期间显示的Page Inno Setup的副本. 我们来看一些代码. [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个字符串. 像这样: 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; 我希望这有帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |