在按下后退按钮(当安装程序正在运行时)时,将NSIS脚本中的自定义页面保存为由用户保留输入的数据的方式?当按下后退按钮时保留自定义页面上的数据
回答
您可以将数据存储在一个全局变量,或在$ PLUGINSDIR一个的.ini
有几个方法可以做到这一点。无论哪种方式,你需要将数据存储在全局变量中。
1)使用“离开”功能。
Page custom EnterCustom LeaveCustom
; Create two variables for each value/widget pair
Var Text
Var TextWidget
Var Check
Var CheckWidget
Function EnterCustom
nsDialogs::Create 1018
Pop $0
${NSD_CreateText} 0 0 80u 12u $Text
Pop $TextWidget
${NSD_CreateCheckBox} 0 26u 80u 12u "Check this box"
Pop $CheckWidget
${NSD_SetState} $CheckWidget $Check
nsDialogs::Show
FunctionEnd
Function LeaveCustom
${NSD_GetText} $TextWidget $Text
${NSD_GetState} $CheckWidget $Check
FunctionEnd
此方法唯一的问题是只有在您点击下一个按钮时才会调用LeaveCustom。所以如果你编辑字段,然后点击返回按钮,你的改变就会丢失。然而,如果你继续前进然后回来,这些变化就会得到保存。
2)使用OnChange回调。
这有点复杂,但解决了以前的方法的问题。
Page custom EnterCustom
Var Initialized
; Create two variables for each value/widget pair
Var Text
Var TextWidget
Var Check
Var CheckWidget
Function EnterCustom
nsDialogs::Create 1018
Pop $0
${If} $Initialized != "True"
; Set defaults for all your values here
StrCpy $Text "Initial Value"
StrCpy $Check ${BST_UNCHECKED}
StrCpy $Initialized "True"
${EndIf}
; Create and configure all of your widgets
${NSD_CreateText} 0 0 80u 12u $Text
Pop $TextWidget
${NSD_OnChange} $TextWidget OnTextChange
${NSD_CreateCheckBox} 0 26u 80u 12u "Check this box"
Pop $CheckWidget
${NSD_SetState} $CheckWidget $Check
${NSD_OnClick} $CheckWidget OnCheckClick
nsDialogs::Show
FunctionEnd
; Create a callback function for each Widget
Function OnTextChange
Pop $0 ; Widget handle is on stack
${NSD_GetText} $TextWidget $Text
FunctionEnd
Function OnCheckClick
Pop $0 ; Widget handle is on stack
${NSD_GetState} $CheckWidget $Check
FunctionEnd
一些小部件,例如, RadioButtons和CheckBoxes,而是使用OnClick函数。此外ComboBox不能很好地使用这种方法。但是,似乎没有记录的DropList通常可以替代它并且工作正常。
单选按钮也有点棘手,因为只调用所选按钮的点击回调。我通过更新每个单选按钮单击回调中的所有单选按钮值来解决此问题。
凌乱/繁琐,但它的作品。
我知道这是一个古老的问题,但我已经从我的谷歌搜索降落在这里。
您可以使用NSD_OnBack
(或直接拨打nsDialogs::OnBack
)设置OnBack
回拨。
下面是一小段代码片段:
Function portsSelectionPage
nsDialogs::Create 1018
Pop $0
${NSD_CreateNumber} 70u 0 40u 12u $TomcatPort
Pop $TomcatPortHWND
${NSD_CreateNumber} 70u 14u 40u 12u $PostgresPort
Pop $PostgresPortHWND
nsDialogs::Show
${NSD_OnBack} "portsSelectionPageLeave"
FunctionEnd
Function portsSelectionPageLeave
${NSD_GetText} $TomcatPortHWND $TomcatPort
${NSD_GetText} $PostgresPortHWND $PostgresPort
FunctionEnd
!include nsDialogs.nsh
!include LogicLib.nsh
Name nsDialogs
OutFile nsDialogs.exe
XPStyle on
Var Dialog
Var Label
Var Text
Var Text_State
Var Checkbox
Var Checkbox_State
Page custom nsDialogsPage nsDialogsPageLeave
Page license
Page instfiles
Function .onInit
StrCpy $Text_State "Type something here..."
FunctionEnd
Function nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
Pop $Label
${NSD_CreateText} 0 13u 100% 12u $Text_State
Pop $Text
${NSD_CreateCheckbox} 0 30u 100% 10u "&Something"
Pop $Checkbox
${If} $Checkbox_State == ${BST_CHECKED}
${NSD_Check} $Checkbox
${EndIf}
# alternative for the above ${If}:
#${NSD_SetState} $Checkbox_State
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetText} $Text $Text_State
${NSD_GetState} $Checkbox $Checkbox_State
FunctionEnd
Section
DetailPrint "hello world"
SectionEnd
更多信息http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#step-memory
这并没有提供一个问题的答案。一旦你有足够的[声誉](https://stackoverflow.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/17824389) – 2017-11-03 10:44:27
如果您有新问题,请点击[Ask Question](问问题)(https://stackoverflow.com/questions/ask)按钮。如果有助于提供上下文,请包含此问题的链接。 - [来自评论](/ review/low-quality-posts/17824389) – 2017-11-03 10:55:01
你能更详细?当我运行由NSIS创建的安装文件并在自定义页面的文本框中输入一些数据时,单击下一步,然后单击后退按钮,我刚刚输入的数据不会保留。所以,即使我只需要更改前一页中的几个值,我也必须在页面重置时再次将所有这些值全部写入。 – Pia 2010-01-15 08:34:43
没有数据的自动存储,你必须自己做这一切 – Anders 2010-01-15 10:02:51