NSIS - 部分依赖 .onSelChange
NSIS - section dependency .onSelChange
我需要一点帮助或建议如何强制 SEC033 和 SEC085 部分以这种方式协同工作:
1. 选择SEC033时,应选择SEC085,不选择SEC033时,应取消选择SEC085至
2. 选择SEC085时,应选择SEC033,未选择SEC085时,应取消选择SEC033至
我的 nsis 部分结构:
SectionGroup "$(SEC03)" SEC03
Section "Product 1" SEC031
SectionIn 1 2
SectionEnd
Section "Product 3" SEC033
SectionIn 1 2
SectionEnd
Section "Product 6" SEC036
SectionIn 1 2
SectionEnd
SectionGroupEnd
SectionGroup "$(SEC08)" SEC08
Section "Product 2" SEC082
SectionIn 1 2
SectionEnd
Section "Product 5" SEC085
SectionIn 1 2
SectionEnd
Section "Product 8" SEC088
SectionIn 1 2
SectionEnd
SectionGroupEnd
我不知道该怎么做,不幸的是我对这一切都不熟悉SectionGetFlags
/SectionSetFlags
我尝试使用这个:
SectionGetFlags ${SEC033} [=11=]
SectionSetFlags ${SEC085} [=11=]
& 对于 SEC033 效果很好
但是当我添加
SectionGetFlags ${SEC085} [=12=]
SectionSetFlags ${SEC033} [=12=]
SEC085 根本无法工作,我知道这完全相同,但方式相反,可能这就是问题所在,但我不知道如何解决它....:/
好的,我已经创建了一个解决方案,也许有人也需要它:)
SectionGetFlags ${SEC033}
SectionGetFlags ${SEC085}
StrCpy ""
${If} == "1"
${If} == "01"
SectionSetFlags ${SEC033} 1
StrCpy "0"
${Else}
${If} == "10"
SectionSetFlags ${SEC085} 1
StrCpy "0"
${Else}
${EndIf}
${EndIf}
${Else}
${If} == "10"
SectionSetFlags ${SEC033} 0
StrCpy "1"
${Else}
${If} == "01"
SectionSetFlags ${SEC085} 0
StrCpy "1"
${Else}
${EndIf}
${EndIf}
${EndIf}
节标志不仅存储选中状态,它还存储组、粗体和只读标志,因此您不应使用 SectionSetFlags
将状态设置为仅 0 或 1。Sections.nsh 包含每个位的定义,它还包含可用于操作部分的辅助宏。如果你想手动查看一个部分是否被选中(选择),你必须使用位测试:
SectionGetFlags ${SEC033}
IntOp & ${SF_SELECTED}
LogicLib.nsh 包含允许您检查 ${If} 语句中的部分的宏:
!include Sections.nsh
!include LogicLib.nsh
Function .onSelChange
${If} == "1" ; Use here like you did in your answer
StrCpy 0
${If} ${SectionIsSelected} ${SEC033}
${OrIf} ${SectionIsSelected} ${SEC085}
!insertmacro SelectSection ${SEC033}
!insertmacro SelectSection ${SEC085}
${EndIf}
${Else}
StrCpy 1
${IfNot} ${SectionIsSelected} ${SEC033}
${OrIfNot} ${SectionIsSelected} ${SEC085}
!insertmacro UnselectSection ${SEC033}
!insertmacro UnselectSection ${SEC085}
${EndIf}
${EndIf}
我需要一点帮助或建议如何强制 SEC033 和 SEC085 部分以这种方式协同工作:
1. 选择SEC033时,应选择SEC085,不选择SEC033时,应取消选择SEC085至
2. 选择SEC085时,应选择SEC033,未选择SEC085时,应取消选择SEC033至
我的 nsis 部分结构:
SectionGroup "$(SEC03)" SEC03
Section "Product 1" SEC031
SectionIn 1 2
SectionEnd
Section "Product 3" SEC033
SectionIn 1 2
SectionEnd
Section "Product 6" SEC036
SectionIn 1 2
SectionEnd
SectionGroupEnd
SectionGroup "$(SEC08)" SEC08
Section "Product 2" SEC082
SectionIn 1 2
SectionEnd
Section "Product 5" SEC085
SectionIn 1 2
SectionEnd
Section "Product 8" SEC088
SectionIn 1 2
SectionEnd
SectionGroupEnd
我不知道该怎么做,不幸的是我对这一切都不熟悉SectionGetFlags
/SectionSetFlags
我尝试使用这个:
SectionGetFlags ${SEC033} [=11=]
SectionSetFlags ${SEC085} [=11=]
& 对于 SEC033 效果很好
但是当我添加
SectionGetFlags ${SEC085} [=12=]
SectionSetFlags ${SEC033} [=12=]
SEC085 根本无法工作,我知道这完全相同,但方式相反,可能这就是问题所在,但我不知道如何解决它....:/
好的,我已经创建了一个解决方案,也许有人也需要它:)
SectionGetFlags ${SEC033}
SectionGetFlags ${SEC085}
StrCpy ""
${If} == "1"
${If} == "01"
SectionSetFlags ${SEC033} 1
StrCpy "0"
${Else}
${If} == "10"
SectionSetFlags ${SEC085} 1
StrCpy "0"
${Else}
${EndIf}
${EndIf}
${Else}
${If} == "10"
SectionSetFlags ${SEC033} 0
StrCpy "1"
${Else}
${If} == "01"
SectionSetFlags ${SEC085} 0
StrCpy "1"
${Else}
${EndIf}
${EndIf}
${EndIf}
节标志不仅存储选中状态,它还存储组、粗体和只读标志,因此您不应使用 SectionSetFlags
将状态设置为仅 0 或 1。Sections.nsh 包含每个位的定义,它还包含可用于操作部分的辅助宏。如果你想手动查看一个部分是否被选中(选择),你必须使用位测试:
SectionGetFlags ${SEC033}
IntOp & ${SF_SELECTED}
LogicLib.nsh 包含允许您检查 ${If} 语句中的部分的宏:
!include Sections.nsh
!include LogicLib.nsh
Function .onSelChange
${If} == "1" ; Use here like you did in your answer
StrCpy 0
${If} ${SectionIsSelected} ${SEC033}
${OrIf} ${SectionIsSelected} ${SEC085}
!insertmacro SelectSection ${SEC033}
!insertmacro SelectSection ${SEC085}
${EndIf}
${Else}
StrCpy 1
${IfNot} ${SectionIsSelected} ${SEC033}
${OrIfNot} ${SectionIsSelected} ${SEC085}
!insertmacro UnselectSection ${SEC033}
!insertmacro UnselectSection ${SEC085}
${EndIf}
${EndIf}