NSIS nsDialog 如何检查页面外单选按钮的状态



我正在尝试通过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 $0
${NSD_GetState} $RADIO_BANANA $1
MessageBox MB_OK "Apple $0 Banana $1"
FunctionEnd

Section "-CustomSection"
${NSD_GetState} $RADIO_APPLE $0
${NSD_GetState} $RADIO_BANANA $1
MessageBox MB_OK "Apple $0 Banana $1"
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返回后读取控制数据。您应该使用离开回调来验证和存储用户输入。

!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 $0
${NSD_CreateRadioButton} 0 0 100% 10u "Apple"
Pop $1
${NSD_CreateRadioButton} 0 20 100% 10u "Banana"
Pop $2
${NSD_SetState} $1 $Apple
${NSD_SetState} $2 $Banana
nsDialogs::Show
FunctionEnd
Function MyLeave
${NSD_GetState} $1 $Apple
${NSD_GetState} $2 $Banana
FunctionEnd

Section "-CustomSection"
MessageBox MB_OK "Apple $Apple Banana $Banana"
SectionEnd

最新更新