4

ユーザーがインストールするコンポーネントを選択できるようにする非常に単純な NSIS スクリプトがありますが、何も選択していない場合は「コンポーネントを選択してください」と言う方法が必要です。

スクリプトは次のとおりです。

# Based on the one-section example
# http://nsis.sourceforge.net/Examples/one-section.nsi

!include "sections.nsh"

Name "Humira & You"
OutFile "Humira & You - September 2012.exe"
RequestExecutionLevel user

Page components
Page instfiles

Section /o "Rheumatoid Arthritis" P1
    File "/oname=$pluginsdir\Setup.msi" "setupfiles\Humira and you - Rheumatoid Arthritis.msi"
SectionEnd

Section /o "Psoriatic Arthritis" P2
    File "/oname=$pluginsdir\Setup.msi" "setupfiles\Humira and you - Psoriatic Arthritis.msi"
SectionEnd

Section /o "Ankylosing Spondylitis" P3
    File "/oname=$pluginsdir\Setup.msi" "setupfiles\Humira and you - Ankylosing Spondylitis.msi"
SectionEnd

Section /o "Axial Spondyloarthritis" P4
    File "/oname=$pluginsdir\Setup.msi" "setupfiles\Humira and you - Axial Spondyloarthritis.msi"
SectionEnd

Section ; Hidden section that runs the show
    DetailPrint "Installing selected application..."
    SetDetailsPrint none
    ExecWait '"msiexec" /i "$pluginsdir\Setup.msi"'
    SetDetailsPrint lastused
SectionEnd

Function .onInit
    Initpluginsdir ; Make sure $pluginsdir exists
    StrCpy $1 ${P2} ;The default
FunctionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${P1}
    !insertmacro RadioButton ${P2}
    !insertmacro RadioButton ${P3}
    !insertmacro RadioButton ${P4}
!insertmacro EndRadioButtons
FunctionEnd

私は周りを見回して、この例に出くわしましたhttp://nsis.sourceforge.net/Useful_InstallOptions_and_MUI_macros#Macro:_CHECKBOXCHECKER、しかしそれは私が望むものに対して過度に複雑に思えます。NSIS で言う方法はありません:

if ($1.selectedIndex > -1) {
   // continue
} else {
   MessageBox.Show("Please select");
}

ありがとう、グレッグ。

4

1 に答える 1

3

コンポーネントページを離れるときにコールバック関数を使用して、選択されているかどうかを確認できます。

これが私がセットアップで使用するコードの一部です。小さなマクロを使用して、選択したコンポーネントを変数に要約します。存在しない場合、変数はnullです。ブロックを使用してPageExコールバック関数をコンポーネントページに関連付けます(leaveコールバックは3番目のものであるため、最初の2つにはダミー関数を使用します)

交換

Page components

PageEx components
    PageCallbacks DummyFunc DummyFunc componentsLeave
PageExEnd

.onSelChange排他的選択を処理するためにコールバックを保持してから、これをスクリプトの最後に追加します。

!define SECTIONCOUNT 3 ; total -1
;SaveSections adds one bit to the given variable for each selected component
!macro SaveSections VAR
    StrCpy ${VAR} 0
    ${ForEach} $R0 ${SECTIONCOUNT} 0 - 1
        IntOp ${VAR} ${VAR} << 1
        ${If} ${SectionIsSelected} $R0
            ;${DEBUG} "Section $R0 checked"
            IntOp ${VAR} ${VAR} + 1
        ${EndIf}
    ${Next}
!macroend

Function DummyFunc
FunctionEnd

Function componentsLeave
    !insertmacro SaveSections $2
    ${if} $2 = 0
        MessageBox MB_OK|MB_ICONEXCLAMATION "Select something !" /sd IDOK
        Abort
    ${endif}
FunctionEnd
于 2012-09-05T12:14:27.223 に答える