【问题标题】:NSIS: How do I allow multiple user choice screens that select the sections to install?NSIS:如何允许选择要安装的部分的多个用户选择屏幕?
【发布时间】: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

无论我选择什么,Level1ALevel1B 部分都不会运行。在处理程序和 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


【解决方案1】:

正如 idleberg 所说,正确的语法是 !insertmacro SelectSection ${Level1A},但您会收到警告,因为在 .nsi 中的 Section 指令之后才定义节 ID。您需要将使用${Level1A} 的函数移到源代码部分的下方:

!include nsDialogs.nsh
!include Sections.nsh
Page custom SelectLevel1Opt ProcessLevel1
Page instfiles

Section ""
  MessageBox MB_OK "Common Install"
SectionEnd

Section /o "a" Level1A
  MessageBox MB_OK "Level 1 A"
SectionEnd

Section /o "b" Level1B
  MessageBox MB_OK "Level 1 B"
SectionEnd

Var hInnerDialog
Var hL1A
Var hL1B

Function SelectLevel1Opt
nsDialogs::Create 1018
pop $hInnerDialog
${NSD_CreateLabel} 0 0 100% 12u "Please select level 1 option"
Pop $0
${NSD_CreateRadioButton} 10% 12u 100% 12u "Level 1 A"
Pop $hL1A
nsDialogs::SetUserData $hL1A ${Level1A} ; Only used by the generic function
${NSD_CreateRadioButton} 10% 24u 100% 12u "Level 1 B"
Pop $hL1B
nsDialogs::SetUserData $hL1B ${Level1B} ; Only used by the generic function
nsDialogs::Show
FunctionEnd

Function ProcessLevel1
${NSD_GetState} $hL1A $1
${If} $1 <> ${BST_UNCHECKED}
    !insertmacro SelectSection ${Level1A}
    !insertmacro UnselectSection ${Level1B}
${Else}
    !insertmacro SelectSection ${Level1B}
    !insertmacro UnselectSection ${Level1A}
${EndIf}
FunctionEnd

如果有很多单选按钮,ProcessLevel1 函数也可以实现为循环:

Function ProcessLevel1
StrCpy $0 ""
loop:
    FindWindow $0 "${__NSD_RadioButton_CLASS}" "" $hInnerDialog $0 
    System::Call "USER32::GetWindowLong(p$0,i${GWL_STYLE})i.r1"
    IntOp $1 $1 & ${BS_AUTORADIOBUTTON}
    ${If} $1 = ${BS_AUTORADIOBUTTON} ; Is it a auto radio button?
        nsDialogs::GetUserData $0 ; Get the section id
        Pop $2
        ${NSD_GetState} $0 $1
        ${If} $1 <> ${BST_UNCHECKED}
            !insertmacro SelectSection $2
        ${Else}
            !insertmacro UnselectSection $2
        ${EndIf}
    ${EndIf}
    IntCmp $0 0 "" loop loop
FunctionEnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    相关资源
    最近更新 更多