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

yol_k
17-10-2011, 15:30
Вопрос в том, чтобы открывать дополнительное окно не закрывая основное окно страницы инсталлятора.

MKN
18-10-2011, 13:33
kotkovets,
Подскажи пожалуйста, а как подкорректировать вышеприведённые примеры, чтобы при нажатии кнопки отметки всех чекбоксов, "кнопка" становиласьь активной ?
Вот так, при нажатии кнопки отметке всех чекбоксов "кнопка" не активна :

!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"
OutFile "test.exe"

Page Custom pre

var dialog
var Checkbox1
var Checkbox2
var Check1
var Check2
var button
var button1

Function pre
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateCheckbox} 0 0 50% 20% "При отметке кнопка станет активной"
Pop $Checkbox1
${NSD_OnClick} $Checkbox1 fnCheckbox1

${NSD_CreateCheckbox} 0 25% 50% 20% "При отметке кнопка станет активной"
Pop $Checkbox2
${NSD_OnClick} $Checkbox2 fnCheckbox2

${NSD_CreateButton} 25% 45% 15% 10% "Кнопка"
Pop $button
EnableWindow $button 0 # start out disabled

${NSD_CreateButton} 40u 105u 140u 15u `Кнопка отметки всех чекбоксов`
Pop $Button1
${NSD_OnClick} $Button1 ButtonClickCheckBox

nsDialogs::Show
FunctionEnd

Function fnCheckbox1
Pop $Checkbox1
Call DisableButton
FunctionEnd
Function fnCheckbox2
Pop $Checkbox2
Call DisableButton
FunctionEnd

Function DisableButton
${NSD_GetState} $Checkbox1 $Check1
${NSD_GetState} $Checkbox2 $Check2

${If} $Check1 == 1
${OrIf} $Check2 == 1 ;логика ИЛИ
EnableWindow $button 1
${Else}
EnableWindow $button 0
${EndIf}
FunctionEnd

Function ButtonClickCheckBox
Pop $Button1

${NSD_GetState} $CheckBox1 $Check1
${NSD_GetState} $CheckBox2 $Check2

${If} $Check1 == 1
${Orif} $Check2 == 1
${NSD_SetState} $CheckBox1 0
${NSD_SetState} $CheckBox2 0
${Else}
${NSD_SetState} $CheckBox1 1
${NSD_SetState} $CheckBox2 1
${EndIf}
FunctionEnd

Section
SectionEnd

kotkovets
18-10-2011, 14:21
чтобы при нажатии кнопки отметки всех чекбоксов, "кнопка" становиласьь активной ? »
MKN мог бы уже сам догадаться, что делать - событие обрабатывать, а функция которая должна
выполнится при при обработке события - DisableButton
Соответственно:
Function ButtonClickCheckBox
Pop $Button1
;--
;--
Call DisableButton
FunctionEnd
Правда все очень просто? я знал, что ты спросишь :)

MKN
18-10-2011, 15:12
Правда все очень просто? »
Действительно... А я полез в обработку состояний для каждого чекбокса...

sawe
18-10-2011, 19:14
Что то я не нашел описания для действий DropList, попробовал через NSIS Dialog Designer, какая дрянь этот Dialog Designer.
Прошу помощи?

!include MUI2.nsh
!include WinMessages.nsh
SetCompressor lzma
XPStyle on
ShowInstDetails show
AutoCloseWindow false

Name "DropList"
OutFile "DropList_test.exe"
InstallDir "$TEMP\DropList test"
RequestExecutionLevel user

Var Dialog
Var Label
Var DropList
Var LngName

Page custom nsiCustomShow nsiCustomLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian

Function nsiCustomShow
!insertmacro MUI_HEADER_TEXT "Выбор установки" "Выберите способ установки и язык программы"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateLabel} 174u 2u 60u 10u "Язык программы:"
Pop $Label

${NSD_CreateDropList} 240u 0u 50u 12u "DropList"
Pop $DropList

SendMessage $DropList ${CB_GETCOUNT} 0 0 $0
IntCmp $0 0 0 0 next
${NSD_CB_AddString} $DropList Russian
${NSD_CB_AddString} $DropList English
${NSD_CB_AddString} $DropList Ukrainian
next:
; Помнить выбранное в выподающем списке!
${Unless} $LngName == ""
SendMessage $DropList ${CB_FINDSTRING} -1 "STR:$LngName" $0
${If} $0 = -1
SendMessage $DropList ${CB_SETCURSEL} 0 0
${Else}
SendMessage $DropList ${CB_SETCURSEL} $0 0
${EndIf}
${Else}
SendMessage $DropList ${CB_SETCURSEL} 0 0
${EndUnless}
${NSD_OnChange} $DropList GetSelectedLng
nsDialogs::Show
FunctionEnd
Function GetSelectedLng
Pop $DropList
${NSD_GetState} $DropList $LngName
; ==========??????
FunctionEnd
Function nsiCustomLeave
${NSD_GetState} $DropList $LngName
FunctionEnd

Section Main # секция установки!
SetOutPath $INSTDIR
SetDateSave off
WriteUninstaller "$INSTDIR\unins000.exe" # создание деинстолятора

${If} $DropList = $LngName
WriteINIStr "$INSTDIR\Lng.ini" "Setting" "Language" $LngName
${EndIf}

DetailPrint "DropList - $DropList"
DetailPrint "LngName - $LngName"
Sleep 3000
ExecShell open "$WINDIR\notepad.exe" "$INSTDIR\Lng.ini"
SectionEnd


PS. примерно такое.
--

kotkovets
18-10-2011, 20:09
Что то я не нашел описания для действий DropLis »
Плохо искал!!!
${NSD_GetState} - это метод для чекбоксов и радиобутонов!
---
---
${NSD_GetText} $DropList $LngName - для текстовых контролов, считываем текст контрола

sawe
18-10-2011, 22:36
Спасибо, а то зациклился почему то на listbox, а слона то и не заметил...

${NSD_LB_GetSelection} listbox_HWND output_variable

--

kotkovets
18-10-2011, 23:09
sawe, кстати насчет CommCtrl.nsh - офигительный хидер!
Сейчас на этом хидере отрисовку TreeView налаживаю - подобно как страничка выбора компонентов!
С деревом выбора + иконочка к каждому чекбоксу + сворачивать дерево.
Может и выложу когда нибудь по секрету как это делается...

sawe
19-10-2011, 04:03
Может и выложу когда нибудь по секрету как это делается... »
Я так понимаю, что суета -> суёт и некогда вам заняться редактором nsDialods....
...

wolkow70
19-10-2011, 14:36
Уважаемый товарищ kotkovets,
Столкнулся с такой проблемой, что при работе с файлом ответов не срабатывают секции из группы радиобутона отмеченные как /o

код секции:

Section /o "Создать однопользовательскую установку" AllUser
${GetSecWriteSucces} AllUser
${If} $SUCCES_SECTION = 1
SetOutPath "$INSTDIR"
File "${pkgdir}\FastStone Image Viewer\FSSettings.db"
File "${pkgdir}\FastStone Image Viewer\Portable.db"
;
SetShellVarContext current
RMDir /r "$APPDATA\FastStone\FSIV\"
${EndIf}
SectionEnd

Я думал, что при установке
${If} $SUCCES_SECTION = 1 имеет приоритет над /o

Получается, что генератор ответов и радиобутоны несовместимы?
В файле ответов AllUser=1

kotkovets
19-10-2011, 14:54
Получается, что генератор ответов и радиобутоны несовместимы? »
А с чего код в секции должен выполняться? ну указали вы на нее, создался файл ответов
Но при запуске установщика секция по умолчанию не отмечена...
Генератор не влияет на флаги секций, делайте программно расставляйте, указывайте флаги инсталлятора в различных
режимах запуска, для таких дел есть хидер Sections.nsh - там куча макросов воздействия на секции программно.

wolkow70
19-10-2011, 17:23
А с чего код в секции должен выполняться? ну указали вы на нее, создался файл ответов
Но при запуске установщика секция по умолчанию не отмечена...
Генератор не влияет на флаги секций, делайте программно расставляйте, указывайте флаги инсталлятора в различных
режимах запуска, для таких дел есть хидер Sections.nsh - там куча макросов воздействия на секции программно. »

Радиобутоны оказалось тут ни при чем. Любая секция отключенная по умолчанию /o не отрабатывает через значение файла ответов. Если для меня важна установка именно по файлу ответов, то что в этом случае может дать расстановка флагов? Ну выставил я их для всех типов установки, все то же самое.
Только тип устанвоки получается "по выбору", а без флагов "полный".

kotkovets
19-10-2011, 17:54
wolkow70, я что нибудь говорил про типы установок? коль вы мое предыдущее сообщение не читали,
даже не пытаясь поработать с section.nsh, то очевидно - вам это не нужно, тем более мне.

wolkow70
19-10-2011, 17:57
даже не пытаясь поработать с section.nsh, то очевидно - вам это не нужно, тем более мне. »

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

kotkovets
19-10-2011, 18:12
Сказывается недостаток в русскоязычных справочных материалах »
В справочнике по NSIS -> перевод справки по NSIS:
SectionGetFlags: получаем статус секции
SectionGetText: получаем название секции
SectionSetFlags: устанавливаем статусы секциям
SectionSetText: назначаем название секции
Через section.nsh очень удобно использовать эти команды
пару дней тренировок на разборки и + применить правильно - больше ниче не нужно!

wolkow70
19-10-2011, 18:24
kotkovets,
Мне алгоритм решения задачи до конца не ясен.
То есть, нужно получить имя и статус секции, назначить ей другое название и изменить статус? А как связать это с генератором ответов потом? Просто прописать в файле ответов значение другой секции?

kotkovets
19-10-2011, 19:19
А как связать это с генератором ответов потом? »
А чет тут думать, бери да пей! Меняем статусы секций в зависимости от нахождения рядом файлика config.ini

!include "MUI2.nsh"
OutFile "test.exe"

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "Russian"

Section /o "test" test
SectionEnd

Section /o "test_1" test1
SectionEnd

Function .OnInit
${If} ${FileExists} "$EXEDIR\config.ini"

!insertmacro SelectSection ${test}
!insertmacro SelectSection ${test1}

${EndIf}
FunctionEnd

wolkow70
19-10-2011, 19:20
Похоже для начала как-то так:

SectionGetFlags ${AllUser} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${AllUser} $0

Тут сложность в том, что незвестно поведение пользователя.

Исходно, имеем радиобутон на две кнопки:
1. Многопользовательская установка (по умолчанию включено) MultiUser
2. Однопользовательская установка (по умолчанию отключена /o) AllUser
При ручной установке все работает. По файлу ответов AllUser не отрабатывет.

Не известно какой вид установки будет выбран.
Видимо после этих секций вставить функцию
SectionGetFlags ${AllUser} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${AllUser} $0
Попробовал скомпилировать ничего не получилось.

kotkovets
19-10-2011, 19:59
wolkow70,
Для генератора важно, что бы секция просто была отмечена. Условие работы генератора
Тихий режим и файл конфиг, я вам дал пример программной отметки секции, больше ни тут ниче и не нужно, в огород не ходи.

wolkow70
19-10-2011, 20:07
wolkow70,
Для генератора важно, что бы секция просто была отмечена. Условие работы генератора
Тихий режим и файл конфиг, я вам дал пример программной отметки секции, больше ни тут ниче и не нужно, в огород не ходи. »

То есть просто добавить в Function .OnInit

${If} ${FileExists} "$EXEDIR\config.ini"
!insertmacro SelectSection ${AllUser}

??
Но там и так эта функция гигантская и в какое место тогда логичнее вставить?

Function .OnInit
StrCpy $1 ${MultiUser}
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
StrCpy $SysDrive $WINDIR 2
StrCpy $GMODE 0 ;если обычный режим, то $GMODE = 0
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${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 $WindowCaption "Генератор ответов ${PRODUCT_NAME} ${PRODUCT_VERSION}" ;меняем название заголовка
IfFileExists "$INIFILE" 0 +2
Delete "$INIFILE" ;удаляем предыдущий файл конфигурации
${EndIf}
FunctionEnd




© OSzone.net 2001-2012