按下后退按钮时,在自定义页面上保留数据

Pia*_*Pia 7 nsis

NSIS脚本中的自定义页面是否有任何方法可以保留用户在按下后退按钮时(安装程序运行时)输入的数据?

jco*_*and 5

有几种方法可以做到这一点.无论哪种方式,您都需要将数据存储在全局变量中.

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
Run Code Online (Sandbox Code Playgroud)

此方法的唯一问题是,只有在按下下一个按钮时才会调用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
Run Code Online (Sandbox Code Playgroud)

一些小部件,例如RadioButtons和CheckBoxes,使用OnClick功能.此外,ComboBox与此方法不兼容.但是,DropList似乎没有记录,通常可以替换它并且工作正常.

单选按钮也有点棘手,因为只调用所选按钮的单击回调.我通过更新每个单选按钮单击回调中的所有单选按钮值来解决此问题.

凌乱/乏味,但它的工作原理.


mad*_*ead 5

我知道这是一个老问题,但我已经从我的谷歌搜索到了这里.

您可以使用NSD_OnBack(或nsDialogs::OnBack直接调用)来设置OnBack回调.

这是代码snipet:

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
Run Code Online (Sandbox Code Playgroud)


And*_*ers 1

您可以将数据存储在全局变量中,或 $pluginsdir 中的 .ini 中