2010-01-15 14 views

risposta

1

È possibile memorizzare i dati in una variabile globale, o in un .ini in $ pluginsdir

+0

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

+0

Non c'è archiviazione automatica dei dati, devi fare tutto da solo – Anders

5

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.

4

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 
0
!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

+0

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) –

+0

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) –

Problemi correlati