En caso de páginas personalizadas en el script NSIS, ¿hay alguna manera de retener los datos ingresados por el usuario cuando se presiona el botón Atrás (cuando el instalador se está ejecutando)?Retener datos en páginas personalizadas cuando se presiona el botón Atrás
Respuesta
Es posible almacenar datos en una variable global, o en un .ini en $ pluginsdir
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.
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
!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
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) –
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) –
- 1. setResult no funciona cuando se presiona el botón ATRÁS
- 2. guarda el estado cuando se presiona el botón Atrás
- 3. ¿Cómo elimino una actividad cuando se presiona el botón Atrás?
- 4. Borrar el foco EditText cuando se presiona el botón Atrás cuando el teclado está mostrando
- 5. ¿Cómo realizo la página de recarga de Firefox cuando se presiona el botón Atrás?
- 6. Diálogo que se muestra dos veces cuando se presiona el botón Atrás
- 7. ¿Cómo llamar a un método cuando se presiona el botón Atrás en un UINavigationController? (iPhone)
- 8. Android: Pedir al usuario que guarde los cambios cuando se presiona el botón Atrás
- 9. Android - Detener AsyncTask cuando se presiona el botón Atrás y volver a la Actividad anterior
- 10. Aumenta continuamente el valor entero cuando se presiona el botón
- 11. negociación contenido ignorado cuando se utiliza el navegador botón Atrás
- 12. Repita una acción cuando se presiona el botón largo
- 13. Detectar cuando se presiona el botón de inicio iOS
- 14. cambiar el color del botón de texto cuando se presiona
- 15. enrutamiento de backbone detectando si se presiona adelante o atrás
- 16. Cómo saber cuándo se presiona el botón Atrás en una UINavigationControllerStack
- 17. La notificación abre la actividad, se presiona el botón Atrás, se abre la actividad principal?
- 18. Botón de retroceso invisible cuando el controlador de vista se presiona en el controlador de navegación
- 19. Elija el botón mientras presiona el botón Entrar
- 20. onStop() no se llama cuando presiono el botón Atrás
- 21. Aplicar estilo diferente al botón cuando se presiona
- 22. No se puede deshabilitar la animación de transición cuando se hace clic en el botón Atrás
- 23. Los gráficos deberían persistir cuando se presiona otro botón Activado
- 24. Cancelar AsyncTask cuando el usuario presiona el botón
- 25. El botón de envío de formularios permanece deshabilitado cuando se usa el botón Atrás en Firefox
- 26. cómo desactivar el botón Atrás en Android
- 27. Cómo guardar la aplicación en el botón Atrás, presione
- 28. Cómo volver a cargar la página cuando se presiona atrás, después de un pushState?
- 29. El botón predeterminado en JFrame no se activa cuando se presiona la tecla enter
- 30. Interceptar el botón Atrás
¿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
No hay almacenamiento automático de datos, tiene que hacerlo todo por su cuenta – Anders