Nsis 按下“后退”按钮时保留自定义页面上的数据

Nsis 按下“后退”按钮时保留自定义页面上的数据,nsis,Nsis,对于NSIS脚本中的自定义页面,当按下“后退”按钮时(安装程序正在运行时),是否有任何方法保留用户输入的数据 您可以将数据存储在全局变量中,或者存储在$pluginsdir的.ini中。有几种方法可以实现这一点。无论哪种方式,您都需要将数据存储在globals中 1) 使用“离开”功能 Page custom EnterCustom LeaveCustom ; Create two variables for each value/widget pair Var Text Var TextWi

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

您可以将数据存储在全局变量中,或者存储在$pluginsdir的.ini中。有几种方法可以实现这一点。无论哪种方式,您都需要将数据存储在globals中

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
一些小部件(例如单选按钮和复选框)使用OnClick函数。此外,组合框不能很好地使用此方法。然而,一个液滴列表,它似乎没有被记录,通常可以取代它,工作良好

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


杂乱/乏味,但有效。

我知道这是一个老问题,但我是通过谷歌搜索到的

您可以使用(或直接调用)设置
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

更多信息

您能详细说明一下吗?当我运行NSIS创建的安装文件并在自定义页面的文本框中输入一些数据时,单击“下一步”,然后单击“上一步”按钮,我刚才输入的数据不会被保留。因此,即使我只需要更改上一页上的几个值,我也必须在页面重置时重新写入所有值。没有自动存储数据,您必须自己完成所有操作
!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