» InstallOptionsEx: создаём простую страничку

K.A.V.
www.oszone.net
22.02.2010
Автор: K.A.V.
Последнее обновление: 17.05.2014

И снова здравствуйте!

Наш первый урок будет простым, мы научимся создавать простую кастомную страничку, и научимся обрабатывать статусы элементов управления и читать значения текстовых полей, в которые пользователь внесёт информацию, если таковые будут

Создаём директорию на вашем диске, в которой будем хранить наш проект
Я создам по пути C:\NSIS\Project1

Открываем HM NIS EDIT

Вставляем этот код нашего проекта:

XPStyle on

!include "MUI.nsh"
!insertmacro MUI_LANGUAGE "Russian"

Name "InstallOptionsEx Test"
OutFile "Project1.exe"

Page custom FuncDialogInit FuncDialogValidate ": Первый проект" ; Функция показа диалога
Page instfiles


Function .onInit
  InitPluginsDir
  File /oname=$PLUGINSDIR\Project1.ini "Project1.ini"
; Распаковываем наш INI файл диалога с элементами
FunctionEnd


Function FuncDialogInit
; Заполняем элементы данными
; Здесь необходимо прописывать такие команды как: назначение элементу "Изображение" ссылку на файл изображения и т.д.

        InstallOptionsEx::initDialog /NOUNLOAD "$PLUGINSDIR\Project1.ini"
        InstallOptionsEx::show
FunctionEnd


Function FuncDialogValidate
           
FunctionEnd


Section -post
SetAutoClose true
SectionEnd     
Теперь рассмотрим назначение функций

FuncDialogInit
Данная функция предназначена для инициализации диалога, я решил сразу представить вам её в таком виде, чтобы потом, при создании сложных страничек не путаться в написании вызова плагина

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

Сейчас же, мы ограничемся в данной функции только прописью INI файла созданного нами диалога

FuncDialogValidate
А вот это и есть наш самый интересный кусочек кода
В данной функции мы будем обрабатывать статус элементов, читать вводимые данные пользователем в текстовые поля элементов и т.д.

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

И так, код проекта я вам предоставил, сохранили этот проект в папку  C:\NSIS\Project1 ?
Тогда продолжаем :)

Переходим в HM NIS EDIT и создаём наш INI файл диалога нажатием в меню Файл  => Новый файл с настройками установки или же нажимаем сочетание клавишь Ctrl+I

Для новичков: в пустой области редактора нажимаем правой кнопкой мыши  => Изменить размер  => Модерн UI
Это мы делаем для того, чтобы вы не расположили элемент за пределах самого окна инсталлятора ;)



Теперь мы создадим 3 элемента (сохраняйте порядок создания!):



Это элемент ввода текстового поля, расположим его сверху слева:



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

Для этого служит State поле


Не меняем его, не торопитесь ;)

Теперь по аналогии создаём ещё 2 элемента:

Галочку
 




И элемент, который позволит нам отобразить изображение






Читаем состояние элементов

И так, у нас есть 2 элемента: текстовое поле и чекбокс, и нам нужно прочитать их состояние, т.е. узнать, изменил ли пользователь состояние этих элементов при показе диалога или нет

Нам необходимо добавить всего лишь одну команду в функуцию FuncDialogValidate, которая предназначенена для определения состояния элементов

Получаем значение текстового поля:

Function FuncDialogValidate
  ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 1" "State"         
FunctionEnd
Вот и всё...Сложно? Не думаю!
Обратите внимание на цифру, смотрите внимательно и указывайте правильные номера элементов
Мы же текстовое поле создали первым элементом? Поэтому и циферка 1 здесь :)

Конечно же, не нужно запоминать, в каком порядке вы создавали элементы, номер нужного вам элемента всегда можно посмотреть в редакторе HM NIS EDIT


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

Так, мы остановились на чтении значения текстового поля...
Всё, что будет выполнено дальше - только ваша фантазия и ваши потребности

К примеру, можно проверить, если текстовое поле пустое - то показывать сообщение об ошибке и не продолжать, пока пользователь не введёт какой-либо текст
Function FuncDialogValidate
  ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 1" "State"  
  StrCmp $1 "" 0 +3   ; Текстовое поле пустое?
  MessageBox MB_OK|MB_ICONSTOP "Вам необходимо заполнить текстовое поле вашим текстом"    
  Abort  
FunctionEnd
Команда Abort предназначена для прерывания выполнения данной функции диалога, мы будем постоянно использовать данную команду, если нас будет что-то не устраивать в диалоге во время работы ;)


Теперь переходим к чтения статуса чекбокса
Function FuncDialogValidate
  ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 1" "State"  
  StrCmp $1 "" 0 +3   ; Текстовое поле пустое?
  MessageBox MB_OK|MB_ICONSTOP "Вам необходимо заполнить текстовое поле вашим текстом"    
  Abort  

  ReadINIStr $1 "$PLUGINSDIR\Project1.ini" "Field 2" "State" 
StrCmp $1 "0" 0 +3   ; Чекбокс не отмечен? 
   MessageBox MB_OK|MB_ICONSTOP "Отметьте галочкой чекбокс для продолжения!"
   Abort
StrCmp $1 "1" 0 -2
MessageBox MB_OK|MB_ICONINFORMATION "Чекбокс отмечен, продолжаем" 
FunctionEnd

Вот и всё! Тут ничего сложного ;)


А теперь мы перейдём к элементу изображения
Чтобы назначить какое либо изображения данному элементу, нам необходимо прописать полный путь к файлу изображения перед инициализацией диалога
Т.е. в функцию FuncDialogInit

Давайте назначим нашему элементу типа "Image: изображение/иконка" картинку, которая отображается сверху в шапке пакета инсталлятора

Добавляем запись ссылаясь на файл изображения
Function FuncDialogInit
; Заполняем элементы данными
; Здесь необходимо прописывать такие команды как: назначение элементу "Изображение" ссылку на файл изображения и т.д.

  WriteINIStr "$PLUGINSDIR\Project1.ini" "Field 3" "Text" "C:\Program Files\NSIS\contrib\Graphics\Header\nsis.bmp"

        InstallOptionsEx::initDialog /NOUNLOAD "$PLUGINSDIR\Project1.ini"
        InstallOptionsEx::show
FunctionEnd
Обратите внимание на порядковый номер элемента, мы же добавили его третьим? ;)
Всегда проверяйте порядковый номер, который указываете в данных командах, чтобы не получилось как у меня: копирую строки, а поменять порядковый номер элемента забываю :))

В данном случае, необходимо назначить параметру Text значение пути нужного изображения, чтобы изображение отобразилось


На этом урок окончен!

Мне кажется, я понятно всё объяснил? Строго не судите, я не привык кого-то обучать, если будут какие-либо вопросы по данному разделу или по какой-либо информации из справочника - смело обращайтесь к нам на форум