Сохранять данные на пользовательских страницах при нажатии кнопки «Назад» - PullRequest
7 голосов
/ 15 января 2010

Включает ли пользовательские страницы в скрипт NSIS, есть ли способ сохранить данные, введенные пользователем, когда нажата кнопка «назад» (когда работает установщик)?

Ответы [ 4 ]

5 голосов
/ 28 декабря 2010

Есть несколько способов сделать это. В любом случае вам нужно хранить ваши данные в глобальных файлах.

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, который, похоже, не документирован, обычно может заменить его и работает нормально.

Радиокнопки также немного хитры, потому что вызывается только обратный вызов для выбранной кнопки. Я решил эту проблему, обновив все значения переключателей в каждом обратном вызове переключателя.

Грязно / нудно, но работает.

5 голосов
/ 26 апреля 2013

Я знаю, что это старый вопрос, но я приземлился здесь из-за моего поиска.

Вы можете использовать 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
1 голос
/ 15 января 2010

Вы можете хранить данные в глобальной переменной или в .ini в $ pluginsdir

0 голосов
/ 03 ноября 2017
!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

...