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