$ {NSD_GetText} всегда возвращает пустую строку

#nsis

#nsis

Вопрос:

Согласно руководству, я должен иметь возможность получить текст текстового элемента управления с помощью такого кода:

 ${NSD_GetText} $TextBox $0
MessageBox MB_OK "You typed:$n$n$0"
 

Я всегда получаю пустую строку из этого вызова. В приведенном ниже коде текстовое поле показывает «правильно», но всегда отображаются детали Contents: ; если я прокомментирую вызов ${NSD_GetText} , я получу Contents: wrong .

 !include nsDialogs.nsh
!include LogicLib.nsh

Var Dialog
Var TextBox

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage
    StrCpy $0 "wrong"

    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateText} 0 12u 93% 12u "correct"
    Pop $TextBox

    nsDialogs::Show
FunctionEnd

Function nsDialogsPageLeave
FunctionEnd

Section
    ${NSD_GetText} $TextBox $0

    DetailPrint "Contents: $0"
SectionEnd
 

Поэтому я подумал, что, возможно, элемент управления не существовал, когда я пытался распечатать его содержимое, и попытался обновить текст по мере его ввода в элемент управления; это не помогло. Маловероятно, что NSIS сломан таким образом, так что я делаю не так?

 !include nsDialogs.nsh
!include LogicLib.nsh

Var Dialog
Var TextBox
Var Text

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage
    StrCpy $0 "wrong"

    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateText} 0 12u 93% 12u "correct"
    Pop $TextBox
    ${NSD_OnChange} $TextBox UpdateText

    nsDialogs::Show
FunctionEnd

Function nsDialogsPageLeave
FunctionEnd

Function UpdateText
    ${NSD_GetText} $TextBox $Text
FunctionEnd

Section
    DetailPrint "Contents: $Text"
SectionEnd
 

Ответ №1:

Вы правы, элемент управления не существует в разделе, поэтому вам нужно получить содержимое, пока вы находитесь на пользовательской странице.

Ваш второй пример должен работать правильно, если пользователь изменяет текст, но не если они этого не делают, потому что событие изменения не сработает.

Обычно вы просто читаете содержимое страницы, оставляя обратный вызов:

 Var Dialog
Var TextBox
Var Text

!include LogicLib.nsh
!include nsDialogs.nsh
Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage
    nsDialogs::Create 1018
    Pop $Dialog
    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateText} 0 12u 93% 12u "correct"
    Pop $TextBox

    nsDialogs::Show
FunctionEnd

Function nsDialogsPageLeave
${NSD_GetText} $TextBox $Text
FunctionEnd


Section
    DetailPrint "Contents: $Text"
SectionEnd
 

Комментарии:

1. Черт возьми, я забыл завершить этот тест. Теперь у меня есть еще две причины чувствовать себя глупо. Спасибо за помощь.