Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
wolkow70
20-01-2014, 17:30
Не? »
Нет. Мне нужно определить путь не к папке с NSIS, а к папке со скриптами, которые на другом диске. А нужно для того, чтобы не править скрипты при запуске из под разных ОС, расположенных на разных логических разделах.
Например: !define pkgdir "D:\NSIS".
Но при запуске из под разных ОС, расположенных на разных логических разделах буква диска определяется по разному, и приходится править скрипт перед запуском
приходится править скрипт »
А не проще ли, вернее - правильнее, никогда не использовать в скриптах явные пути.
В частности, не привязывать плагины к конкретному местоположению.
Достаточно в скрипте указать : !addplugindir . ( или указать иной уровень вложения) и "положить" нужные плагины рядом со скриптом.
Мне нужно определить путь не к папке с NSIS »
Я вам показал пример использования команды для извлечения буквы диска из пути, а не определение папки NSIS
По сути можно воспользоваться обычной командой StrCpy по отсеву первых 2-х символов в строке пути, о команде StrCpy написано в нашем справочнике
Но при запуске из под разных ОС, расположенных на разных логических разделах буква диска определяется по разному, и приходится править скрипт перед запуском »
Вам правильно ниже MKN написал, об этом и в справочнике сказано:
Данная команда добавляет дополнительный каталог в дополнение к ${NSISDIR}\Include, в котором расположены ваши Include файлы, очень удобно для отдельного большого проекта
!addincludedir ..\include
!include something.nsh
Данная команда добавляет дополнительный каталог в дополнение к ${NSISDIR}\Plugins, в котором расположены ваши NSIS плагины, очень удобно для отдельного большого проекта
!addplugindir myplugin
MyPlugin::SomeFunction
Определение кодовой страницы
Функция GetACP получает кодовую страницу, установленную на компьютере (ANSI).
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318070(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
outfile "codepage.exe"
Section
System::Call 'Kernel32::GetACP() i .r18'
MessageBox MB_OK " codepage $R8"
SectionEnd
Vincent7
22-01-2014, 16:16
Подскажите, как установить ограничение на количество вводимых символов в текстбокс?
Подскажите, как установить ограничение на количество вводимых символов в текстбокс? »
Сейчас все кинутся и напишут вам всевозможные варианты кодов (IO, nsDialogs, WinAPI), которые только могут быть, с надеждой, что один из них будет тот, который вам нужен
ограничение на количество вводимых символов в текстбокс »
Используй (пример для 5 символов переменной Password_Text) :
${NSD_SetTextLimit} $Password_Text 5
${NSD_SetTextLimit} $Password_Confirm 5
А точнее, используй http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
${NSD_SetTextLimit} control_HWND limit
Vincent7
22-01-2014, 20:34
Спасибо. А как сделать чтобы в текстбокс можно было вводить только цифры?
Спасибо. А как сделать чтобы в текстбокс можно было вводить только цифры? »
${NSD_CreateText} 0 0 100% 12u "1234567890"
pop $Text
${NSD_AddStyle} $Text ${ES_NUMBER}
Vincent7
22-01-2014, 22:20
Благодарствую.
Ввод цифрового пароля (в примере - это 77777 ) с сопроводительными сообщениями можно организовать и так :
OutFile 'Password-Example.exe'
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"
!include 'WordFunc.nsh'
Page custom ConfigPage CheckConfig ''
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE 'English'
!insertmacro StrFilter
Var Password_Text
Var Password_Confirm
Function ConfigPage
!insertmacro MUI_HEADER_TEXT 'TEXT' 'HEADER_TEXT'
nsDialogs::Create 1018
Pop $0
${NSD_CreateGroupBox} 50% 0 50% 80% " Пароль"
${NSD_CreateLabel} 61% 20u 30% 10% ' Введите пароль'
${NSD_CreateLabel} 60% 70u 33% 10% ' Подтвердите пароль'
${NSD_CreatePassword} 65% 40u 20% 10% ''
Pop $Password_Text
${NSD_CreatePassword} 65% 85u 20% 10% ''
Pop $Password_Confirm
; максимальное количества цифр пароля
${NSD_SetTextLimit} $Password_Text 5
${NSD_SetTextLimit} $Password_Confirm 5
${NSD_OnChange} $Password_Text EditNotify
${NSD_OnChange} $Password_Confirm EditNotify
nsDialogs::Show
FunctionEnd
Function CheckConfig
${NSD_GetText} $Password_Text $0
${NSD_GetText} $Password_Confirm $1
${If} $0 == ''
${OrIf} $1 == ''
MessageBox MB_OK 'Введите пароль !'
Abort
${EndIf}
; ПАРОЛЬ
StrCpy $5 77777
${If} $0 != $5
MessageBox MB_OK 'Не правильный пароль ! !'
Abort
${EndIf}
${If} $0 == $5
${AndIf} $1 != $5
MessageBox MB_OK 'Не правильное подтверждение пароля !'
Abort
${EndIf}
FunctionEnd
Function EditNotify
Pop $R0
; считываем изменения из $R0 и заносим в переменную $0
${NSD_GetText} $R0 $0
; определяем длину строки из $0 ( заносим значение в $1 )
StrLen $1 $0
; фильтруем для $0 ( это $Password_Text ), ввод только цифр (для этого уст значение параметра : 1 )
; заносим результат в $2
${StrFilter} $0 '1' '' '' $2
; определяем длину строки из $2 - ( заносим значение в $3 )
StrLen $3 $2
; если $1 равно любому значению, кроме равного $3
${If} $1 <> $3
MessageBox MB_OK 'Для ввода допустимы только цифры !'
${EndIf}
FunctionEnd
Section
SectionEnd
Ессно можно ещё расширить параметры проверки пароля - проверять количество вводимых символов, разбивку на группы (если надо ), сразу вызывать сообщение , если ввод не верный и т.д.
Появился новый "шкурный" проект для NSIS : VCL Styles for NSIS
http://theroadtodelphi.wordpress.com/2014/01/23/vcl-styles-for-nsis/
Но размер NSISVCLStyles.dll явно велик, что не есть хорошо...
Но размер NSISVCLStyles.dll явно велик »
1,5-то мегабайт? По сравнению с той dll, которую я в SFX Creator юзаю это просто божественно, там от DMSoft целые 6 Мб :biggrin: (правда там упакованы сразу и необходимые DLL), а как здесь поведёт себя DLL на разных системах - нужно только тестить
Вот парни написали скрипт (может, и девушки), а написать инсталлер своего же скина нормально не смогли, сидел тупил сейчас пару минут, хотел сразу после установки скомпилить скрипт примера, а мне компилятор такой говорит
Invalid command: NSISVCLStyles::LoadVCLStyleA
Error in script "C:\Program Files\The Road To Delphi\NSISVCLStyles\Scripts\example1.nsi" on line 47 -- aborting creation process
Прошелся по папкам NSIS - и правда нету dll :)
Вообщем, у кого ОС 32-bit, бегите за файлом плагина в папочку C:\Program Files (x86)\NSIS :biggrin:
кстати, пока бродил по папкам увидел редакторы скинов, запустил, посмотрел пару минут - вроде всё выглядит довольно серьёзно и на первый взгляд - подход разрабов нравится
1,5-то мегабайт? По сравнению с той dll, которую я в SFX Creator юзаю это просто божественно »
Если инсталлер без скина -100К, а ошкуренный в 10 раз более, то это совсем не божественно... :)
А с установкой автор действительно промахнулся... У меня эта DLL вообще никак и никуда не попала. Пришлось просто извлечь её из установщика.
Если инсталлер без скина -100К, а ошкуренный в 10 раз более »
Паниковать из-за таких цифр можно было лет 10 назад, когда в ходу были флоппи-дисководы, помню, моя первая скопированная игра другу - копирование ярлыка с рабочего стола :biggrin:
Сейчас же, этот мегабайт особого веса не придаёт, если учесть сжатие и объёмы данных, которые пользователям вообще приходится качать в наше время...К тому же, что это за установщик на 100К? Распаковать пару своих фоток? ;)
Всё равно, для альтернативы пойдёт (к тому же, если присутствует встроенный редактор скинов), хоть какое-то разнообразие в поддержке скинов+составление конкуренции другим разрабам подобных плагинов
Сейчас же, этот мегабайт особого веса не придаёт »
Вообщем то да. За исключением всё же, когда инсталлер малого объёма, что бывает часто (разные служебные утилиты и конструкторы). Вот тут то, если захочешь украсить инсталлер, и удивляешься размеру такой одёжки... :) Ведь есть же та же SkinH.dll, малого объёма.
Проигрывание WAV-файлов
!define SND_ASYNC 1
!define SND_FILENAME 0x20000
!define SND_LOOP 8
; Проигрываем с ожиданием завершения
System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME})'
; Проигрываем без ожидания завершения
System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME}|${SND_ASYNC})'
; Проигрываем без ожидания завершения + с зацикливанием
System::Call 'Winmm::PlaySound(t"$EXEDIR\sound.wav", i0, i${SND_FILENAME}|${SND_ASYNC}|${SND_LOOP})'
Может, кому пригодится, буду юзать в своём креаторе
Минимум ОС: Win2000
Vincent7
26-01-2014, 14:20
Скажите, почему в onclick функции не срабатывает abort?
${NSD_OnClick} $button click
function click
MessageBox MB_OK "Abort"
abort
functionend
Сообщение есть, аборта нет
Function func
nsDialogs::Create 1018
pop $0
${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
pop $button
${NSD_OnClick} $button click
nsDialogs::Show
FunctionEnd
function click
MessageBox MB_OK "Abort"
abort
MessageBox MB_OK|MB_ICONINFORMATION "after abort"
functionend
Сообщение есть, аборт есть, второго сообщения нет, что я делаю не так, чтобы получить ваше "Сообщение есть, аборта нет"?
Vincent7
27-01-2014, 00:07
!include "nsDialogs.nsh"
Page custom func
OutFile "test.exe"
var button
Function func
nsDialogs::Create 1018
pop $0
${NSD_CreateButton} 25u 27u 150u 15u "Жми давай!"
pop $button
${NSD_OnClick} $button click
nsDialogs::Show
FunctionEnd
function click
MessageBox MB_OK "Abort"
abort
MessageBox MB_OK|MB_ICONINFORMATION "after abort"
FunctionEnd
Section
SectionEnd
Первое сообщение есть, аборта нет, второго сообщения нет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC