NSIS nsDialog Как проверить статус RadioButton за пределами страницы

Я пытаюсь создать пользовательскую страницу через 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_* доступным в разделе?

Спасибо


person joedborg    schedule 13.05.2020    source источник


Ответы (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
person Anders    schedule 13.05.2020