【发布时间】:2016-06-08 02:35:19
【问题描述】:
我正在尝试创建一个安装程序,它会询问用户一系列问题以决定要安装哪些组件。每个选择(可能)都会影响以后选择中的可用选项(否则我只会做一个普通的组件页面——我不想给用户无效的选项)。
我该如何完成这样的事情?如果我只使用组件页面,则显示所有选项,其中一些组合完全无效。我不想让用户选择那些。 是否可以省略组件页面?
这是我正在尝试的最小工作示例。 (抱歉,太长了,我无法真正简化对话代码。)
!include nsDialogs.nsh
!include Sections.nsh
Name "mwe"
OutFile "mwe.exe"
InstallDir C:\mwe
Var hwnd
Var Level1Opt
Page custom SelectLevel1Opt ProcessLevel1
Function SelectLevel1Opt
nsDialogs::Create 1018
pop $hwnd
${NSD_CreateLabel} 0 0 100% 12u "Please select level 1 option"
Pop $hwnd
${NSD_CreateRadioButton} 10% 12u 100% 12u "Level 1 A"
Pop $hwnd
nsDialogs::SetUserData $hwnd "Level 1 A"
${NSD_OnClick} $hwnd SetLevel1
${NSD_CreateRadioButton} 10% 24u 100% 12u "Level 1 B"
Pop $hwnd
nsDialogs::SetUserData $hwnd "Level 1 B"
${NSD_OnClick} $hwnd SetLevel1
nsDialogs::Show
FunctionEnd
Function SetLevel1
Pop $hwnd
nsDialogs::GetUserData $hwnd
Pop $Level1Opt
MessageBox MB_OK "Selected: $Level1Opt"
FunctionEnd
Function ProcessLevel1
${If} $Level1Opt == "Level 1 A"
!insertmacro SelectSection Level1A
${ElseIf} $Level1Opt == "Level 1 B"
!insertmacro SelectSection Level1B
${EndIf}
FunctionEnd
Page directory
Page instfiles
Section ""
MessageBox MB_OK "Common Install"
SectionEnd
Section /o "" Level1A
MessageBox MB_OK "Level 1 A"
SectionEnd
Section /o "" Level1B
MessageBox MB_OK "Level 1 B"
SectionEnd
无论我选择什么,Level1A 和 Level1B 部分都不会运行。在处理程序和 post 函数中正确检测到对话框中的选择。但是,选择这些部分不会导致它们运行。即使我添加了一个组件页面,它们都没有被选中。
我查看了Selection.nsh,它引用的示例 (one-section.nsi) 并没有真正做到我想要的,因为它使用了组件页面。 (我也不太明白它是如何工作的。)
我做错了什么?我以什么方式误解了 NSIS 的工作方式?
【问题讨论】:
-
不应该是
insertmacro SelectSection ${Level1A}吗? -
@idleberg 我这样做时没有看到任何不同的行为,除了编译时的警告消息:
unknown variable/constant "{Level1A}" detected, ignoring (macro:SelectSection:4) -
$Level1Opt在 ProcessLevel1 中有任何值吗?如果没有,请在离开函数中获取单选按钮的状态。 PS:我会自己测试,但我目前不在 Windows 上。 -
我在那里添加了一个消息框语句,它得到了我期望的值:
"Level 1 A"或"Level 1 B"。
标签: nsis