In caso di pagine personalizzate nello script NSIS esiste un modo per conservare i dati immessi dall'utente quando si preme il pulsante Indietro (quando l'installazione è in esecuzione)?Conserva i dati nelle pagine personalizzate quando si preme il pulsante Indietro
risposta
È possibile memorizzare i dati in una variabile globale, o in un .ini in $ pluginsdir
ci sono un paio di modi per farlo. In entrambi i casi è necessario memorizzare i dati in globals.
1) Utilizzare una funzione "Invia".
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
L'unico problema di questo metodo è che LeaveCustom solo viene chiamato se si preme il pulsante successivo. Quindi, se modifichi i campi e fai clic sul pulsante Indietro, le tue modifiche andranno perse. Le modifiche vengono tuttavia salvate se vai avanti e poi ritorni.
2) Utilizzare il callback OnChange.
Questo è un po 'più complicato ma risolve il problema con il metodo precedente.
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
Alcuni widget, ad es. RadioButton e CheckBox, utilizzare invece la funzione OnClick. Anche il ComboBox non funziona bene con questo metodo. Tuttavia, un DropList, che non sembra essere documentato, in genere può sostituirlo e funziona correttamente.
I pulsanti di opzione sono anche un po 'complicati perché viene richiamato solo il richiamo del clic per il pulsante selezionato. Ho risolto questo problema aggiornando tutti i valori dei pulsanti radio in ogni pulsante di opzione clic su callback.
Disordinato/noioso ma funziona.
So che è una vecchia domanda, ma sono atterrato qui dal mio google.
È possibile utilizzare NSD_OnBack
(o chiamare direttamente nsDialogs::OnBack
) per impostare la richiamata OnBack
.
Ecco il pezzo di codice presentato:
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
!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
ulteriori informazioni http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#step-memory
Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/17824389) –
Se si dispone di una nuova domanda, si prega di chiedere facendo clic sul pulsante [Chiedi domanda] (https://stackoverflow.com/questions/ask). Includere un collegamento a questa domanda se aiuta a fornire il contesto. - [Dalla recensione] (/ recensione/post di bassa qualità/17824389) –
Puoi dirci di più? Quando eseguo il file di installazione creato da NSIS e inserisco alcuni dati nelle caselle di testo di una pagina personalizzata, fai clic su Avanti e poi sul pulsante Indietro, i dati appena inseriti non vengono mantenuti. Quindi, anche se devo modificare solo alcuni dei valori nella mia pagina precedente, devo scriverli tutti di nuovo mentre la pagina viene ripristinata. – Pia
Non c'è archiviazione automatica dei dati, devi fare tutto da solo – Anders