1

我正在尝试通过 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_*在该部分中是否缺少某些内容?

谢谢

4

1 回答 1

1

您不应该在寄存器中存储重要的持久状态,尤其是在 $0 中,因为它被其他页面和插件使用。例如,组件页面在其中一个回调函数中使用了 $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
于 2020-05-13T17:39:58.540 回答