NSIS nsDialog 如何检查页面外单选按钮的状态
NSIS nsDialog How to check status of a RadioButton outside of page
我正在尝试通过 nsDialog 创建一个自定义页面,其中的单选按钮会影响后面的部分。我遇到的问题是这些值似乎不会传播到 CustomPage
函数之外,如下例所示:
Var RADIO_APPLE
Var RADIO_BANANA
Function CustomPage
nsDialogs::Create 1018
${NSD_CreateRadioButton} 0 0 100% 10u "Apple"
Pop $RADIO_APPLE
${NSD_CreateRadioButton} 0 20 100% 10u "Banana"
Pop $RADIO_BANANA
${NSD_Check} $RADIO_APPLE
nsDialogs::Show
${NSD_GetState} $RADIO_APPLE [=10=]
${NSD_GetState} $RADIO_BANANA
MessageBox MB_OK "Apple [=10=] Banana "
FunctionEnd
Section "-CustomSection"
${NSD_GetState} $RADIO_APPLE [=10=]
${NSD_GetState} $RADIO_BANANA
MessageBox MB_OK "Apple [=10=] Banana "
SectionEnd
这显然是一个要点,忽略了包含和其他页面,但是当我构建它的完整版本时我看到了
Apple 1 Banana 0
在 CustomPage
内提出的消息框上,但请参阅
Apple 0 Banana 0
当该部分是 运行.
我通读了 https://nsis.sourceforge.io/NsDialogs_FAQ#How_to_easily_handle_radiobutton_selections,这个解决方案给了我同样的结果。
我是否遗漏了某些内容无法使 $RADIO_*
在该部分中可用?
谢谢
您不应该在寄存器中存储重要的持久状态,尤其是在 $0 中,因为它被其他页面和插件使用。例如,组件页面在其中一个回调函数中使用 $0。
另一方面,您的复选框句柄仅在该页面上使用,因此您可以使用 $1 和 $2。
另一个问题是,在 nsDialogs::Show
returns 之后,您不能依赖读取控制数据。您应该使用离开回调来验证和存储用户输入。
!include nsDialogs.nsh
Page Custom MyCreate MyLeave
Page InstFiles
Var Apple
Var Banana
Function .onInit
StrCpy $Banana 1 ; Make banana the default
FunctionEnd
Function MyCreate
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateRadioButton} 0 0 100% 10u "Apple"
Pop
${NSD_CreateRadioButton} 0 20 100% 10u "Banana"
Pop
${NSD_SetState} $Apple
${NSD_SetState} $Banana
nsDialogs::Show
FunctionEnd
Function MyLeave
${NSD_GetState} $Apple
${NSD_GetState} $Banana
FunctionEnd
Section "-CustomSection"
MessageBox MB_OK "Apple $Apple Banana $Banana"
SectionEnd
我正在尝试通过 nsDialog 创建一个自定义页面,其中的单选按钮会影响后面的部分。我遇到的问题是这些值似乎不会传播到 CustomPage
函数之外,如下例所示:
Var RADIO_APPLE
Var RADIO_BANANA
Function CustomPage
nsDialogs::Create 1018
${NSD_CreateRadioButton} 0 0 100% 10u "Apple"
Pop $RADIO_APPLE
${NSD_CreateRadioButton} 0 20 100% 10u "Banana"
Pop $RADIO_BANANA
${NSD_Check} $RADIO_APPLE
nsDialogs::Show
${NSD_GetState} $RADIO_APPLE [=10=]
${NSD_GetState} $RADIO_BANANA
MessageBox MB_OK "Apple [=10=] Banana "
FunctionEnd
Section "-CustomSection"
${NSD_GetState} $RADIO_APPLE [=10=]
${NSD_GetState} $RADIO_BANANA
MessageBox MB_OK "Apple [=10=] Banana "
SectionEnd
这显然是一个要点,忽略了包含和其他页面,但是当我构建它的完整版本时我看到了
Apple 1 Banana 0
在 CustomPage
内提出的消息框上,但请参阅
Apple 0 Banana 0
当该部分是 运行.
我通读了 https://nsis.sourceforge.io/NsDialogs_FAQ#How_to_easily_handle_radiobutton_selections,这个解决方案给了我同样的结果。
我是否遗漏了某些内容无法使 $RADIO_*
在该部分中可用?
谢谢
您不应该在寄存器中存储重要的持久状态,尤其是在 $0 中,因为它被其他页面和插件使用。例如,组件页面在其中一个回调函数中使用 $0。
另一方面,您的复选框句柄仅在该页面上使用,因此您可以使用 $1 和 $2。
另一个问题是,在 nsDialogs::Show
returns 之后,您不能依赖读取控制数据。您应该使用离开回调来验证和存储用户输入。
!include nsDialogs.nsh
Page Custom MyCreate MyLeave
Page InstFiles
Var Apple
Var Banana
Function .onInit
StrCpy $Banana 1 ; Make banana the default
FunctionEnd
Function MyCreate
nsDialogs::Create 1018
Pop [=10=]
${NSD_CreateRadioButton} 0 0 100% 10u "Apple"
Pop
${NSD_CreateRadioButton} 0 20 100% 10u "Banana"
Pop
${NSD_SetState} $Apple
${NSD_SetState} $Banana
nsDialogs::Show
FunctionEnd
Function MyLeave
${NSD_GetState} $Apple
${NSD_GetState} $Banana
FunctionEnd
Section "-CustomSection"
MessageBox MB_OK "Apple $Apple Banana $Banana"
SectionEnd