Войти

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


Страниц : 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

K.A.V.
05-02-2014, 12:28
Как для каждой из них указать свою директорию? »
Не совсем понятно, что вы имеете ввиду...

Как при отметке определённого компонента изменить каталог установки?

Section /o "Мой компонент"
StrCpy $INSTDIR "C:\Мой путь"
SetOutPath "$INSTDIR"
File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
StrCpy $INSTDIR "C:\Мой путь 2"
SetOutPath "$INSTDIR"
File "мой файл для упаковки 2.txt"
SectionEnd


Или как создать для каждого компонента отдельное запоминание папки?
Section /o "Мой компонент"
Var /global MyVarComponent1
StrCpy $MyVarComponent1 "C:\Мой путь"
SetOutPath "$MyVarComponent1"
File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
Var /global MyVarComponent2
StrCpy $MyVarComponent2 "C:\Мой путь 2"
SetOutPath "$MyVarComponent2"
File "мой файл для упаковки 2.txt"
SectionEnd

navab
05-02-2014, 12:45
K.A.V, нужно чтобы для каждого выбранного компонента пользователь мог сам выбрать путь, просто записать его в скрипте нельзя.
MKN, я так понял это примерно то что нужно, только код приведенный там не компилируется.

# variables to hold the installation directories
var Component1Dir
var Component2Dir
var Component3Dir

# components page
!insertmacro MUI_PAGE_COMPONENTS

# multiple directory pages
!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE Component3Dir
!insertmacro MUI_PAGE_DIRECTORY

# The file installation 'page'
!insertmacro MUI_PAGE_INSTFILES

# The components (sections)
Section Component1
# stuff here. Be sure to use the directory variable corresponding
# to the directory page used. In this case, for example:
SetOutPath "$Component1Dir"
File "somefile"
File "someotherfile"
SectionEnd

Section Component2
# stuff here
SetOutPath "$Component2Dir"
File "somefile"
File "someotherfile"
SectionEnd

Section Component3
# stuff here
SetOutPath "$Component3Dir"
File "somefile"
File "someotherfile"
SectionEnd

# Functions run before showing each directory page.
# Here we'll call Abort to stop the page from showing up
# if the user didn't select the component
Function Component1DirPre
# Get the flags for the section
SectionGetFlags ${Component1} $R0
# Binary 'and' with value '1' (selected or not)
IntOp $R0 $R0 & 1
# If it is not selected
IntCmp $R0 0 0 +2
# Then Abort. This will prevent the page from showing up
Abort
# Otherwise, continue
FunctionEnd

Function Component2DirPre
SectionGetFlags ${Component2} $R0
IntOp $R0 $R0 & 1
IntCmp $R0 0 0 +2
Abort
FunctionEnd

Function Component3DirPre
SectionGetFlags ${Component3} $R0
IntOp $R0 $R0 & 1
IntCmp $R0 0 0 +2
Abort
FunctionEnd

Error in macro MUI_PAGE_DIRECTORY on line 21

K.A.V.
05-02-2014, 13:23
var Component1Dir
var Component2Dir
var Component3Dir

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES






Section TEST1 Component1
SetOutPath "$Component1Dir"
# File "..."
# File "..."
SectionEnd

Section TEST2 Component2
SetOutPath "$Component2Dir"
# File "..."
# File "..."
SectionEnd

Section TEST3 Component3
SetOutPath "$Component3Dir"
# File "..."
# File "..."
SectionEnd

navab
05-02-2014, 13:27
я так понимаю, что мы объявляем две константы времени компиляции. В эти переменные заносится результат возвращаемый Component1Dir например, вызывается макрос и вываливается ошибка в самом макросе:

!ifdef MUI_DIRECTORYPAGE_VARIABLE
DirVar "${MUI_DIRECTORYPAGE_VARIABLE}"
!endif


K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано.

K.A.V.
05-02-2014, 14:24
K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано. »
Я вам дал часть проблемного кода, из-за которого вы получали ошибку компиляции


var Component1Dir
var Component2Dir
var Component3Dir

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY

!insertmacro MUI_PAGE_INSTFILES





Section TEST1 Component1
SetOutPath "$Component1Dir"
# File "..."
# File "..."
SectionEnd

Section TEST2 Component2
SetOutPath "$Component2Dir"
# File "..."
# File "..."
SectionEnd

Section TEST3 Component3
SetOutPath "$Component3Dir"
# File "..."
# File "..."
SectionEnd



Function Component1DirPre
SectionGetFlags ${Component1} $R0
IntOp $R0 $R0 & 1
StrCmp $R0 "1" +2 0
Abort
FunctionEnd

Function Component2DirPre
SectionGetFlags ${Component2} $R0
IntOp $R0 $R0 & 1
StrCmp $R0 "1" +2 0
Abort
FunctionEnd

Function Component3DirPre
SectionGetFlags ${Component3} $R0
IntOp $R0 $R0 & 1
StrCmp $R0 "1" +2 0
Abort
FunctionEnd

navab
05-02-2014, 14:40
Спасибо, все работает. Если можно еще пару вопросов, просто хотел бы разобраться:
1.
StrCmp $R0 "1" +2 0
Abort
что тут происходит?
2. Попробовал переделать функции таким образом:

var Component1Dir
var Component2Dir
var Component3Dir

var chek1
var chek2
var chek3

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY


!insertmacro MUI_PAGE_INSTFILES

# The components (sections)
Section Component1
StrLen $0 "$MUI_PAGE_CUSTOMFUNCTION_PRE"
SetOutPath "$Component1Dir"
SectionEnd

Section Component2
# stuff here
SetOutPath "$Component2Dir"
SectionEnd

Section Component3
# stuff here
SetOutPath "$Component3Dir"
SectionEnd


Function Component1DirPre
SectionGetFlags ${Component1} $chek3
MessageBox MB_OK "$chek3"
${If} $chek3 == 0
Abort
${EndIf}
FunctionEnd

Function Component2DirPre
SectionGetFlags ${Component2} $chek1
MessageBox MB_OK "$chek1"
${If} $chek1 == 0
Abort
${EndIf}
FunctionEnd

Function Component3DirPre
SectionGetFlags ${Component3} $chek2
MessageBox MB_OK "$chek2"
${If} $chek2 == 0
Abort
${EndIf}
FunctionEnd


Значения chek1-chek3 получаю все время одинаковые, либо все 0, либо все 1, соответственно вывод страниц работает не правильно. Что не так?

K.A.V.
05-02-2014, 14:56
что тут происходит? »
Плохо читали справочник, попробуйте сами разобраться
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => SectionGetFlags
+
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => StrCmp

2. Попробовал переделать функции таким образом: »
Я же вам сразу дал переделанные части кода, читайте в справочнике, как правильно прописывать секции
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => Section
У вас секции без индексов (в ссылке, данной MKN изначально код не совсем рабочий), а в моём коде там поправлено, смотрите внимательней

Было (без указаний идентификаторов секций, как у вас сейчас):

Section Component3
# stuff here
SetOutPath "$Component3Dir"
SectionEnd

В моём коде:
Section TEST3 Component3
SetOutPath "$Component3Dir"
# File "..."
# File "..."
SectionEnd

MKN
05-02-2014, 15:11
По моему, идея использовать стандартные страницы PAGE_COMPONENTS для выбора INSTDIR - не удачная...
Ладно, когда компонентов 2-3, а если 10 или более ? Задолбаешься страницы перелистывать и вообще забудешь для какого компонента чего выбрать и уже выбрал...
Такие вещи надо делать на кастомной странице, где всё удобно и наглядно.

navab
05-02-2014, 15:26
Читал и то и другое, я так понял, что полсле опрератора должны идти метки, типа isless, isequal и т.п.
А такая форма
StrCmp $R0 "1" +2 0
означает, что если R0==1, то пропускаем следующую строчку? Но тогда мы просто попадаем на EndFunction, каким образом в этом случае срабатывает механизм отмены показа страницы?
По SectionGetFlags вопросов не было.
Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся?

MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно.

navab
05-02-2014, 15:47
и вдогонку, перед !insertmacro MUI_PAGE_COMPONENTS пишу !insertmacro MUI_PAGE_WELCOME - свал,
Error: resolving install function "Nsis2Io" in function "mui.WelcomePre_23.5.9"
Error - aborting creation process

K.A.V.
05-02-2014, 16:02
StrCmp $R0 "1" +2 0
означает, что если R0==1, то пропускаем следующую строчку? »
В справочнике же есть пример...
Число +2 здесь означает, если значения равны, то пропустить одну команду, относительно команды StrCmp

каким образом в этом случае срабатывает механизм отмены показа страницы? »
Почему отмены то? Если R0==1 - секция отмечена, а если отмечена, значит мы показываем страничку выбора каталога, т.е. не прерываем исполнение следующего по коду макроса командой abort

Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся? »
Такое ощущение, что вы ещё один гость в этой теме, который просто не видит словосочетаний "читайте справочник", примеры в справочнике на страничке SectionGetFlags для кого были написаны? Там разве идёт обращение по имени секции? Или вы такой же уникальный, как некоторые в этой теме, что мы все должны вам персонально пересказать содержание страниц справочника?

и вдогонку »
Может, заплатите всем, кто здесь вам "решает проблемы, которые вы накидываете вдогонку"?
Ищите проблему в своём скрипте, при добавлении строки
!insertmacro MUI_PAGE_WELCOME
у меня ошибки компиляции не возникает

MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно. »
Или не совсем прочитали, судя по вашим вопросам выше
Или вам опять персонально из справочника примеры со странички nsDialogs скопировать сюда?


p.s.
здесь не чат, если вам ещё не ответили на ваше сообщение, редактируйте его, добавляя информацию

MKN
05-02-2014, 16:14
каким образом это сделать? »
С помощью http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#ref-selectfolderdialog
Примеров тьма и в теме и в сети.

navab
05-02-2014, 16:16
не злитесь.
за помощь спасибо

AndreyGun
12-02-2014, 20:24
Доброго времени суток Ув.Форумчане!

Вопрос по NSIS, возможно ли сделать так как здесь:
http://fixila.com/download/FixilaPlus.exe

кто не хочет качать объясню с радостью.

При запуске инсталлятора на странице приветствия есть ссылка на лиц соглашение.

1ый Вопрос - Возможно разместить ссылку в описании на странице приветствия?

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

Тобишь, страница выбора компонентов разделена на несколько страниц, вместо одной.

2ой Вопрос - Возможно ли такое сделать в NSIS (несколько страниц выбора компонентов, только на одной странице одна галочка)? Так как я не знаю в чем собран данный SETUPник

ну и 3ий Вопрос - Можно ли установить фон, на страницАХ выбора компонентов.

Спасибо!

K.A.V.
13-02-2014, 12:22
http://fixila.com/download/FixilaPlus.exe »
При запуске Касперский ругается на попытку приложения загрузить вредоносное ПО, предупреждать нужно

1ый Вопрос - Возможно разместить ссылку в описании на странице приветствия? »
Какой смысл в ссылке на лицензию? Лучше сделать отдельную страничку, т.к. если пользователь запустит установщик на компе, где нет интернета - смысл ссылки пропадает
Приведу сразу пример кода, т.к. вроде бы не видел ещё данной необходимости у кодеров, может, ещё кому пригодится для других нужд



!include "MUI2.nsh" ; Подключаем графический интерфейс средствами nsDialogs

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishLink_K.A.V._Example" ; Функция создания ссылки
!insertmacro MUI_PAGE_WELCOME ; Показ странички приветствия

Page custom MyComponents ; Показ странички компонентов

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "russian"

Caption "K.A.V. Example"
Name "K.A.V. Example"
OutFile "TestLink.exe"


Function WelcomeFinishLink_K.A.V._Example ; Функция создания ссылки
StrCpy $0 "175"
; Если используете MUI_WELCOMEPAGE_TITLE_3LINES, поставьте значение "185"

${NSD_CreateLink} 120u $0u 195u 10u "OSZone.net - лучший сайт!" ; Текст и позиция ссылки
Pop $0
SetCtlColors $0 "0x0000A8" "0xFFFFFF" ; Назначаем синий цвет текста (первый параметр) и цвет фона текста (второй параметр)
${NSD_OnClick} $0 "OpenSite_K.A.V._Example" ; Назначаем действие по нажатию на ссылку, выполнение функции
FunctionEnd

Function OpenSite_K.A.V._Example ; Функция, выполняемая при нажатии на ссылку
ExecShell open "http://www.oszone.net/" ; Команда открытия сайта в интернете
FunctionEnd





Function MyComponents ; Показ странички компонентов
nsDialogs::Create 1018
Pop $0
SetCtlColors $0 "" "0xFFFF80" ; Назначаем желтый цвет фона
SetCtlColors $HWNDPARENT "" "0xFFFF80" ; Назначаем желтый цвет фона

${NSD_CreateCheckBox} 0 45u 100u 10u "Тестовый элемент" ; Тестовый элемент чекбокса
Pop $0
SetCtlColors $0 "" "0xFFFF80" ; Назначаем желтый цвет фона каждому создаваемому элементу

nsDialogs::Show
FunctionEnd





Section
SectionEnd



2ой Вопрос - Возможно ли такое сделать в NSIS (несколько страниц выбора компонентов, только на одной странице одна галочка)? »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) » Описание плагинов » nsDialogs: Создаем собственные страницы инсталлятора
Читали? Походу нет

ну и 3ий Вопрос - Можно ли установить фон, на страницАХ выбора компонентов. »
Ответ в примере моего кода выше

AndreyGun
13-02-2014, 18:45
Справочник по NSIS » Описание плагинов » nsDialogs: Создаем собственные страницы инсталлятора
Читали? Походу нет »
Спасибо большое за ответы.

1. По поводу ссылки, я имел ввиду вообще ссылку на что то )(Это для справки) Это у меня кстати частично получилось:
http://nsis.sourceforge.net/Add_link_to_welcome_page_(MUI)
Единственный минус в том что нужно вводить квадрат видимости ссылки который перекрывается страницу, то есть -
Текст
Ссылка - сделать можно, а

Текст
ССылка
Текст - не получается, белый фон перекрывает текст что ниже ссылки.(по крайней мере у меня)

2. Читал справочник, и по nsDialogs, но я пока не могу разобраться в назначении действий, Т.е - чтобы при нажатии на чекбокс выбиралась программа для установки, а не просто "клацалась" галочка, чтобы при нажатии кнопки "Назад" выполнялось соответствующее действие.
Еще Я пробовал через HM NSIS Edit создать страницу, создал, все в точности как мне нужно, кнопки расположенны в нужных местах, но я не пойму как кнопке назначить действие - назад , вперед и тд(как выше описано).
(Делал кстати по справочнику Обучение IO собственные странички)

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

3. Кстати вопрос назрел, переместить кнопку, тоже через nsDialogs можно?

AndreyGun
13-02-2014, 22:10
При запуске Касперский ругается на попытку приложения загрузить вредоносное ПО, предупреждать нужно »
Cорри, у меня стандартный WIn 8 защитник молчит. Может не вирус, а как например на кряки для игр ругается.

K.A.V.
13-02-2014, 22:19
1. По поводу ссылки, я имел ввиду вообще ссылку на что то )(Это для справки) »
Я же вам привёл универсальный код, там вызывается функция при нажатии на ссылку, а какой вам функционал нужен при нажатии - уже пишите сами, в моём примере это команда открытия сайта
Вы просили ссылку в тексте, как в указанном вами установщике - я вам дал готовый код

не могу разобраться в назначении действий, Т.е - чтобы при нажатии на чекбокс выбиралась программа для установки, а не просто "клацалась" галочка »
Вам просто нужно прочитать состояние чекбокса в переменную (1 - галочка стоит, 0 - не стоит), а затем на этапе установки просто выполнять необходимые действия, в зависимости от состояния чекбокса, пример чтения статуса чекбокса есть в справочнике:
${NSD_GetState} $CheckBox $R0
$CheckBox - переменная элемента управления, с помощью данной переменной мы будем читать значение чекбокса, когда она указывается - тоже есть в справочнике, при создании элемента:
${NSD_CreateCheckBox} 0 45u 100u 10u "Можно отметить флажком"
Pop $CheckBox
Пробовали хотя бы сами вписать код в справочнике и посмотреть на результат? Я же здесь ничего нового сейчас не написал...

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

Воспользуйтесь поиском в теме по фразе "nsDialogs", много примеров здесь найдёте

3. Кстати вопрос назрел, переместить кнопку, тоже через nsDialogs можно? »
Кнопку, такую как "Далее" и "Отмена"? Можете редактировать файл ресурса интерфейса в папке NSIS:
.\NSIS\Contrib\UIs
Точнее, взять оттуда файл, отредактировать и прописать в скрипте:
!define MUI_UI "путь к exe файлу"

AndreyGun
13-02-2014, 23:45
Пробовали хотя бы сами вписать код в справочнике и посмотреть на результат? »

Пробовал, я просто еще не особо "догоняю" в этой теме)

Спасибо за полезные ответы, очень признателен.

Kopejkin
15-02-2014, 22:16
Почему-то после установки NSIS 3.02 HM NIS Edit 2.0.3 не может открыть скомпилированный файл.
---------------------------
Win32 Error. Code: 2.
Не удается найти указанный файл.
--------------------------
Вручную файл нормально запускается.




© OSzone.net 2001-2012