【问题标题】:Retain data on custom pages when back button is pressed按下后退按钮时保留自定义页面上的数据
【发布时间】:2010-01-15 06:27:50
【问题描述】:

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

【问题讨论】:

    标签: nsis


    【解决方案1】:

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

    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 通常可以替换它并且工作正常。

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

    凌乱/乏味,但它有效。

    【讨论】:

      【解决方案2】:

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

      您可以使用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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

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

        【讨论】:

          猜你喜欢
          • 2015-09-03
          • 2016-10-04
          • 2021-12-18
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          • 2016-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多