问题是该向导似乎在此功能期间冻结(或不响应),只显示一个标题为“准备安装……”的空白页面,而实际上,它正在通过我的安装过程.
我想用一个简单的程序ShowProgress(const S:String)向用户显示进度;它向用户显示它实际上在做什么.我怎样才能做到这一点?
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 举报,一经查实,本站将立刻删除。