您可以使用条件编译:
!define INCLUDESECTION
!ifdef INCLUDESECTION
Section "section1"
...
SectionEnd
!endif
您还可以从命令行决定是否包含该部分:
makensis.exe /DINCLUDESECTION example.nsi
在这种情况下,您不必在您的nsis代码中定义INCLUDESECTION。
在编译时禁用部分以避免它的选择/执行是个坏主意,因为:
- 所有关于代码运行时行为的部分,而不是编译时间。否则它会产生一组无限的!ifdef ...!endif用于区段范围控制和英国媒体报道软件编译定义,如同你的INCLUDESECTION一样。
- 在某些时候,您需要在运行时切换节选择/可见性,这将迫使您混合运行时和编译时间代码甚至更糟。
醇>
我可能认为这一切都来自于运行时中部分选择/隐藏行为的无效未知。因此,为了确保在运行时使用节选择/隐藏没有太多问题,您必须了解几个要考虑的事项:
- 在通过SysTreeView32控件实现的Windows部分中,继承/解决此类控件引入的所有问题。这意味着你必须在Page Pre(OnCreate)函数中隐藏/取消隐藏部分(控件项)而不是Page Show(OnShow)函数,它主要用于控制部分可见性状态。
- 即使隐藏,部分仍然可以运行,因为隐藏状态与选择状态无关。要隐藏部分,必须在相应的控制项目标志引入选择状态时将空字符串设置为部分名称。因此,在某些情况下,您可能必须在部分代码块中测试部分隐藏性以跳过它的进一步执行。
- 父节选择会通过控件递归触发子节点选择。但是因为隐藏的不是只读的子节点也会选择,你必须在.onSelChange处理函数的末尾手动更新父节选择状态“Partial Selected”/“All Selected”/“All Unselected”以修复控件复选框的可见性这是实际的外观。
醇>
所以,要做好所有事情,你必须:
- 编写UpdateSectionGroupSelectionN宏的集合以对每个部分组可见性状态更新进行后处理,其中N - 是部分中的子项目数。如果选择了一个部分中没有隐藏的子项,则必须将父级更新为“全部选定”状态。如果选择了某个部分中未隐藏的子项,则必须将父级更新为“部分选定”状态。如果隐藏了所有子项,那么你必须决定如何处理这些父项(可能它甚至不应该更改,或者也必须在Page Pre函数中隐藏)。
- 如果其他部分邻居可能被隐藏或者出于其他原因,请添加到部分隐藏状态检查代码以绕过部分进一步执行。
醇>
我知道所有人都说这有点棘手,但是你会发现这种方式几乎是一种解决所有部分问题的常用方法,并且可以避免代码进一步复杂化。