» Скрипт функций сложных страничек

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

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

Сначала необходимо подключить отображение нашей крутой странички :)
Данную строчку мы прописываем в том месте скрипта, где хотим показать нашу собственную страничку, например, после странички "Приветствие"
!insertmacro MUI_PAGE_WELCOME

Page custom MyDialog MyDialog_Leave ""

!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"

!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_PAGE_FINISH

Теперь я покажу вам содержимое данных функций и опишу, что в них должно быть (и может) прописываться:

MyDialog
В данной функции будет прописана распаковка INI файла нашей странички, команда на инициализацию диалога и команда на отображение пользователю нашей странички.
Также в данной функции мы можем прописать команды на установку значений/параметров и т.д. нашим элементам перед показом нашей странички.
Немного пиара :)
Я сразу хочу вам преподнести всё, что знаю сам и не хочу ограничиваться созданием кастомных страничек с уже существующими данными в них.
Почему я это говорю, просто потому, что использую NSIS только для написания софта, как ни странно это звучит. Один из моих проектов (SFX Creator) - полностью написан на NSIS и для отображения своего интерфейса использует как раз плагин InstallOptionsEx, который мы используем для создания кастомных страничек.
Поэтому, в некоторых примерах кастомных страничек и разных функций я буду показывать вам свои наработки и опыт, приобретённый при написании SFX Creator

Теперь я покажу вам, собственно, вид данной функции:
Function MyDialog
  InitPluginsDir
  File /oname=$PLUGINSDIR\Project.ini "Project.ini"
; Распаковываем наш INI файл диалога с элементами

; Данный участок кода я буду называть Перед инициализацией
; Т.е. после распаковки файла диалога, но до команды загрузки странички в память
; Здесь мы можем заполнить элементы данными
; Внимание! На данном участке кода мы можем назначить значения только некоторым элементам, например:
; Текст в текстовом элементе
; Путь к файлу изображения, если один из элементов нашей странички - изображение
; Состояние галочки, если один из элементов нашей странички - чекбокс
; и т.д., на страничке описания конкретного элемента я буду указывать, допустимо ли в данном участке кода прописывать параметры элементу


 InstallOptionsEx::initDialog /NOUNLOAD "$PLUGINSDIR\Project.ini"
; Данный участок кода я буду называть После инициализации
; На данном участке кода мы сможем заполнить элементы своими данными, например, мы сможем заполнить элемент ListView необходимыми строками, доступными пользователю для выбора
; Например, мы сможем реализовать такую задачу: собрать некую информацию перед показом странички пользователю и отобразить собранные данные в элементе ListView (список строк и не только), чтобы пользователь выбрал одно из значений

 InstallOptionsEx::show
; Данный участок кода я буду называть После показа странички
; На данном участке кода вы уже можете прописать свои команды, после команды InstallOptionsEx::show будет отрабатывать скрипт после показа нашей странички
; Данный участок кода может быть использован для чтения состояния элементов и их значений после закрытия странички пользователем (когда пользователь нажмёт Далее/Установить)
FunctionEnd

MyDialog_Leave
В данной функции будет обработка состояний элементов, говоря простым языком - в этой функции мы и будем решать, какие действия выполнять, если пользователь взаимодействует с нашими элементами (нажимает кнопку, отмечает галочкой чекбокс и т.д.)
В данном примере я предположу, что в моей страничке 2 взаимодействующих элемента:
1-ый: Кнопка с порядковым номером 1 в INI файле
2-ой: Чекбокс (галочка) с порядковым номером 2 в INI файле
Function MyDialog_Leave
  ReadINIStr $0 "$PLUGINSDIR\Project.ini" "Settings" "State"
; Читаем в переменную $0 порядковый номер элемента, с которым пользователь взаимодействует

; Затем идёт перечисление/проверка всех взаимодействующих элементов в нашей страничке
; В зависимости от того, какой порядковый номер элемента будет в переменной $0 - мы выполним действия, связанные с конкретным элементом
; Например, если пользователь нажал на кнопку, порядковый номер которой в нашем INI файле 1, то в переменной $0 окажется значение 1
; Таким образом, мы легко определяем, с каким элементом пользователь взаимодействует в реальном времени
; Если пользователь нажал кнопку "Далее/Установить", то в переменной $0 будет значение 0

  StrCmp $0 0 Button_NEXT_Clicked ; Пользователь нажал кнопку "Далее/Установить", прыгаем на метку Button_NEXT_Clicked
  StrCmp $0 1 Button_Clicked
  StrCmp $0 2 CheckBox_OnOff

; Структура кода такая, что мы "прыгаем" на метку в данной функции, если пользователь взаимодействует с нашим элементом

  abort ; прекращаем проверку, т.к. взаимодействующих элементов в нашей страничке больше нет


Button_Clicked:
; Ваши команды при взаимодействии пользователя с элементом, можете прописать команды здесь, если их не много, либо можете воспользоваться командой "Call" для вызова написанной вами функции
 MessageBox MB_OK|MB_ICONINFORMATION "Нажата кнопка"
abort

CheckBox_OnOff:
; Ваши команды при взаимодействии пользователя с элементом, можете прописать команды здесь, если их не много, либо можете воспользоваться командой "Call" для вызова написанной вами функции
 ReadINIStr $0 "$PLUGINSDIR\Project.ini" "Field 2" "State"
 MessageBox MB_OK|MB_ICONINFORMATION "Отмечена галочка$\nСостояние: $0"
abort

Button_NEXT_Clicked:
FunctionEnd