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

NSIS nsDialog如何检查页面外单选按钮的状态,nsis,nsdialogs,Nsis,Nsdialogs,我试图通过nsDialog创建一个自定义页面,其中包含单选按钮,这些单选按钮将进一步影响某个部分。我遇到的问题是,这些值似乎没有传播到CustomPage功能之外,如下面的示例所示: Var RADIO_APPLE Var RADIO_BANANA Function CustomPage nsDialogs::Create 1018 ${NSD_CreateRadioButton} 0 0 100% 10u "Apple" Pop $RADIO_APPLE ${NSD_Cr

我试图通过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
这显然是一个要点,忽略了include和其他页面,但是当我构建这个的完整版本时,我看到了

Apple 1 Banana 0
自定义页面内弹出的消息框上,但请参见

Apple 0 Banana 0
当区段运行时

我通读了一遍,这个解决方案给了我同样的结果

在本节中,我是否缺少了
$RADIO.*


谢谢

您不应该在寄存器中存储重要的持久状态,尤其是在$0中,因为它被其他页面和插件使用。例如,components页面在一个回调函数中使用$0

另一方面,您的复选框句柄仅用于该页面,因此您可以使用$1和$2

另一个问题是,在
nsDialogs::Show
返回后,不能依赖于读取控制数据。您应该使用leave回调来验证和存储用户输入

!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