#installation #nsis
#установка #nsis
Вопрос:
Я работаю над установщиком NSIS. Одним из требований является разрешение пользователю вводить некоторую информацию несколько раз для нескольких разных записей (по сути, это позволяет им вводить информацию о сервере для любого количества серверов, сколько они захотят). В настоящее время я перерабатываю страницы, перейдя на эту страницу после страницы дополнительных параметров:
Function RedirectPage
${If} $addtCheck <> 0 ; Was the checkbox checked?
StrCpy $startedXml 1 ; make this "true"
SendMessage $HWNDPARENT 0x408 -1 "" ; If so, go back
${Else}
Abort
${EndIf}
FunctionEnd
addtCheck
проверяет, установлен ли флажок, который перерабатывает страницу. Если это так, эта функция приведет к повторному отображению предыдущей страницы. Проблема в том, что поля содержат информацию, которую только что ввел пользователь. Теперь я хочу очистить состояние всех полей предыдущей страницы, прежде чем они вернутся к ней. Я пытался сделать что-то вроде этого,
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioAdv.ini" "Field 2" "State" ""
но, похоже, это не позволяет мне очистить состояние. Я знаю о командах SendMessage
и GetDlgItem
, но не знаю ни о каких методах, которые позволяют мне использовать их для очистки текстовых полей, флажков и списков, содержащихся в файле InstallOptions INI.
Всем, кто может указать мне правильное направление, спасибо. Если вы хотите увидеть больше скрипта, дайте мне знать.
Ответ №1:
Таким образом, у вас должны быть элементы управления в ini, подобные этому:
[Field 1]
Type=Label
Left=15
Top=7
Right=112
Bottom=16
Text=Text 1
затем вы можете получить дескриптор поля следующим образом:
ReadIniStr $0 $PLUGINSDIRpage_ini.ini "Field 1" "HWND"
Итак, вы можете использовать SendMessage
команду $0
следующим образом:
SendMessage $0 ${WM_SETTEXT} 0 "STR:$InitialString"
Этот пример должен работать с текстовыми полями, для других элементов управления см. Следующее:
В пути установки NSIS в разделе «Включить» находится файл Winmessages.nsh
с ключами сообщений для использования.
В моих тестах я нашел ключ для установки флажков:
SendMessage $0 ${BM_SETCHECK} 0 "0"
Для списков я нашел: (непроверенный)
LB_RESETCONTENT
LB_SELECTSTRING
Надеюсь, это поможет.
PS: Если у вас есть какие-либо вопросы или критика, пожалуйста, дайте мне знать.
PPS:
В качестве альтернативы вы можете использовать макросы nsDialogs с дескриптором HWND, т.Е. для флажка:
${NSD_Uncheck} $0
Более подробная информация об этом макросе находится здесь:
nsDialogs Readme — макросы
Комментарии:
1. Я смог получить рабочее решение, используя это. Спасибо. Хотя это может быть не самым элегантным решением, изменение каждого поля по отдельности дает полный контроль над страницей и работает очень хорошо. Я ценю это.
Ответ №2:
Вы можете использовать SendMessage для сброса каждого элемента управления, но тогда вам придется обрабатывать разные типы элементов управления, гораздо лучше просто сбросить .ini:
page custom custdircreate_1
page directory dirpagecreate
Function custdircreate_1
SetOverwrite on
!insertmacro INSTALLOPTIONS_EXTRACT "ioAdv.ini"
SetOverwrite lastused
!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
FunctionEnd
Function dirpagecreate
SendMessage $HWNDPARENT 0x408 -1 ""
FunctionEnd
.. или сбросьте состояние и сохраните все остальное:
Function custdircreate_2
; INSTALLOPTIONS_EXTRACT was called in .onInit
!insertmacro INSTALLOPTIONS_READ $1 "ioAdv.ini" "Settings" "NumFields"
StrCpy $0 1
loop:
!insertmacro INSTALLOPTIONS_WRITE "ioAdv.ini" "Field $0" "State" ""
IntOp $0 $0 1
IntCmpU $0 $1 loop loop
!insertmacro INSTALLOPTIONS_DISPLAY "ioAdv.ini"
FunctionEnd
(Это приведет к сбросу элементов управления ссылками и кнопками, поэтому при необходимости отфильтруйте их из цикла)