Очистка состояния полей на страницах InstallOptions

#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
  

(Это приведет к сбросу элементов управления ссылками и кнопками, поэтому при необходимости отфильтруйте их из цикла)