Очистка состояния полей на страницах InstallOptions - PullRequest
2 голосов
/ 30 сентября 2011

Я работаю над установщиком 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, но я не знаю ни одного метода, позволяющего использовать их для очистки текстовых полей, флажков и списков, содержащихся в INI-файле InstallOptions.

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

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Вы можете использовать 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

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

2 голосов
/ 30 сентября 2011

Таким образом, у вас должны быть элементы управления в INI, как это:

  [Field 1]
  Type=Label
  Left=15
  Top=7
  Right=112
  Bottom=16
  Text=Text 1

, тогда вы можете получить дескриптор на поле, как это:

ReadIniStr $0 $PLUGINSDIR\page_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 - Macros

...