Inno setup 跳过基于Inno安装程序中可选组件的自定义页面

Inno setup 跳过基于Inno安装程序中可选组件的自定义页面,inno-setup,Inno Setup,在前面的一个问题中,我问了如何拥有三个可选组件,其中用户还可以分别指定每个组件的位置(例如,一个代码部分和两个HTML web应用程序)@米拉尔给了我一个很好的答案,我现在已经实现了: 我还有一个小的美学问题。我总是在向导中创建并要求用户提供CreateInputDirPage。问题出现在wpSelectComponents之后 问题:如果未选择组件,如何跳过页面。也就是说,如何跳过自定义页面 我觉得这与ShouldSkipPage()有关。但是我不知道我的自定义页面的PageID是什么,也不

在前面的一个问题中,我问了如何拥有三个可选组件,其中用户还可以分别指定每个组件的位置(例如,一个代码部分和两个HTML web应用程序)@米拉尔给了我一个很好的答案,我现在已经实现了:

我还有一个小的美学问题。我总是在向导中创建并要求用户提供
CreateInputDirPage
。问题出现在
wpSelectComponents
之后

问题:如果未选择组件,如何跳过页面。也就是说,如何跳过自定义页面

我觉得这与
ShouldSkipPage()
有关。但是我不知道我的自定义页面的
PageID
是什么,也不知道如何测试以查看选择了哪些组件

函数ShouldSkipPage(PageID:Integer):布尔值

向导调用此事件函数以确定是否应显示特定页面(由PageID指定)。如果返回True,将跳过该页;如果返回False,则可能会显示该页面

我的脚本附在下面:

[组件]
姓名:“沃森”;说明:“沃森组件”;类型:仅限WATSON full
姓名:“托比”;说明:“托比组件”;类型:仅适用于全部
姓名:“夏洛克”;描述:“夏洛克组件”;类型:仅限herlock full
[守则]
变量
TobyDirPage:TInputDirWizardPage;
SherlockDirPage:TInputDirWizardPage;
程序初始化;
开始
TobyDirPage:=CreateInputDirPage(wpSelectComponents,
“为Toby网页选择位置”,“我们应该将Toby应用程序示例文件存储在哪里?”,
“Toby独立地图应用程序示例将保存在以下文件夹中。”#13#10#13#10+
'要继续,请单击“下一步”。如果要选择其他文件夹,请单击“浏览”。',
错误,“新建文件夹”);
{添加项目(标题为空)}
TobyDirPage.添加(“”);
{设置初始值(可选)}
值[0]:=ExpandConstant('c:\wwwroot\Toby');
SherlockDirPage:=CreateInputDirPage(wpSelectComponents,
“为Sherlock网页选择位置”,“我们应该将Sherlock目录搜索工具存储在哪里?”,
“Sherlock.html及其关联文件将保存在以下文件夹中。”#13#10#13#10+
'要继续,请单击“下一步”。如果要选择其他文件夹,请单击“浏览”。',
错误,“新建文件夹”);
{添加项目(标题为空)}
SherlockDirPage.添加(“”);
{设置初始值(可选)}
SherlockDirPage.Values[0]:=ExpandConstant('c:\wwwroot\Sherlock');
结束;
函数GetTobyDir(Param:String):String;
开始
{返回所选TobyDir}
结果:=TobyDirPage.Values[0];
结束;
函数GetSherlockDir(参数:String):String;
开始
{返回所选TobyDir}
结果:=SherlockDirPage.value[0];
结束;

在正确说出之前,您需要使用事件处理程序有条件地跳过页面。要检查是否选择了某个组件,请使用该函数,最后,要获取自定义页面的ID,您需要存储它的ID。将所有这些放在一起可能会得到以下示例脚本:

[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
OutputDir=userdocs:Inno设置示例输出
[组成部分]
名称:“帮助”;说明:“帮助文件”;
[守则]
变量
CustomPageID:整数;
程序初始化;
变量
CustomPage:TInputDirWizardPage;
开始
CustomPage:=CreateInputDirPage(wpSelectComponents,'标题',
“Description”、“suboption”、False、“NewFolderName”);
CustomPage.Add('Input');
{存储自定义页面ID以便在ShouldSkipPage事件中进一步使用}
CustomPageID:=CustomPage.ID;
结束;
函数ShouldSkipPage(PageID:Integer):布尔值;
开始
{初始化结果以不跳过任何页面(不是必需的,但更安全)}
结果:=假;
{如果要求跳过的页面是您的自定义页面,则…}
如果PageID=CustomPageID,则
{如果未选择组件,请跳过页面}
结果:=未选择组件(“帮助”);
结束;

我的观点是使用TWizardPageShouldSkipEvent,我只做了一个案例和要点脚本:

[代码]
变量
TobyDirPage:TInputDirWizardPage;
函数SkipEvent(发送方:TWizardPage):布尔值;
开始
结果:=未选择组件('Toby');
结束;
程序初始化;
开始
TobyDirPage:=CreateInputDirPage(wpSelectComponents,yadda yadda yadda
TobyDirPage.OnShouldSkipPage:=@SkipEvent;
结束;

现在,
OnShouldSkipPage
在按下
wpSelectComponents
上的下一步之后,在
TobyDirPage
被绘制之前立即触发,因为你可以将该事件附加到页面本身,所以你不必去摆弄PageID。

我想这是答案,但我今天一直很忙,我想测试一下。但对我来说,这是个问题好的。谢谢。不客气!如果你需要任何有关这个问题的帮助,请不要犹豫,在这里发表评论;-)谢谢你的回答。如果我选择不检查该组件,页面实际上不会按预期显示,但是如果我首先选择该组件,请查看自定义页面,然后返回到组件选择并更改我的选择-取消选中该组件,将显示自定义页面。。。“有什么办法可以避免这种情况吗?”第一,这不应该发生。你能分享一个可以复制的简约脚本吗?@TLama:他已经保存了向导页面对象,所以不需要缓存它们的ID。签入ShouldSkipPage将类似于
如果(PageID=TobyDirPage.ID),则。。。否则,如果(PageID=SherlockDirPage.ID),则…