返回列表 回复 发帖

NSIS教程1:两组件互斥 作者iMac

这个虽然是和教程2有点重复可是这个可是真正的原贴啊

转自狂人论坛  作者iMac

最近会写点教程,对QQ安装包制作有兴趣,且对NSIS脚本有一定了解的人可以来看看,保证有百利无一弊。呵呵……谢绝灌水

组件A,组件B,两组件互斥。

意思就是组件A与B不能同时安装,
选择组建A时,组件B自动被取消选择,
而当B被勾选时,A被自动取消选择。

实现起来的脚本:
  1. Function .onSelChange
  2. SectionGetFlags ${secA} $1
  3. SectionGetFlags ${secB} $2
  4. StrCmp $2 1 0 +2
  5. SectionSetFlags ${secA} 0
  6. StrCmp $1 1 0 +2
  7. SectionSetFlags ${secB} 0
  8. FunctionEnd
复制代码
将此代码复制到最后一个Sectiongroupend(如果没有就是Sectionend)的后面即可。其中SecA、SecB分别改为你要定义的互斥软件的编号

案例分析:
QQ狂人DIY版的2005.10.29组件包里面有2个不同的外挂,狂人将其分别定义为Sec03和SecWG3,我们想让4.x外挂被选时3.x自动被取消,可以使用这样的代码
  1. Function .onSelChange
  2. SectionGetFlags ${sec03} $1
  3. SectionGetFlags ${secWG3} $2
  4. StrCmp $2 1 0 +2
  5. SectionSetFlags ${sec03} 0
  6. StrCmp $1 1 0 +2
  7. SectionSetFlags ${secWG3} 0
  8. FunctionEnd
复制代码
因为狂人组件包里面已经有Function .onSelChange以及FunctionEnd,因此我们只需要把
  1. SectionGetFlags ${sec03} $1
  2. SectionGetFlags ${secWG3} $2
  3. StrCmp $2 1 0 +2
  4. SectionSetFlags ${sec03} 0
  5. StrCmp $1 1 0 +2
  6. SectionSetFlags ${secWG3} 0
复制代码
添加到Function .onSelChange以及FunctionEnd之间,最好在FunctionEnd的上一行,就OK了
学习中。.
为什么在狂人都没看到?
写得不错,学学习了  
是这样做了 但是多的时候 就像这个
  1. Function .onSelChange
  2. SectionGetFlags ${SEC01} $1  ;1 为同装SP补丁和保姆
  3. SectionGetFlags ${SEC02} $2  ;2为SP补丁
  4. SectionGetFlags ${SEC03} $3  ;3为SP保姆
  5. SectionGetFlags ${SEC04} $4  ;4为3.01补丁
  6. SectionGetFlags ${SEC05} $5 ;5为主文件
  7. SectionGetFlags ${SEC06} $6  ;6为5.30重启
  8. SectionGetFlags ${SEC07} $7  ;7为同装5.30保姆和重启
  9. ;     IntOp $1 $1 & 1
  10. ;      IntOp $2 $2 & 1
  11. ;      IntOp $3 $3 & 1
  12. ;      IntOp $4 $4 & 1
  13. ;      IntOp $5 $5 & 1
  14. ;StrCmp $5 1 +2 +1 ;
  15. ;SectionSetFlags ${SEC01} 1
  16. ;StrCmp $3 1 +3 +1  ;勾选状态下 点击就飞到+4了  非勾选状态会飞到+1
  17. StrCmp $2 1 0 +3
  18. SectionSetFlags ${SEC05} 1
  19. SectionSetFlags ${SEC04} 0
  20. StrCmp $4 1 0 +3
  21. SectionSetFlags ${SEC05} 1
  22. SectionSetFlags ${SEC02} 0
  23. StrCmp $3 1 0 +2
  24. SectionSetFlags ${SEC06} 0
  25. StrCmp $6 1 0 +2
  26. SectionSetFlags ${SEC03} 0
  27. FunctionEnd
复制代码
当选择区段4的时候 区段2的勾是消了 但是区段4并没有勾上 要再选择一次区段4 区段4的勾才勾上 就算在那段加上SectionSetFlags ${SEC04} 1 也没用 要怎么做?

[ 本帖最后由 guanyouan 于 2008-7-26 10:28 PM 编辑 ]
当区段非常多的时候就用区段组;直接区段组进行互斥;当然要进行组的互斥时最好先把需要互斥区段设置为不能选择;即是为 "灰" ...
空中飘灰尘和那片落叶......
原帖由 不死帝国 于 2008-7-27 07:40 PM 发表
当区段非常多的时候就用区段组;直接区段组进行互斥;当然要进行组的互斥时最好先把需要互斥区段设置为不能选择;即是为 "灰" ...
区段组怎么设置?有没有相关的例子 one-section.nsi 里的不是很懂 那个是把$1定义g101区段 但是怎么会分开上下两段互斥 而且用!insertmacro StartRadioButtons  这个最大的问题是 里面设置的互斥区段 只要选择了设置的互斥区段 就不能取消 必须有一个勾上。
返回列表