PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

kotkovets
07-05-2011, 13:55
но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью. »
Function .onInit
${If} ${AtLeastWinVista} ;начиная от WinVista и выше
Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTDIR "$SysDrive\Games\XXX"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\XXX"
${EndIf}
FunctionEnd

InstallDir "$INSTDIR\XXX"

Запускается генератор и все, что дальше делать не понятно.... »
и мне не понятно, что вы дальше хотите сделать

wolkow70
07-05-2011, 15:09
и мне не понятно, что вы дальше хотите сделать »
Создать INI файл со сценарием установки... И разобраться в процессе его создания.

kotkovets
07-05-2011, 20:07
Создать INI файл со сценарием установки... И разобраться в процессе его создания »
Вот накидал небольшой примерчик, с описанием на основе фейса MUI2, генератор файла ответов через ключ /G
!include "MUI2.nsh"

!include "TextFunc.nsh"
!include "WordFunc.nsh"
!include "LogicLib.nsh"

OutFile "setup.exe"

!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWWELCOME ;функция при открытии стр. приветствия
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWDIRECTORY ;функция при открытии стр. приветствия
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWCOMPONENTS ;функция при открытии стр. компонентов
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_PRE PREINSTFILES ;функция перед открытием стр. установки
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Var GMODE
Var CAPTION
Var INIFILE
Var SysDrive
Var SUCCES_SECTION

InstallDir "$PROGRAMFILES\SOFT"

Function .OnInit
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
StrCpy $CAPTION "Обычный режим"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" "$INIFILE" ;подменяем расширение на ini c тем же именем, что и установщик
StrCpy $INIFILE "$EXEDIR\$INIFILE" ;$INIFILE - путь, где будет создан файл конфигурации
${GetOptions} $CMDLINE "/G" $0
${IfNot} ${Silent} ; условие работы генератора, если не тихий режим
${AndIfNot} ${Errors} ; И не установлен флаг ошибки
;здесь команды выполняться будут в режиме генератора, до конца конструкции ${EndIf}
StrCpy $GMODE 1 ;с ключом /G, $GMODE = 1, режим генератора
StrCpy $CAPTION "Генератор ответов" ;меняем название заголовка
;------bla..bla
;------bla..bla
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
${EndIf}
FunctionEnd

Caption "$CAPTION"

;==========================================================================================
Function SHOWWELCOME
${If} $GMODE = 1 ;режим генератора
${NSD_SetText} $mui.WelcomePage.Title "Добро пожаловать! Это генератор ответов."
${NSD_SetText} $mui.WelcomePage.Text "Описание возможностей генератора:$\nbla..bla$\nbla..bla"
${EndIf}
FunctionEnd
;==========================================================================================
Function SHOWDIRECTORY
${If} $GMODE = 1 ;режим генератора
${NSD_SetText} $mui.DirectoryPage.Text \
"Программа запишет в файл конфигурации путь установки программы.$\r\
Этот путь подхватится в тихом режиме запуска установщика.$\r\
Файл конфигурации создатся с таким же именем, как и установщик.$\r\
Вы можете изменить путь выбора папки установки кнопкой «Обзор...»"
${EndIf}
FunctionEnd
;==========================================================================================
Function SHOWCOMPONENTS
${If} $GMODE = 1 ;режим генератора
${NSD_SetText} $mui.ComponentsPage.Text \
"Выберите компоненты которые вы хотите устанавливать в тихом режиме$\n\
Нажмите кнопку «Создать» , что бы создать файл конфигурации установки"
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "Создать"
${EndIf}
FunctionEnd
;=========================================================================================
Function SHOWFINISH
${If} $GMODE = 1 ;режим генератора
${NSD_SetText} $mui.FinishPage.Title "Завершение работы Мастера создания файла ответов."
${NSD_SetText} $mui.FinishPage.Text "Файл ответов готов!"
${EndIf}
FunctionEnd
;=========================================================================================
Function PREINSTFILES ;это функция будет выполнена только в режиме генератора
${If} $GMODE = 1 ;режим генератора
WriteINIStr "$INIFILE" "DIRECTORY" "ISTALLDIR" "$INSTDIR" ;создаем файл конфигурации
${EndIf}
FunctionEnd

;===========================================================================================
; УСЛОВИЕ ВЫПОЛНЕНИЯ ВСЕХ КОМАНД В СЕКЦИИ ТОЛЬКО, ЕСЛИ ПЕРЕМЕННАЯ $SUCCES_SECTION = 1 !
;===========================================================================================
/* МАКРОС ЗАПИСИ ОТМЕЧЕННЫХ СЕКЦИЙ В ФАЙЛ КОНФИГУРАЦИИ
${GetSecWriteSucces} индетификатор_секции
пример:
[Sections]
Test=1 - секция отмечена
Test=0 - секция не отмечена
Если не отмечена секция, то записи в файле конфигурации не будет, т.е равносильно тому,
что переменная $SUCCES_SECTION = 0
*/
;==========================================================================================
!define GetSecWriteSucces "!insertmacro _WriteSection"
!macro _WriteSection secID
StrCpy $SUCCES_SECTION 1 ;по умолчанию ставим $SUCCES_SECTION = 1
StrCmp $GMODE 1 WriteMode ;проверяем режим установки, если $GMODE = 1, режим генератора
IfSilent 0 EndMarco ;проверяем тихий режим, если не тихий режим - выход из макроса
IfFileExists "$INIFILE" 0 EndMarco ;проверяем наличие файла конфигурации
ClearErrors ;очищаем флаг ошибки прунудительно, перед чтением файла конфигурации
ReadINIStr $SUCCES_SECTION "$INIFILE" "Sections" "${secID}" ;состояние секкций помещаем в $SUCCES_SECTION
IfErrors 0 +2 ;проверка на ошибки в чтении файла конфигурации
StrCpy $SUCCES_SECTION 0 ;в случае ошибки $SUCCES_SECTION = 0
Goto EndMarco
WriteMode:
StrCpy $SUCCES_SECTION 0 ; в режиме генератора $SUCCES_SECTION = 0
WriteINIStr $INIFILE Sections ${secID} 1
EndMarco:
!macroend
;==========================================================================================
; УСЛОВИЕ ВЫПОЛНЕНИЯ ВСЕХ КОМАНД В СЕКЦИИ ТОЛЬКО, ЕСЛИ ПЕРЕМЕННАЯ $SUCCES_SECTION = 1 !
;==========================================================================================
Section "-Install"
;чтение из файла ответов путь установки и перезапись значения $INSTDIR
;Условие чтения и перезаписи:
; ТОЛЬКО НЕ В РЕЖИМЕ ГЕНЕРАТОРА И ТОЛЬКО В ТИХОМ РЕЖИМЕ И ПРИ НАЛИЧИИ ФАЙЛА ОТВЕТОВ
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${If} $GMODE = 0 ;выполнение всегда, только не в режиме генератора
;--------
/*
тут ваш код!, эта секция всегда должна выполняться
команды пишем до конца конструкции ${EndIf}
*/
;--------
${EndIf}
SectionEnd

Section "Test" Test ; Test - индетификатор секции
${GetSecWriteSucces} Test
${If} $SUCCES_SECTION = 1
;MessageBox MB_OK "Test = $SUCCES_SECTION" IDOK
;--------
/*
здесь пишите свои команды
до конца конструкции ${EndIf}
*/
;--------
${EndIf}
SectionEnd

Section "Test1" Test1 ; Test1 - индетификатор секции
${GetSecWriteSucces} Test1
${If} $SUCCES_SECTION = 1
;MessageBox MB_OK "Test1 = $SUCCES_SECTION" IDOK
;--------
/*
здесь пишите свои команды
до конца конструкции ${EndIf}
*/
;--------
${EndIf}
SectionEnd

Section "Test2" Test2 ; Test2 - индетификатор секции
${GetSecWriteSucces} Test2
${If} $SUCCES_SECTION = 1
;MessageBox MB_OK "Test2 = $SUCCES_SECTION" IDOK
;--------
/*
здесь пишите свои команды
до конца конструкции ${EndIf}
*/
;--------
${EndIf}
SectionEnd

wolkow70
08-05-2011, 12:05
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ »


Получается, что это нам надо сказать:
Спасибо Вам, за то, что тратите свое время, что бы ПОМОЧЬ НАМ!

wolkow70
11-05-2011, 12:30
kotkovets,

Делаю установщик на программу FlylinkDC++.
В общем на XP она и в Program Files хорошо ставится и работает.
А на Windows 7 рекомендуют ставить папку с программой в корень диска.
Я так понимаю, что вышеприведенный пример:

Function .onInit
${If} ${AtLeastWinVista} ;начиная от WinVista и выше
Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTDIR "$SysDrive\Games\XXX"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\XXX"
${EndIf}
FunctionEnd

InstallDir "$INSTDIR\XXX"

можно попробовать????

kotkovets
11-05-2011, 13:47
можно попробовать???? »
Попробовать можно все, если религия позволяет...
А на Windows 7 рекомендуют ставить папку с программой в корень диска »
Рекомендуют из-за прав(привелегий) пользователя в Vista/Win7
http://forum.oszone.net/post-1459797-559.html и здесь продолжение http://forum.oszone.net/post-1460492-563.html
К тому же пример определения права пользователя и сколько прав у пользователя (а значит меняем папку распаковки) есть в справочнике по NSIS.

wolkow70
11-05-2011, 18:39
К тому же пример определения права пользователя и сколько прав у пользователя (а значит меняем папку распаковки) есть в справочнике по NSIS. »
Пробовал я так сделать, на семерке дает добро в Программы.. Почему-то....

kotkovets
11-05-2011, 21:49
Пробовал я так сделать, на семерке дает добро в Программы.. Почему-то.... »
потому что, пользователь с правами админа, а если пользователь без прав админа(и его наследников), то винда вам не даст установить в папку %PROGRAMFILES% ничего и недаст добро в реестре запись (изменение) на корневую ветку HKEY_LOCAL_MACHINE
Определить какими правами обладает пользователь поможет стандартный плагин в составе NSIS
UserInfo::GetOriginalAccountType
Pop $0
MessageBox MB_OK "$0"

wolkow70
12-05-2011, 08:22
Товарищи, подскажите, что поправить :

WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Веб-сайт ${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.url"

Ярлык интернета создается и работает, но характерная интернет-иконка в меню Пуск отсутствует. Просто никакой значок. Мне надо, чтобы иконку интернета подключить к ссылке.

kotkovets
12-05-2011, 10:40
Просто никакой значок. Мне надо, чтобы иконку интернета подключить к ссылке »
А чем плох ОБЫЧНЫЙ ярлык?
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Сайт ${PRODUCT_NAME}.lnk" "http://wwww.aimp.ru" "" "$PROGRAMFILES\Internet Explorer\iexplore.exe" 1

wolkow70
12-05-2011, 10:49
А чем плох ОБЫЧНЫЙ ярлык? »

1. Полагал, что значок интернета должен сам отражаться на ярлыках url.
2. Браузер по умолчанию Opera.
3. Как обычно все сделал сложнее:

- создал интернет-иконку нейтрального вида, а далее:


!define PRODUCT_WEB_SITE "http://www.xnview.com"

!macro CreateInternetShortcut FILENAME URL ICONFILE ICONINDEX
WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconFile" "${ICONFILE}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconIndex" "${ICONINDEX}"
!macroend

!insertmacro CreateInternetShortcut \
"$SMPROGRAMS\${PRODUCT_NAME}\Веб-сайт ${PRODUCT_NAME}" \
"${PRODUCT_WEB_SITE}" \
"$INSTDIR\url.ico" "0"
SectionEnd


Получилось здорово!

wolkow70
12-05-2011, 17:37
kotkovets,

Внедряю функцию сохранения настроек для Opera. Столкнулся с проблемой:

Section "PreInstall" sec01
IfFileExists "$APPDATA\Opera\Opera\*.ini" 0 check_localappdata
MessageBox MB_YESNO|MB_ICONQUESTION "Файлы настроек Opera обнаружены в профиле Пользователя. Выполнить резервное копирование файлов настроек для дальнейшего использования? (Будут находиться в каталоге $DOCUMENTS\Opera Backup)" IDNO no_backup
CreateDirectory "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.adr" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.ini" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.xml" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.dat" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$APPDATA\Opera\Opera\*.js" "$DOCUMENTS\Opera Backup\"
check_localappdata:
IfFileExists "$LOCALAPPDATA\Opera\Opera\cache" 0 check_programdir
MessageBox MB_YESNO|MB_ICONQUESTION "Кэш браузера, файлы почты и иные данные обнаружены в профиле Пользователя. Выполнить резервное копирование данных для дальнейшего использования? (Будут находиться в каталоге $DOCUMENTS\Opera Backup)" IDNO no_backup
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\application_cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\icons\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\thumbnails\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\widgets\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\vps\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\opcashe\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\temporary_downloads\*" "$DOCUMENTS\Opera Backup\"
goto no_backup
check_programdir:
IfFileExists "$INSTDIR\profile\*.ini" 0 no_backup
MessageBox MB_YESNO|MB_ICONQUESTION "Файлы настроек Opera обнаружены в папке назначения. Выполнить резервное копирование файлов настроек для дальнейшего использования? (Будут находиться в каталоге $PROGRAMFILES\Opera Backup)" IDNO no_backup
CreateDirectory "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.xml" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.ini" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.adr" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.dat" "$PROGRAMFILES\Opera Backup\"
CopyFiles "$INSTDIR\Profile\*.js" "$PROGRAMFILES\Opera Backup\"
no_backup:

В общем, резервные копии создаются, но в этом месте:
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\application_cache\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\icons\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\thumbnails\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\widgets\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\vps\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\opcashe\*" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\temporary_downloads\*" "$DOCUMENTS\Opera Backup\"
копируются как сами папки , так и еще файлы в них содержащиеся отдельно. В результате получается каша...
Хочу посоветоваться в чем может быть дело?

kotkovets
12-05-2011, 18:09
wolkow70, вечно вы все перевернете с головы на ноги в тех местах, где совершенно не нужно..рекурсия знаете ли вы...
ну чего уж проще...
CopyFiles /silent "C:\Documents and Settings\АТС\Рабочий стол\договор" "C:\"
целиком папка договор (и все, что в ней находится) с рабочего стола окажется на диске С:\

wolkow70
12-05-2011, 18:36
попроще можно жешь...
Код:
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP" »

Не ваша ли рекомендация?

И мне не надо всю папку копировать, а выборочно папки из нее. Поэтому попробовал так.

Убрал \* и нормально стало копироваться.

CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\cache" "$DOCUMENTS\Opera Backup\"
CopyFiles /silent "$LOCALAPPDATA\Opera\Opera\mail" "$DOCUMENTS\Opera Backup\"

kotkovets
12-05-2011, 21:58
wolkow70,
исходя из-за каких задач...
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"
одно и тоже но... разницу видете - я думаю, что вы не видете :lol:
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config" "$INSTDIR\config\BACKUP"

wolkow70
13-05-2011, 06:31
wolkow70,
исходя из-за каких задач...
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"
одно и тоже но... разницу видете - я думаю, что вы не видете
CreateDirectory "$INSTDIR\config\BACKUP"
CopyFiles /silent "$INSTDIR\config" "$INSTDIR\config\BACKUP" »

Разница в наличии \*
Вот я и написал, что убрал и все заработало.
А что касается задач, то про эту же задачу и шла речь.
Насколько я помню \* означает, что папка будет копироваться со всем вложенным.
Оно и копировалось, только почему-то дублировалось - копировались папки с файлами, и еще файлы отдельно....

sawe
13-05-2011, 15:35
Прошу прощения за возможный флуд. :help:
Меня интересует реальный пример заказной страницы с использованием MUI2 и nsDialog.
Страница должна содержать две ${NSD_CreateCheckBox} с поддержкой флагов и памятью,
для выбора ярлыков на Рабочий стол и Быстрый запуск и ниже две радио кнопки для выбора текущего или всех пользователей.
И возможно ли это реализовать без дополнительных секций?

Так же, хотелось бы увидеть имитацию страницы директории в nsDialog с нормальной кнопкой Обзор...
За ранее благодарен! :clapping:

kotkovets
13-05-2011, 23:28
Так же, хотелось бы увидеть имитацию страницы директории в nsDialog с нормальной кнопкой Обзор... »
Все есть и примеры в папке NSIS\Examples\nsDialogs и читать тут обязательно NSIS\Docs\nsDialogs\Readme.html
В общем пример для всех.
!include "MUI2.nsh"
!include "FileFunc.nsh"
!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomShow fnCustomLeave
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "nsdSetup.exe"
ShowInstDetails show
InstallDir "$PROGRAMFILES"
Var Text
Var Dialog
Var Radio1
Var Radio2
Var Check1
Var Check2
Var CheckBox1
Var CheckBox2
Var RadioButton1
Var RadioButton2
Var BrowseButton

Function fnCustomShow
!insertmacro MUI_HEADER_TEXT "O-па!" \
"Вот оно чё Михалыч!"
nsDialogs::Create 1018
Pop $Dialog
/******************************************************************************/
${NSD_CreateCheckBox} 0u 0u 100u 10u "Ярлык на рабочий стол"
Pop $CheckBox1
${NSD_OnClick} $CheckBox1 CheckBox1 ;обработка события на клик
${If} $Check1 == 1
${NSD_SetState} $CheckBox1 1
${ElseIf} $Check1 == 0
${NSD_SetState} $CheckBox1 0
${Else}
${NSD_SetState} $CheckBox1 1
${EndIf}
/******************************************************************************/
${NSD_CreateCheckBox} 0u 15u 140u 10u "Ярлык на панель быстрого запуска"
Pop $CheckBox2
${NSD_OnClick} $CheckBox2 CheckBox2
${If} $Check2 == 1
${NSD_SetState} $CheckBox2 1
${ElseIf} $Check2 == 0
${NSD_SetState} $CheckBox2 0
${Else}
${NSD_SetState} $CheckBox2 0
${EndIf}
/******************************************************************************/
${NSD_CreateRadioButton} 192u 0u 120u 10u "Для текущего пользователя"
Pop $RadioButton1
${NSD_OnClick} $RadioButton1 RadioButton1
/******************************************************************************/
${NSD_CreateRadioButton} 192u 15u 120u 10u "Для всех пользователей"
Pop $RadioButton2
${NSD_OnClick} $RadioButton2 RadioButton2
/******************************************************************************/
${If} $Radio1 == 1
${OrIf} $Radio2 == 0
${NSD_SetState} $RadioButton1 1
${NSD_SetState} $RadioButton2 0
${ElseIf} $Radio1 == 0
${OrIf} $Radio2 == 1
${NSD_SetState} $RadioButton1 0
${NSD_SetState} $RadioButton2 1
${Else}
${NSD_SetState} $RadioButton1 1
${NSD_SetState} $RadioButton2 0
${EndIf}
${NSD_CreateBrowseButton} 250u 70u 50u 13u "Обзор..."
Pop $BrowseButton
${NSD_OnClick} $BrowseButton BrowseButton
/******************************************************************************/
${NSD_CreateText} 0u 70u 80% 13u "$INSTDIR"
Pop $Text
System::Call `shlwapi::SHAutoComplete(i$Text,i1)`
${NSD_OnChange} $Text DirChange
/******************************************************************************/
nsDialogs::Show
FunctionEnd
/******************************************************************************/
Function CheckBox1
Pop $CheckBox1
${NSD_GetState} $CheckBox1 $Check1
FunctionEnd
Function CheckBox2
Pop $CheckBox2
${NSD_GetState} $CheckBox2 $Check2
FunctionEnd
Function RadioButton1
Pop $RadioButton1
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
Function RadioButton2
Pop $RadioButton2
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
/******************************************************************************/
Function BrowseButton
Pop $BrowseButton
nsDialogs::SelectFolderDialog "Выберите папку..." "$INSTDIR"
Pop $INSTDIR
${IfNot} $INSTDIR == "error"
${NSD_SetText} $Text "$INSTDIR"
${EndIf}
FunctionEnd
/******************************************************************************/
Function DirChange
Pop $Text
GetDlgItem $0 $HWNDPARENT 1
${NSD_GetText} $Text `$INSTDIR`
${GetRoot} $INSTDIR $1
${If} $INSTDIR == ""
${OrIf} $1 == ""
EnableWindow $0 0
${Else}
EnableWindow $0 1
${EndIf}
FunctionEnd
/******************************************************************************/
Function fnCustomLeave
${NSD_GetText} $Text "$INSTDIR"
${If} $INSTDIR == ""
Abort
${EndIf}
${NSD_GetState} $CheckBox1 $Check1
${NSD_GetState} $CheckBox2 $Check2
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
FunctionEnd
/******************************************************************************/
/******************************************************************************/
Section Test
DetailPrint "$$INSTDIR = $INSTDIR"
DetailPrint ""
/**********/
${If} $Check1 = 1
DetailPrint '"Ярлык на рабочий стол"'
DetailPrint ""
${EndIf}
/**********/
${If} $Check2 = 1
DetailPrint '"Ярлык на панель быстрого запуска"'
DetailPrint ""
${EndIf}
/**********/
${If} $Radio1 = 1
DetailPrint '"Для текущего пользователя"'
DetailPrint ""
${EndIf}
/**********/
${If} $Radio2 = 1
DetailPrint '"Для всех пользователей"'
DetailPrint ""
${EndIf}
SectionEnd

sawe
14-05-2011, 03:31
В общем пример для всех.
Большое человеческое спасибо!
Но я имел ввиду две разных (отдельных) страницы, но и этого с головой хватит как основа, там разберёмся.
NSIS\Docs\nsDialogs\Readme.html (http://rghost.ru/6285361) - мне пока плохо даётся освоить его.
Как то я у вас спрашивал на счёт редактора форм для nsDialogs, вы тогда ответили, что такого нет.
За чем обманывать наивных людей, недавно мне попался NSIS Dialog Designer (http://coolsoft.altervista.org/en/nsisdialogdesigner),
но к сожалению он заточен только под Unicode, но это не беда.

kotkovets
14-05-2011, 09:51
Как то я у вас спрашивал на счёт редактора форм для nsDialogs, вы тогда ответили, что такого нет. »
хех, а кто обманывал, первичный релиз 18.04.2011, а когда вы спрашивали?
Сначала почитайте, а потом обвиняйте!!!что за народ пошел ни хрена сами не могут ниче сделать, дай все готовое...




© OSzone.net 2001-2012