|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
|
.: NSIS - все вопросы :. часть 2.
|
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
|
------- Отправлено: 12:02, 09-12-2012 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать iglezz,
Ага, въехал... А как сделать что бы инсталлятор нельзя было открыть в 7z? Можно в личку. |
|
Последний раз редактировалось AlekseyPopovv, 01-10-2019 в 11:37. Отправлено: 11:28, 01-10-2019 | #2321 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Как создать MUI_PAGE_DIRECTORY custom?
И как задать разные InstallDir для обычной и портативной версий? |
|
Отправлено: 17:59, 04-10-2019 | #2322 |
|
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата AlekseyPopovv:
Цитата AlekseyPopovv:
|
||
|
------- Отправлено: 18:20, 04-10-2019 | #2323 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
|
|
|
Отправлено: 18:42, 04-10-2019 | #2324 |
|
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата AlekseyPopovv:
1) Показать диалог с взаимоисключаемыми секциями 2) На собственной созданной страничке поставили 2 радиобаттона и юзер жмакает тот, который ему нужен (обычная/портативная установки) 3) Или тупо при заапуске показываете мессадж-бокс (сообщение с вопросом "Портативку не желаете?")... 4) Если собственная страничка, то чем создаёте? InstallOptions или nsDialogs? вот как-то так...Ребята, задавайте более конкретные вопросы или сразу кидайте свой код, задаёте размытые вопросы - размытые ответы и получаете... небольшой пример со стандартными средствами с взаимоисключаемыми компонентами (некрасиво, старо и не модно, мне лень что-то воротить "впустую")
!include "MUI.nsh"
!include "Sections.nsh"
!include "Logiclib.nsh"
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
Page custom PageCreate
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
Name "TESTttt"
OutFile "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.exe"
InstallDir "$TEMP"
ShowInstDetails nevershow
Section "Обычная установка" ID_1
SectionEnd
Section /o "Портативная" ID_2
SectionEnd
Function .onSelChange
; Выбор между компонентам 1, 2
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro EndRadioButtons
FunctionEnd
Function .onInit
StrCpy $1 ${ID_1}
FunctionEnd
Function PageCreate
SectionGetFlags ${ID_1} $0 ; Получаем флаги секции
IntOp $0 $0 & ${SF_SELECTED} ; Проверяем, отмеченая ли для установки секция "Обычная установка"
${If} $0 == 1 ; Если $0 = 1, значит секция отмечена для установки
StrCpy $INSTDIR "$PROGRAMFILES\TEST"
${Else}
StrCpy $INSTDIR "$EXEDIR\TEST"
${EndIf}
FunctionEnd
Section -Post
SectionEnd
|
|
|
------- Отправлено: 19:33, 04-10-2019 | #2325 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
!include "MUI2.nsh"
Page Custom FnCustPage FnRadioCheck
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "Test"
InstallDir "$TEMP"
OutFile "Test.exe"
ShowInstDetails nevershow
Var Dialog
Var Check
Var Check1
Var CheckBox
Var CheckBox1
Var Radio
Var Radio1
Var RadioButton
Var RadioButton1
Function FnCustPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
Pop $RadioButton
${NSD_SetState} $RadioButton 1
${NSD_OnClick} $RadioButton RadioButton
${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
Pop $RadioButton1
${NSD_OnClick} $RadioButton1 RadioButton1
${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
Pop $CheckBox
${NSD_SetState} $CheckBox 1
${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
nsDialogs::Show
FunctionEnd
Function Switching
${NSD_GetState} $RadioButton $Radio
${If} $Radio == 1
EnableWindow $CheckBox 1
EnableWindow $CheckBox1 1
${NSD_SetState} $CheckBox 1
${NSD_SetState} $CheckBox1 1
${Else}
EnableWindow $CheckBox 0
EnableWindow $CheckBox1 0
${NSD_SetState} $CheckBox 0
${NSD_SetState} $CheckBox1 0
${EndIf}
FunctionEnd
Function RadioButton
Pop $RadioButton
Call Switching
FunctionEnd
Function RadioButton1
Pop $RadioButton1
Call Switching
FunctionEnd
Function FnRadioCheck
${NSD_GetState} $RadioButton $Radio
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $CheckBox $Check
${NSD_GetState} $CheckBox1 $Check1
FunctionEnd
Section
${If} $Radio == 1
DetailPrint ""
StrCpy $INSTDIR "$PROGRAMFILES\Install"
${EndIf}
SectionEnd
Section
${If} $Radio1 == 1
DetailPrint ""
StrCpy $INSTDIR "$EXEDIR\Portable"
${EndIf}
SectionEnd
Section
${If} $Check == 1
DetailPrint ""
${EndIf}
${If} $Check1 == 1
DetailPrint ""
${EndIf}
SectionEnd
|
|
|
Отправлено: 06:18, 05-10-2019 | #2326 |
|
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать AlekseyPopovv, отвечу сразу на вопрос, заданный в личке
При нажатии кнопки "Назад" - у вас диалог заново инициализируется с вашими прописанными состояниями элементов Соответственно, чтобы сделать более умный диалог, нам нужно код написать таким образом, чтобы он учитывал сей факт, что кто-то нажмёт "Назад" и нам будет необходимо поставить всё так, как выставил пользователь Для этого, нам нужно сначала в секцию .onInit прописать в переменные, состояние элементов управления по-умолчанию: Затем заменим ваш кусок кода: Скрытый текст
Function FnCustPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
Pop $RadioButton
${NSD_SetState} $RadioButton 1
${NSD_OnClick} $RadioButton RadioButton
${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
Pop $RadioButton1
${NSD_OnClick} $RadioButton1 RadioButton1
${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
Pop $CheckBox
${NSD_SetState} $CheckBox 1
${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
nsDialogs::Show
FunctionEnd
Этим: Скрытый текст
Function FnCustPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
Pop $RadioButton
${NSD_SetState} $RadioButton $Radio ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_OnClick} $RadioButton RadioButton
${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
Pop $RadioButton1
${NSD_SetState} $RadioButton1 $Radio1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_OnClick} $RadioButton1 RadioButton1
${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
Pop $CheckBox
${NSD_SetState} $CheckBox $Check ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 $Check1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
EnableWindow $CheckBox $Radio ; Активируем/деактивируем чекбокс из значения радиобаттона
EnableWindow $CheckBox1 $Radio ; Активируем/деактивируем чекбокс1 исходя из значения радиобаттона
nsDialogs::Show
FunctionEnd
Этим мы делаем нашу функцию "умной" с возможностью подхватывать те значения, которые пользователь выбрал и, если вдруг, решил вернуться на страничку Далее заменим Function Switching
${NSD_GetState} $RadioButton $Radio
${If} $Radio == 1
EnableWindow $CheckBox 1
EnableWindow $CheckBox1 1
${NSD_SetState} $CheckBox 1
${NSD_SetState} $CheckBox1 1
${Else}
EnableWindow $CheckBox 0
EnableWindow $CheckBox1 0
${NSD_SetState} $CheckBox 0
${NSD_SetState} $CheckBox1 0
${EndIf}
FunctionEnd
Function Switching
${NSD_GetState} $RadioButton $Radio ; Получаем статус радиобаттона
EnableWindow $CheckBox $Radio ; и используем это значение для активации/деактивации элементов
EnableWindow $CheckBox1 $Radio ; и используем это значение для активации/деактивации элементов
${NSD_SetState} $CheckBox $Radio ; и используем это значение для назначения статуса чекбоксу
${NSD_SetState} $CheckBox1 $Radio ; и используем это значение для назначения статуса чекбоксу
FunctionEnd
![]() Теперь о том, чего не хватает У вас переназначение $INSTDIR прописано в секции, это неправильно, т.к. секции обрабатываются непосредственно при начале установки в соответственно, нам нужно переназначать $INSTDIR до появления диалога выбора директории установки Поэтому можно просто в конец функции FnCustPage прописать то, что нам нужно: ${If} $Radio == 1
StrCpy $INSTDIR "$PROGRAMFILES\Install"
DetailPrint "Папка установки: $INSTDIR"
${Else}
StrCpy $INSTDIR "$EXEDIR\Portable"
DetailPrint "Папка установки: $INSTDIR"
${EndIf}
Section
${If} $Radio == 1
DetailPrint ""
StrCpy $INSTDIR "$PROGRAMFILES\Install"
${EndIf}
SectionEnd
Section
${If} $Radio1 == 1
DetailPrint ""
StrCpy $INSTDIR "$EXEDIR\Portable"
${EndIf}
SectionEnd
Но это чисто мой стиль написания, я не навязываю вам писать свой код таким же образом, просто так он будет выглядеть менее громоздким... Готовый вариант вашего кода
!include "MUI2.nsh"
Page Custom FnCustPage FnRadioCheck
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "Test"
InstallDir "$TEMP"
OutFile "Test.exe"
ShowInstDetails nevershow
Var Dialog
Var Check
Var Check1
Var CheckBox
Var CheckBox1
Var Radio
Var Radio1
Var RadioButton
Var RadioButton1
Function .onInit
StrCpy $Radio 1
StrCpy $Radio1 0
StrCpy $Check 1
StrCpy $Check1 1
FunctionEnd
Function FnCustPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateRadioButton} 5u 10u 124u 12u "1"
Pop $RadioButton
${NSD_SetState} $RadioButton $Radio ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_OnClick} $RadioButton RadioButton
${NSD_CreateRadioButton} 5u 22u 124u 12u "1"
Pop $RadioButton1
${NSD_SetState} $RadioButton1 $Radio1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_OnClick} $RadioButton1 RadioButton1
${NSD_CreateCheckBox} 5u 60u 124u 12u "2"
Pop $CheckBox
${NSD_SetState} $CheckBox $Check ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
${NSD_CreateCheckBox} 5u 72u 124u 12u "2"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 $Check1 ; Используем переменные в значении статуса элемента (отмечен/не отмечен). Начальный статус элемента мы назначили в .onInit
EnableWindow $CheckBox $Radio ; Активируем/деактивируем чекбокс из значения радиобаттона
EnableWindow $CheckBox1 $Radio ; Активируем/деактивируем чекбокс1 исходя из значения радиобаттона
nsDialogs::Show
${If} $Radio == 1
StrCpy $INSTDIR "$PROGRAMFILES\Install"
DetailPrint "Папка установки: $INSTDIR"
${Else}
StrCpy $INSTDIR "$EXEDIR\Portable"
DetailPrint "Папка установки: $INSTDIR"
${EndIf}
FunctionEnd
Function Switching
${NSD_GetState} $RadioButton $Radio ; Получаем статус радиобаттона
EnableWindow $CheckBox $Radio ; и используем это значение для активации/деактивации элементов
EnableWindow $CheckBox1 $Radio ; и используем это значение для активации/деактивации элементов
${NSD_SetState} $CheckBox $Radio ; и используем это значение для назначения статуса чекбоксу
${NSD_SetState} $CheckBox1 $Radio ; и используем это значение для назначения статуса чекбоксу
FunctionEnd
Function RadioButton
Pop $RadioButton
Call Switching
FunctionEnd
Function RadioButton1
Pop $RadioButton1
Call Switching
FunctionEnd
Function FnRadioCheck
${NSD_GetState} $RadioButton $Radio
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $CheckBox $Check
${NSD_GetState} $CheckBox1 $Check1
FunctionEnd
Section
${If} $Check == 1
DetailPrint ""
${EndIf}
${If} $Check1 == 1
DetailPrint ""
${EndIf}
SectionEnd
|
|
------- Отправлено: 08:31, 05-10-2019 | #2327 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать |
|
Последний раз редактировалось AlekseyPopovv, 05-10-2019 в 18:09. Отправлено: 11:29, 05-10-2019 | #2328 |
|
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать AlekseyPopovv, если вы именно про то, чтобы заменить стиль квадратика галочки - то я не знаю, возможно, это делается только рисованием элемента "вручную" через стиль BS_OWNERDRAW
Может здесь кто таким вопросом озадачивался, подскажет |
|
------- Отправлено: 08:22, 06-10-2019 | #2329 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать K.A.V., нет, я про картинки которые меняются при выборе "Установка" или "Распаковка".
Как здесь |
|
Отправлено: 08:25, 06-10-2019 | #2330 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
| [архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
| Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
| Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
| Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 | |
|