Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
На NSD можно сделать? »
Можно. Навскидку - так :
!include "MUI2.nsh"
!include "CommCtrl.nsh" ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"
Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR} 0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC
${NSD_LV_InsertColumn} $1 0 150 "Заголовок - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT}
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE}
!undef _LISTVIEW_TEMP_STYLE
; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1 ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9" ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
; Установить состояние чекбоксов
${NSD_LV_SetCheckState} $1 0 1 ; отмечен
${NSD_LV_SetCheckState} $1 1 0 ; не отмечен
${NSD_LV_SetCheckState} $1 2 1 ; отмечен
; и т.д.
; кнопка контроля состояния чекбоксов
${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ;
Pop $2
${NSD_OnClick} $2 CheckItemState
nsDialogs::Show
System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd
Function CheckItemState
${NSD_LV_GetCheckState} $1 0 $R0
${NSD_LV_GetCheckState} $1 1 $R1
${NSD_LV_GetCheckState} $1 2 $R2
; и т.д.
IntCmp $R0 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 0"
IntCmp $R1 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 1"
IntCmp $R2 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 2"
; и т.д.
MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd
Section
SectionEnd
CheckItemState наверняка можно сделать универсальной для любого кол-ва Item_ов. Неохота заморачиваться...
Можно. Навскидку - так : »
Круто! Настолько круто, что допилить до ума моих скудных знаний не хватит...
http://fs2.directupload.net/images/150717/temp/l3tyhpjy.png (http://fs2.directupload.net/images/150717/l3tyhpjy.png)
upd. Помогите, пожалуйста с CheckBox'ами. Как сделать проверку отметки универсальной, чтоб не руками вписывать, т.к. их количество будет каждый раз разное.
Как сделать проверку отметки универсальной »
Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода...
Можно такой вариант (если чисто для информации) - инфа об исходном, дефолтовом (до того, как пользователь их отметит или снимет отметку !) состоянии чекбоксов (можно по всякому сделать, в зависимости от цели) :
Function CheckItemState
StrCpy $R5 0
loop:
IntOp $R5 $R5 + 1 ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ; в $R0 - 1 или 0, в зависимости от исходной отметки чекбокса
StrCmp $R5 "$R3" Done ; выход из цикла после опроса последнего чекбокса
MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
Goto Loop
Done:
FunctionEnd
Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода... »
Пользователь выберет нужные элементы, и дальше инсталлятор будет работать только с отмеченными (копирование файлов, запись в БД и т.д.).
Пользователь выберет нужные элементы, и дальше инсталлятор будет работать только с отмеченными »
Тогда, первым делом переименуй кнопку ${NSD_CreateButton} 0u 124u 300u 15u "Install" . :)
Этой кнопкой будешь запускать инсталляцию после отметки чекбоксов, а родную кнопку Install - удаляешь со страницы
Функция почти такая же :
Function CheckItemState
StrCpy $R5 -1
loop:
IntOp $R5 $R5 + 1 ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ; в $R0 - 1 или 0 , в зависимости от отметки чекбокса
StrCmp $R5 "$R3" Done ; выход из цикла после опроса последнего чекбокса
;MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
StrCpy $R8 "$R8 $R0"
Goto Loop
Done:
StrCpy $R8 $R8 -1 ; отсекаем 1 последний символ строки
MessageBox MB_OK "$R8" ; в $R8 - строка с последовательностью 1 и 0 , т.е. отмеченных или не отмеченных чекбоксов
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd
Вот это: StrCpy $R5 -1 и вот это: StrCpy $R8 $R8 -1 - коррекция издержек счёта... Может можно и по другому, не разбирался, т.к. так работает нормально...
В итоге : в $R8 - строка с последовательностью 1 и 0 , т.е. отмеченных или не отмеченных всех чекбоксов
А далее, в зависимости от того, который по счёту символ в строке будет 1, т.е. отмеченным чекбоксом, то простой логикой, если символ под номером таким то (а это номер точно известного компонента) равен 1 , то он и устанавливается. Конечно можно и по другому. Но так , как мне кажется, будет проще...
первым делом переименуй кнопку »Интерфейс ещё будет меняться. С этим разберусь, это я могу (http://forum.oszone.net/thread-302473.html) :)
Огромнейшее спасибо! Я про этот ListView вообще не знал... Буду дальше разбираться.
А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox?
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_AUTOCHECKSELECT} ${LVS_EX_AUTOCHECKSELECT}
http://fs2.directupload.net/images/150717/temp/vq48jq5r.png (http://fs2.directupload.net/images/150717/vq48jq5r.png)
Но не то. Оно вон как отображается. CheckBox появляется только при наведении.
А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox? »
Если хотите творить на NSIS "по-настоящему" - углубляйтесь в познание WinAPI (что такое сообщения/уведомления и т.д.) и будет вам счастье
!include "MUI2.nsh"
!include "CommCtrl_.nsh" ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"
Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR} 0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC
${NSD_LV_InsertColumn} $1 0 150 "Заголовок - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT}
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE}
!undef _LISTVIEW_TEMP_STYLE
${NSD_OnNotify} $1 OnClickListView
; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1 ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9" ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
; Установить состояние чекбоксов
${NSD_LV_SetCheckState} $1 0 1 ; отмечен
${NSD_LV_SetCheckState} $1 1 0 ; не отмечен
${NSD_LV_SetCheckState} $1 2 1 ; отмечен
; и т.д.
; кнопка контроля состояния чекбоксов
${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ;
Pop $2
${NSD_OnClick} $2 CheckItemState
nsDialogs::Show
System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd
Function CheckItemState
${NSD_LV_GetCheckState} $1 0 $R0
${NSD_LV_GetCheckState} $1 1 $R1
${NSD_LV_GetCheckState} $1 2 $R2
; и т.д.
IntCmp $R0 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 0"
IntCmp $R1 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 1"
IntCmp $R2 1 0 +2
StrCpy $R4 "$R4$\r$\n отмечен 2"
; и т.д.
MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd
Function OnClickListView
System::Store SR2R1R0
${Select} $R1
${Case} ${NM_CLICK} ; если событие - клик мыши
SendMessage $R2 ${LVM_GETHOTITEM} 0 0 $0 ; узнаём, на какой элемент пользователь нажал
${NSD_LV_GetCheckState} $1 $0 $2 ; узнаём статус галочки - стоит или не стоит
${If} $2 == "1" ; если галочка стоит
${NSD_LV_SetCheckState} $1 $0 0 ; снимаем галочку
${Else}
${NSD_LV_SetCheckState} $1 $0 1 ; ставим галочку, если не стоит
${EndIf}
${EndSelect}
System::Store L
FunctionEnd
Section
SectionEnd
Когда то kotkovets сотворил интересный и полезный код - кнопочный тулбар из bmp
!include "CommCtrl.nsh"
!include "MUI2.nsh"
OutFile "ToolbarButton-test.exe"
ShowInstDetails Show
Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
xpstyle off
var dlg
var toolbar
!define ID_0 100
!define ID_1 101
!define ID_2 102
!define ID_3 103
!define ID_4 104
!define ID_5 105
!define ID_6 106
!define ID_7 107
!define ID_8 108
!define ID_9 109
Function CreatePage
System::Call "comctl32::ImageList_Create(i32,i32,i${ILC_MASK}|${ILC_COLORDDB},i1,i0)i.R8" ;создаем имеджлист
System::Call 'user32::LoadImage(i0,t"image-line.bmp",i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE}|${LR_DEFAULTSIZE})i.R9'
;загружаем картинку в имеджлист первая картинку имеет индекс - 0
System::Call "comctl32::ImageList_AddMasked(iR8,iR9,i${CLR_DEFAULT})"
System::Call "gdi32::DeleteObject(iR9)"
nsDialogs::Create 1044
Pop $dlg
${NSD_CreateToolbar} 20u 5u 100% 40u ""
Pop $toolbar
${NSD_AddStyle} $toolbar ${WS_BORDER}
SendMessage $toolbar ${TB_BUTTONSTRUCTSIZE} 20 0
SendMessage $toolbar ${TB_SETIMAGELIST} 0 $R8 ;созданный имеджлист помещаем на тулбар
${NSD_OnNotify} $toolbar toolbar
${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0 ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки]
${NSD_TB_ADDSEPARATOR} $toolbar ; добавляем сепаратор(разделитель)
${NSD_TB_ADDBUTTONS} $toolbar ${ID_1} 1
${NSD_TB_ADDBUTTONS} $toolbar ${ID_2} 2
${NSD_TB_ADDBUTTONS} $toolbar ${ID_3} 3
${NSD_TB_ADDBUTTONS} $toolbar ${ID_4} 4
${NSD_TB_ADDBUTTONS} $toolbar ${ID_5} 5
${NSD_TB_ADDBUTTONS} $toolbar ${ID_6} 6
${NSD_TB_ADDBUTTONS} $toolbar ${ID_7} 7
${NSD_TB_ADDBUTTONS} $toolbar ${ID_8} 8
${NSD_TB_ADDBUTTONS} $toolbar ${ID_9} 9
nsDialogs::Show
System::Call "comctl32::ImageList_Destroy(iR8)"
FunctionEnd
Function ID_LOAD
MessageBox MB_OK "$R1 --> ID_0" IDOK
FunctionEnd
Function ID_1
MessageBox MB_OK "$R1 --> ID_1" IDOK
FunctionEnd
Function ID_2
MessageBox MB_OK "$R1 --> ID_2" IDOK
FunctionEnd
Function ID_3
MessageBox MB_OK "$R1 --> ID_3" IDOK
FunctionEnd
Function ID_4
MessageBox MB_OK "$R1 --> ID_4" IDOK
FunctionEnd
Function ID_5
MessageBox MB_OK "$R1 --> ID_5" IDOK
FunctionEnd
Function ID_6
MessageBox MB_OK "$R1 --> ID_6" IDOK
FunctionEnd
Function ID_7
MessageBox MB_OK "$R1 --> ID_7" IDOK
FunctionEnd
Function ID_8
MessageBox MB_OK "$R1 --> ID_8" IDOK
FunctionEnd
Function ID_9
MessageBox MB_OK "$R1 --> ID_9" IDOK
FunctionEnd
Function toolbar
System::Store SR2R1R0
; NM_CLICK уведомляет родительское окно органа управления, что пользователь щелкнул левой кнопкой мыши в пределах органа управления
${If} $R1 == ${NM_CLICK} ;уведомление о клике мыши по тулбару
System::Call "*$R0(i,i,i,i.R1)"
${Select} $R1 ; в $R1 - возвращенный идентификатор кнопки
${Case} ${ID_0}
Call ID_LOAD
${Case} ${ID_1}
Call ID_1
${Case} ${ID_2}
Call ID_2
${Case} ${ID_3}
Call ID_3
${Case} ${ID_4}
Call ID_4
${Case} ${ID_5}
Call ID_5
${Case} ${ID_6}
Call ID_6
${Case} ${ID_7}
Call ID_7
${Case} ${ID_8}
Call ID_8
${Case} ${ID_9}
Call ID_9
${EndSelect}
${EndIf}
System::Store L
FunctionEnd
Section ""
SectionEnd
http://s015.radikal.ru/i333/1507/40/661a9989a505.jpg
Но к сожалению этот код нормально компилится только в версии NSIS 2.46. В NSIS 3 получаем ошибку...
И дело похоже в CommCtrl.nsh. Даже откорректированная для NSIS 3 ( из справочника) - не работает.
А не работает наверное потому , что в этом варианте CommCtrl.nsh нет макросов для Toolbar_а (__NSD_TB_ADDBUTTONS и сопутствующее добро... )
Как бы это дело подретушировать для NSIS 3 ? Я в сети находил вариант CommCtrl.nsh с нужными макросами, но подстановка их в CommCtrl.nsh всё равно приводит к ошибке...
${DEFINE} CMB_MASKED 0x02
${DEFINE} TBSTATE_CHECKED 0x01
${DEFINE} TBSTATE_PRESSED 0x02
${DEFINE} TBSTATE_ENABLED 0x04
${DEFINE} TBSTATE_HIDDEN 0x08
${DEFINE} TBSTATE_INDETERMINATE 0x10
${DEFINE} TBSTATE_WRAP 0x20
${DEFINE} TBSTATE_ELLIPSES 0x40
${DEFINE} TBSTATE_MARKED 0x80
${DEFINE} TB_ADDBUTTONS 1044
${DEFINE} TB_INSERTBUTTON 1045
${DEFINE} TB_DELETEBUTTON 1046
${DEFINE} TB_GETBUTTON 1047
${DEFINE} TB_BUTTONCOUNT 1048
${DEFINE} TB_COMMANDTOINDEX 1049
${DEFINE} TB_HITTEST 1093
#################################################################
# ${NSD_TB_ADDBUTTONS} #
#################################################################
!macro __NSD_TB_ADDBUTTONS htoolbar_ ID_CODE_ IMAGE_
!verbose push
!verbose ${_COMMCTRL_NSH_VERBOSE}
Push `${htoolbar_}`
Push `${ID_CODE_}`
Push `${IMAGE_}`
${CallArtificialFunction} __NSD_TB_ADDBUTTONS_Call
!verbose pop
!macroend
!macro __NSD_TB_ADDBUTTONS_Call
System::Store SR2R1R0
System::Call "*(iR2, iR1, i${TBSTATE_ENABLED}, i${TBSTYLE_BUTTON}, i0, i0)i.R1"
SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
System::Free $R1
System::Store L
!macroend
${DEFINE} NSD_TB_ADDBUTTONS "!insertmacro __NSD_TB_ADDBUTTONS"
#################################################################
!macro __NSD_TB_ADDSEPARATOR htoolbar_
!verbose push
!verbose ${_COMMCTRL_NSH_VERBOSE}
Push `${htoolbar_}`
${CallArtificialFunction} __NSD_TB_ADDSEPARATOR_Call
!verbose pop
!macroend
!macro __NSD_TB_ADDSEPARATOR_Call
System::Store SR0
System::Call "*(i-1, i0, i0, i${TBSTYLE_SEP}, i0, i0)i.R1"
SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
System::Free $R1
System::Store L
!macroend
${DEFINE} NSD_TB_ADDSEPARATOR "!insertmacro __NSD_TB_ADDSEPARATOR"
!define __NSD_Toolbar_CLASS ${TOOLBARCLASSNAME}
;!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT} ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE}
!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT}|${CCS_NORESIZE}|${CCS_ADJ USTABLE}|${CCS_NODIVIDER}
!define __NSD_Toolbar_EXSTYLE 0
!insertmacro __NSD_DefineControl Toolbar
Даже откорректированная для NSIS 3 ( из справочника) - не работает »
:tongue:
K.A.V.,
И этот хедер не работает... Ну что такое...
!insertmacro: __NSD_TB_ADDBUTTONS
!verbose: Invalid verbose level
Error in macro __NSD_TB_ADDBUTTONS on macroline 2
Error in script "\ToolBarWindow32.nsi" on line 41 -- aborting creation process
41 строка : (${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0 ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки])
И этот хедер не работает... »
Врёшь
В этом хидере в макросе ${NSD_TB_ADDBUTTONS} нет команды !verbose, смотри внимательней, что/куда копируешь и какой код компилируешь
K.A.V.,
Разобрался. Опять у меня -25. Если рядом с файлом скрипта другой CommCtrl.nsh - ошибка. Что за хрень... Уже ведь такое было.
Но есть такой момент - пол тулбара теперь обрезано...
http://s020.radikal.ru/i709/1507/bd/0c131c96658d.jpg
И нет никакой реакции у ${NSD_CreateToolbar} на изменение размера и позиции...
То же, при компиляции в 2.46 - работает нормально...
ps раскомментировал в CommCtrl.nsh ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE} - и всё заработало. (нужно было ${CCS_NORESIZE} )
углубляйтесь в познание WinAPI »
Да, походу надо :) Зря институ бросал. Учился когда-то на программиста. Но даже первый курс не закончил - работать пошёл.
Спасибо за помощь.
Кстати, у всех сайт не работает? nsis.sourceforge.net (http://nsis.sourceforge.net/)
P.S. Этот ListView для меня как "новые ворота".
ps раскомментировал в CommCtrl.nsh ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE} - и всё заработало. (нужно было ${CCS_NORESIZE} ) »
ну я не особо проверял работоспособность, лень, откомпилировался проект и создался тулбар - мне хватило :biggrin:
Зря институ бросал. Учился когда-то на программиста »
Чтобы программировать - образование не нужно, это я вам как самоучка говорю :yes:
Кстати, у всех сайт не работает? nsis.sourceforge.net »
У всех
Dodakaedr
21-07-2015, 23:55
Подскажите как записать двойной слеш в ini файл?[Directories]
TempDir=C:\\Users\\Admin\\AppData\\Local\\Temp\\acity_temp
Подскажите как записать двойной слеш в ini файл? »
Справочку когда читать будем?
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => StrRep
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => WriteINIStr
!include "StrFunc.nsh"
${StrRep}
OutFile "test.exe"
Section
${StrRep} $0 "$TEMP\acity_temp" "\" "\\"
WriteINIStr "$EXEDIR\TEST.ini" "Directories" "TempDir" "$0"
quit
SectionEnd
Dodakaedr
22-07-2015, 16:33
А как с таким быть? [Directories]
TempDir=D:\\����� ����� (2)\\Audacity 2.1\\AppData\\audacity_temp
Поместите скомпилированный файл в папку в названии которой есть кириллица и посмотрите у вас таже фигня:!include "StrFunc.nsh"
${StrRep}
OutFile "test.exe"
Section
SetShellVarContext current
CreateDirectory "$APPDATA\Audacity"
${StrRep} $0 "$EXEDIR\AppData\audacity_temp" "\" "\\"
WriteINIStr "$APPDATA\Audacity\audacity.cfg" "Directories" "TempDir" "$0"
;ExecWait "C:\Program Files\Audacity44\audacity.exe"
quit
SectionEnd
Поместите скомпилированный файл в папку в названии которой есть кириллица и посмотрите у вас таже фигня: »
Ваш INI файл не в ANSI кодировке
Dodakaedr
22-07-2015, 21:33
Ваш INI файл не в ANSI кодировке »
Да, действительно. В левой программе изменил кодировку и все ок. Теперь осталось эту кодировку оформить в скрипте. Вы не знаете как это сделать?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC