Есть несколько способов сделать это. В любом случае вам нужно хранить ваши данные в глобальных файлах.
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, который, похоже, не документирован, обычно может заменить его и работает нормально.
Радиокнопки также немного хитры, потому что вызывается только обратный вызов для выбранной кнопки. Я решил эту проблему, обновив все значения переключателей в каждом обратном вызове переключателя.
Грязно / нудно, но работает.