NSIS Как копировать и вставлять текст, вставляя дефисы или добавляя текстовые поля в текстовое поле, разделенные fieldnum - PullRequest
0 голосов
/ 21 мая 2019

Существует проблема в том, что пользователи могут легко передавать параметры в программу с помощью текстового поля UI NSIS.

Может быть реализовано в C # Winform, но не знает, как использовать его в NSIS.

Я бы хотел получить помощь одним из двух способов.

1. ОДИН:

Я хочу создать одно текстовое поле и отделить текст, который я хочу вставить, в текстовое поле с дефисами.

Пример:

(1) Значение, которое вы хотите поместить в текстовое поле: 12341234123412341234 ( Всего 19 ~ 20 цифр)

(2) Копия 12341234123412341234 ( Всего 19 ~ 20 цифр)

(3) Вставить в текстовое поле 1234-1234-1234-1234-1234 ( Автозаполнение переносов в 4-значных единицах)

(4) Фактическое значение параметра: 12341234123412341234

Видимые значения в пользовательском интерфейсе: 1234-1234-1234-1234-1234

Описание изображения:

Предполагается, что окно ввода cmd ...

Текстовое поле для отображения в реальном интерфейсе

2. ВТОРАЯ

(1) Копия 12341234123412341234

(2) Вставить в первое поле текстового поля

4-значное автозаполнение

Образец текстового поля NSIS

В настоящее время мой код пытается метод 2.

Мой код:

Function Test
  !insertmacro MUI_INSTALLOPTIONS_READ $0 "pageInputLicenseInfo.ini" "Settings" "State"
  ${If} $0 == 9 # btton 
    !insertmacro MUI_INSTALLOPTIONS_READ $R0 "pageInputLicenseInfo.ini" "Field 1" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R1 "pageInputLicenseInfo.ini" "Field 2" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R2 "pageInputLicenseInfo.ini" "Field 3" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R3 "pageInputLicenseInfo.ini" "Field 4" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R4 "pageInputLicenseInfo.ini" "Field 5" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R5 "pageInputLicenseInfo.ini" "Field 6" "State"

    nsExec::ExecToStack '$INSTDIR\ParamterTestConsole.exe ${PRODUCT_NAME} $R0 $R1$R2$R3$R4$R5'

    Pop $2 ; Exit code
    Pop $3 ; console OUTPUT

    Blah blah..........

FunctionEnd

Файл NSI INI:

; Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=14
Title=test

[Field 1]
Type=Text
Text=1
Left=29
Right=275
Top=46
Bottom=57

[Field 2]
Type=Text
Text=123
Left=30
Right=60
Top=67
Bottom=78
MaxLen=4

[Field 3]
Type=Text
Text=123
Left=74
Right=103
Top=67
Bottom=78
MaxLen=4

[Field 4]
Type=Text
Text=123
Left=121
Right=149
Top=67
Bottom=78
MaxLen=4

[Field 5]
Type=Text
Text=123
Left=164
Right=193
Top=67
Bottom=78
MaxLen=4

[Field 6]
Type=Text
Text=123
Left=206
Right=236
Top=67
Bottom=78

[Field 7]
Type=Label
Text=IP
Left=1
Right=15
Top=48
Bottom=56

[Field 8]
Type=Label
Text=Key
Left=1
Right=20
Top=70
Bottom=78

[Field 9]
Type=Button
Text=enter
Flags=NOTIFY
Left=225
Right=275
Top=92
Bottom=105

[Field 10]
Type=Label
Text=※ 
Enter four digits.
Left=0
Right=152
Top=26
Bottom=43

[Field 11]
Type=Label
Text=-
Left=154
Right=160
Top=68
Bottom=80

[Field 12]
Type=Label
Text=-
Left=199
Right=205
Top=68
Bottom=76

[Field 13]
Type=Label
Text=-
Left=110
Right=116
Top=68
Bottom=76

[Field 14]
Type=Label
Text=-
Left=64
Right=70
Top=68
Bottom=76

1 Ответ

0 голосов
/ 21 мая 2019

Плагин PassDialog имеет последовательный диалог, который автоматически переходит к следующему полю редактирования, когда оно заполнено.Я не думаю, что он поддерживает вставку, но вы, возможно, могли бы попросить автора добавить эту функцию.

Я не думаю, что InstallOptions поддерживает обратные вызовы уведомлений для полей редактирования, но nsDialogs поддерживает, и вы можете создать классический диалог последовательного вводас ним:

Var Serial

!include LogicLib.nsh
!include WinMessages.nsh
!include nsDialogs.nsh
Page Custom MyDialogCreate MyDialogLeave
Page InstFiles

Function onSerialEditChange
Pop $R0
SendMessage $R0 ${EM_GETLIMITTEXT} 0 0 $R1
SendMessage $R0 ${WM_GETTEXTLENGTH} 0 0 $R2
${If} $R2 >= $R1
    SendMessage $hWndParent ${WM_NEXTDLGCTL} 0 0 ; Tab to next
${ElseIf} $R2 = 0
    SendMessage $hWndParent ${WM_NEXTDLGCTL} 1 0 ; Tab to previous
${EndIf}
FunctionEnd

Function MyDialogCreate
nsDialogs::Create 1018
Pop $0

!macro CreateSerialEdit x var limit
${NSD_CreateText} ${x} 10u 30u 12u ""
Pop ${var}
${NSD_OnChange} ${var} onSerialEditChange
${NSD_Edit_SetTextLimit} ${var} ${limit}
${NSD_AddStyle} ${var} ${ES_NUMBER} ; Limit to numbers
!macroend
!insertmacro CreateSerialEdit 10u $1 4
!insertmacro CreateSerialEdit 50u $2 4
!insertmacro CreateSerialEdit 90u $3 4

SendMessage $hWndParent ${WM_NEXTDLGCTL} $1 1
nsDialogs::Show
FunctionEnd

Function MyDialogLeave
StrCpy $Serial ""
${NSD_GetText} $1 $0
StrCpy $Serial "$Serial$0"
${NSD_GetText} $2 $0
StrCpy $Serial "$Serial$0"
${NSD_GetText} $3 $0
StrCpy $Serial "$Serial$0"
StrLen $0 $Serial
${If} $0 < 12
    MessageBox mb_iconstop "Enter a valid serial!"
    Abort
${EndIf}
FunctionEnd

Section
MessageBox mb_ok Serial=$Serial
SectionEnd

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

...