杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2279|回复: 1

NSIS 自定义页面结合组件选择安装

[复制链接]
发表于 2015-1-23 15:01:33 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:
如何控制一个自定义页面的显示与否,例如把一个"数据库操作"做为一个组件选项,而组件选项的下一页(即自定义页面)就是输入数据库连接信息,但是,当用户没有选择"数据库操作"这个组件时,点下一步仍然会出现输入数据库密码页面,怎样做出一个判断:当用户选择"数据库操作"时,下一页为提示输入数据库密码页面,当用户没有选择"数据库操作"时,下一页为安装页面(MUI_PAGE_INSTFILES),即跳过了提示输入数据库密码页面。

以下是一个脚本例子,没有作数据库操作的内容,把问题简单化。
  1. 以下是代码片段:
  2. /*---------------------------------------
  3. 自定义页面结合组件选择安装测试简单脚本。
  4. -----------------------------------------*/

  5. !include "MUI.nsh"
  6. !include "Sections.nsh"

  7. Name "自定义页面结合组件选择测试"
  8. OutFile "Setup.exe"

  9. !insertmacro MUI_PAGE_COMPONENTS
  10. Page custom PageInitFunc PageLeaveFunc ""  # 自定义页面
  11. !insertmacro MUI_PAGE_INSTFILES

  12. !insertmacro MUI_LANGUAGE "SimpChinese"  # 设置安装界面语言

  13. ShowInstDetails show # 显示安装进度信息

  14. ReserveFile "io.ini" # 预先打包文件,方便安装加速释放 io.ini
  15. !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS  # 预先打包文件,方便安装加速释放

  16. Var SHOW_PAGE  # 是否显示自定义页面

  17. Function .onInit
  18.   StrCpy $SHOW_PAGE "show" # 初始化设显示自定义页面, 如果你默认不打勾,请用 StrCpy $SHOW_PAGE ""
  19.   !insertmacro MUI_INSTALLOPTIONS_EXTRACT "io.ini"  # 初始化页面
  20. FunctionEnd

  21. Function PageInitFunc
  22.   StrCmp $SHOW_PAGE "show" 0 +2 # 如果没有设置“show”则跳过下面的页面显示
  23.   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "io.ini"  # 显示页面
  24. FunctionEnd

  25. Function PageLeaveFunc
  26.   MessageBox MB_OK "自定义页面离开时操作,即点击下一步后触发的事件"
  27. FunctionEnd

  28. Section "数据库处理(自定义页面)" SEC1
  29.   # 所有数据库处理在这里写
  30.   MessageBox MB_OK "“数据库处理(自定义页面)”操作内容"
  31. SectionEnd

  32. Section "其他操作" SEC2
  33. # 这里填写其他组件的操作
  34.   MessageBox MB_OK "“其他操作”操作内容"
  35. SectionEnd

  36. Function .onSelChange
  37.   Push $0
  38.     SectionGetFlags ${SEC1} $0  # 检测 SEC1 的选择状态,1为已勾选该组件
  39.     IntOp $0 $0 & ${SF_selectED} # 只过滤勾选的状态,Checkbox 的状态可能包含多位
  40.     ;如果为 1 则设置显示自定义页面
  41.     IntCmp $0 ${SF_selectED} showpage
  42.       StrCpy $SHOW_PAGE "" # 设置不显示自定义页面
  43.       Goto done
  44.     showpage:
  45.       StrCpy $SHOW_PAGE "show" # 设置显示自定义页面
  46.     done:
  47.   Pop $0
  48. FunctionEnd
复制代码
  1. 以下是代码片段:
  2. [Settings]
  3. NumFields=7

  4. [Field 1]
  5. Type=label
  6. Text=SQLServer 连接
  7. Left=0
  8. Right=-1
  9. Top=0
  10. Bottom=9

  11. [Field 2]
  12. Type=Text
  13. Left=40
  14. Right=163
  15. Top=22
  16. Bottom=35

  17. [Field 3]
  18. Type=Text
  19. Left=39
  20. Right=163
  21. Top=43
  22. Bottom=54

  23. [Field 4]
  24. Type=Password
  25. Left=39
  26. Right=163
  27. Top=62
  28. Bottom=75

  29. [Field 5]
  30. Type=Label
  31. Text=密码:
  32. Left=8
  33. Right=36
  34. Top=65
  35. Bottom=75

  36. [Field 6]
  37. Type=Label
  38. Text=账号:
  39. Left=8
  40. Right=38
  41. Top=46
  42. Bottom=56

  43. [Field 7]
  44. Type=Label
  45. Text=服务器:
  46. Left=6
  47. Right=34
  48. Top=27
  49. Bottom=36
复制代码








回复

使用道具 举报

发表于 2017-2-26 10:54:25 | 显示全部楼层
前一个例子是在 .onSelChange 中实现实时设定是否显示下一个自定义页面的方法。但是这种方法需要定义一个变量,而且需要每次点击“组件”的时候都会触发事件,显得过于累赘。下面这个例子是在下一个页面的初始化时检测组件选择,从而达到是否显示自定义页面的效果。

  1. /*---------------------------------------
  2. 自定义页面结合组件选择安装测试简单脚本。
  3. -----------------------------------------*/

  4. !include "MUI.nsh"
  5. !include "Sections.nsh"

  6. Name "自定义页面结合组件选择测试"
  7. OutFile "Setup.exe"

  8. !insertmacro MUI_PAGE_COMPONENTS
  9. Page custom PageInitFunc PageLeaveFunc ""  # 自定义页面
  10. !insertmacro MUI_PAGE_INSTFILES

  11. !insertmacro MUI_LANGUAGE "SimpChinese"  # 设置安装界面语言

  12. ShowInstDetails show # 显示安装进度信息

  13. ReserveFile "io.ini" # 预先打包文件,方便安装加速释放 io.ini
  14. !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS  # 预先打包文件,方便安装加速释放

  15. Function .onInit
  16.   !insertmacro MUI_INSTALLOPTIONS_EXTRACT "io.ini"  # 初始化页面
  17. FunctionEnd

  18. Function PageInitFunc
  19.   SectionGetFlags ${SEC1} $0  # 检测 SEC1 的选择状态,1为已勾选该组件
  20.   IntOp $0 $0 & ${SF_selectED} # 只过滤勾选的状态,Checkbox 的状态可能包含多位
  21.   IntCmp $0 ${SF_selectED} showpage hidepage hidepage
  22.   showpage:
  23.   !insertmacro MUI_INSTALLOPTIONS_DISPLAY "io.ini"  # 显示页面
  24.   hidepage:
  25. FunctionEnd

  26. Function PageLeaveFunc
  27.   MessageBox MB_OK "自定义页面离开时操作,即点击下一步后触发的事件"
  28. FunctionEnd

  29. Section "数据库处理(自定义页面)" SEC1
  30.   # 所有数据库处理在这里写
  31.   MessageBox MB_OK "“数据库处理(自定义页面)”操作内容"
  32. SectionEnd

  33. Section "其他操作" SEC2
  34. # 这里填写其他组件的操作
  35.   MessageBox MB_OK "“其他操作”操作内容"
  36. SectionEnd
复制代码

  1. [Settings]
  2. NumFields=7

  3. [Field 1]
  4. Type=label
  5. Text=SQLServer 连接
  6. Left=0
  7. Right=-1
  8. Top=0
  9. Bottom=9

  10. [Field 2]
  11. Type=Text
  12. Left=40
  13. Right=163
  14. Top=22
  15. Bottom=35

  16. [Field 3]
  17. Type=Text
  18. Left=39
  19. Right=163
  20. Top=43
  21. Bottom=54

  22. [Field 4]
  23. Type=Password
  24. Left=39
  25. Right=163
  26. Top=62
  27. Bottom=75

  28. [Field 5]
  29. Type=Label
  30. Text=密码:
  31. Left=8
  32. Right=36
  33. Top=65
  34. Bottom=75

  35. [Field 6]
  36. Type=Label
  37. Text=账号:
  38. Left=8
  39. Right=38
  40. Top=46
  41. Bottom=56

  42. [Field 7]
  43. Type=Label
  44. Text=服务器:
  45. Left=6
  46. Right=34
  47. Top=27
  48. Bottom=36
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-17 21:25 , Processed in 0.104015 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表