2010-01-15 18 views

Respuesta

1

Es posible almacenar datos en una variable global, o en un .ini en $ pluginsdir

+0

¿Puede usted explicar más? Cuando ejecuto el archivo de configuración creado por NSIS e ingreso algunos datos en cuadros de texto de una página personalizada, hago clic en Siguiente y luego en el botón Atrás, los datos que acabo de ingresar no se conservan. Así que incluso si tengo que cambiar solo algunos de los valores en mi página anterior, tengo que volver a escribirlos todos una vez que la página se restablezca. – Pia

+0

No hay almacenamiento automático de datos, tiene que hacerlo todo por su cuenta – Anders

5

Hay un par de maneras de hacer esto. De cualquier manera, necesita almacenar sus datos en forma global.

1) Use la función "Dejar".

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 

El único problema con este método es que sólo se LeaveCustom se llama a si se pulsa el botón siguiente. Por lo tanto, si edita los campos, haga clic en el botón Atrás y se perderán sus cambios. Sin embargo, los cambios se guardan si avanzas y vuelves.

2) Use la devolución de llamada OnChange.

Esto es un poco más complicado pero resuelve el problema con el método anterior.

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 

Algunos widgets, p. Ej. RadioButtons y CheckBoxes, use la función OnClick en su lugar. Además, el ComboBox no funciona bien con este método. Sin embargo, una DropList, que no parece estar documentada, generalmente puede reemplazarla y funciona bien.

Los botones de radio también son un poco complicados porque solo se llama a la devolución de llamada por clic para el botón seleccionado. Lo resolví actualizando todos los valores del botón de opción en cada botón de radio, haga clic en devolución de llamada.

Desordenado/tedioso pero funciona.

4

Sé que es una vieja pregunta, pero he aterrizado aquí desde mi Google.

Puede usar NSD_OnBack (o llame al nsDialogs::OnBack directamente) para establecer la devolución de llamada OnBack.

Aquí está el código de snipet:

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 

más información http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#step-memory

+0

Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (https://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (https://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la crítica] (/ review/low-quality-posts/17824389) –

+0

Si tiene una nueva pregunta, hágalo haciendo clic en el botón [Ask Question] (https://stackoverflow.com/questions/ask). Incluye un enlace a esta pregunta si ayuda a proporcionar contexto. - [De la crítica] (/ review/low-quality-posts/17824389) –

Cuestiones relacionadas