Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Первое сообщение есть, аборта нет, второго сообщения нет. »
У меня такое впечатление, что вы ожидаете от команды Abort функционала, который ей не свойственен
У меня ваш скрипт отрабатывает корректно, т.е. Первое сообщение есть, второго сообщения нет, потому что срабатывает команда Abort
abort - прекращение выполнения команд ниже данной команды, а вы какой функционал от неё ожидаете?
Vincent7
27-01-2014, 00:20
Я жду закрытия программы. А на что еще нужен аборт?
Begin2Fly
27-01-2014, 00:22
Я жду закрытия программы. А на что еще нужен аборт? »
Много на что: http://nsis.sourceforge.net/Abort
Попробуйте "Quit".
Я жду закрытия программы. А на что еще нужен аборт? »
Где вы прочитали, что команда abort закрывает инсталлятор? :o
Команда для закрытия инсталлятора - quit
abort - прекращение выполнения команд ниже данной команды
Vincent7
27-01-2014, 00:37
Ясно, спасибо. Совсем забыл про quit
Vincent7
27-01-2014, 22:24
Как ни странно, но с Quit результат такой же как и с Abort.
Как ни странно, но с Quit результат такой же как и с Abort. »
А я всё вспомнить не мог, какой же был багу у nsDialogs :)
Не знаю, может как-то решается это дело в скрипте, кто пишет на nsDialogs может и подскажет вам, я пишу диалоги на IO
Для решения вашей проблемы могу посоветовать использовать не команду quit, а посыл сообщения Windows на закрытие окна инсталлера, вот пример кода:
!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"
SendMessage $HWNDPARENT ${WM_CLOSE} 0 0
FunctionEnd
Section
SectionEnd
Vincent7
28-01-2014, 17:48
Спасибо,работает. А как сделать вот такое- если в текст боксе вводят число меньшее, чем уже заданное там число, то выходе из текст бокса, это число автоматически менялось на заданое изначально число?
на заданое изначально число? »
Для начала создайте отдельную переменную, чтобы хранить предыдущее значение, с которым будете сравнивать, если значение будет корректным при вводе, в эту переменную кидаете значение, которое ввели
если в текст боксе вводят число меньшее, чем уже заданное там число »
Для такого сравнения вам в помощь либо if конструкция (в справочнике есть описание), либо команда IntCmp
IntCmp $0 5 ЕСЛИ_РАВНО ЕСЛИ_МЕНЬШЕ ЕСЛИ_БОЛЬШЕ
ЕСЛИ_РАВНО:
DetailPrint "$$0 == 5"
Goto done
ЕСЛИ_МЕНЬШЕ:
DetailPrint "$$0 < 5"
Goto done
ЕСЛИ_БОЛЬШЕ:
DetailPrint "$$0 > 5"
Goto done
done:
при переходе на любой другой контрол »
Смотря что вы подразумеваете под "переходом"
это число автоматически менялось на заданое изначально число? »
Опять же, в зависимости от способа реализации, если проверка будет проводиться только при нажатии на какой-либо контрол - один код, если как я предположил выше код будет отрабатывать при наведении мыши на любой элемент - код будет другим
Vincent7
28-01-2014, 18:28
K.A.V., при выходе из контрола, то есть при наведении курсора на любое другое место на странице
при наведении курсора на любое другое место на странице »
Средствами nsDialogs этого не сделать, насколько мне известно
Средствами nsDialogs этого не сделать »
Как я понял задачу, надо фиксировать "выход из текстбокса" указателя мыши - т..е. когда из области текстбокса будет убран курсор-указатель мыши.
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был...
AndreyGun
29-01-2014, 18:25
Здравствуйте форумчане!
Может ли кто то подсказать, я пытаюсь написать скрипт инсталлера,
вот что у меня получается
http://s020.radikal.ru/i705/1401/08/cc4ee5874547t.jpg (http://radikal.ru/fp/70125007c68d442bbc509a643373d733)
Если добавить в код команду: !define MUI_COMPONENTSPAGE_SMALLDESC
получается так
http://s020.radikal.ru/i719/1401/6e/d1dc909c4487t.jpg (http://radikal.ru/fp/e8014a0687704763b50d35b51fbd37b3)
А можно ли сделать что бы было так? (как выделено красным)
http://s001.radikal.ru/i194/1401/8f/d6c6f535344bt.jpg (http://radikal.ru/fp/b2d5b0bef2c14010904d8704f96e5660)
добрый вечер.. имеются 2 страницы созданные с помощью nsDialog.. нужно чтобы при активации CheckBoxa на 1ой странице пропускалась 2ая, ну и соответственно наоборот если CheckBox не отмечен, то отображается 2ая страница
Vincent7
29-01-2014, 20:16
function page 2
${NSD_GetState} $checkbox $R1
${If} $R1 == 1
goto end
${Else}
${EndIf}
nsDialogs::Create 1018
nsDialogs::Show
end:
functionend
как то так...
А можно ли сделать что бы было так? (как выделено красным) »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) > Описания плагинов > nsDialogs: Создаем собственные страницы инсталлятора
имеются 2 страницы созданные с помощью nsDialog.. нужно чтобы при активации CheckBoxa на 1ой странице пропускалась 2ая, ну и соответственно наоборот если CheckBox не отмечен, то отображается 2ая страница »
function page 2
${NSD_GetState} $checkbox $R1
${If} $R1 == 1
goto end
${Else}
${EndIf}
nsDialogs::Create 1018
nsDialogs::Show
end:
functionend »
Не учите плохому написанию кода, зачем использовать if конструкции вместе с goto? :o
Либо так:
Function func
${NSD_GetState} $checkbox $R1
${If} $R1 != 1
nsDialogs::Create 1018
nsDialogs::Show
${EndIf}
FunctionEnd
Либо через StrCmp
Function func
${NSD_GetState} $checkbox $R1
StrCmp $R1 "1" end 0
nsDialogs::Create 1018
nsDialogs::Show
end:
FunctionEnd
Vincent7
29-01-2014, 21:03
зачем использовать if конструкции вместе с goto?
А что в этом плохого?
А что в этом плохого? »
1. Не красиво
2. Запутанно
3. Увеличение числа команд, которые мало того, что создают некрасивую, запутанную конструкцию, да ещё и используются все возможные команды, без которых нужно было обойтись, если вы предлагаете if конструкцию
---
Как я понял задачу, надо фиксировать "выход из текстбокса" указателя мыши - т..е. когда из области текстбокса будет убран курсор-указатель мыши.
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был... »
У меня получилось определить, что положение курсора нахоходится над элементом text, только функциями из Gdi32, могу позже выложить пример кода
Правда в такой ситуации, что, создавать только таймер и по нему определять, внесено ли в поле изменение? Или как? Я, к примеру, никогда не печатаю держа курсор на элементе - он меня смущает :biggrin: Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? Как-то не очень стабильно мне кажется...
Vincent7, K.A.V., блогодарю сделал по аналогии
Function page1Destroy
${NSD_GetState} $CheckBoxAct2 $CheckAct2
FunctionEnd
Function Page2Init
${If} $CheckAct2 == 1
Abort
${EndIf}
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd
Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? »
Не над, а внутри границ текстбокса (или наоборот, вне границ - это может быть любое место окна страницы или наведение указателя на любой другой выбранный конкретный элемент на странице)
Но для начала на запрос :
если в текст боксе вводят число меньшее, чем уже заданное там число, то выходе из текст бокса,
это число автоматически менялось на заданое изначально число? »
задать бы вопрос - а на хрена это надо ? Какой практический смысл в таком извращении ?
Мне вот стало интересно решение этой задачи в совсем другом ракурсе практики... Ну да ладно.
Если взять ранее предлагаемый пример с вводом пароля, то отследить нахождение указателя можно, добавив в Function EditNotify такой код :
System::Alloc 8
Pop $0
System::Call 'USER32::GetCursorPos(ir0)'
System::Call '*$0(i.r8,i.r9)'
System::Free $0
StrCpy $1 $Password_Text
System::Call 'USER32::WindowFromPoint(ir8,ir9)i.r1'
System::Call 'USER32::GetClassName(ir1,t.r2,i ${NSIS_MAX_STRLEN})'
MessageBox mb_ok "$1=$2" ; если $1=Edit, тогда бла-бла-бла
Это работает. Наверняка можно сделать изящнее и продвинутее, но возиться не понятно ради чего, лень, да и знаний не хватает...
PS Также меня интересует, каким образом отслеживать клики нужных кнопок мыши и как организовать комбинированные нажатия на кнопки, совместно с выбранным символом клавиш. ( Например, на странице есть кнопка, нажав которую совместно с цифрой 1 - запустится или получится одно действие, а нажатие той же кнопки, совместно с цифрой 2 - другое. И т.д. для любых сочетаний символов, в том числе и без нажатия кнопок - только с клавиатуры...
Вроде как для этого можно использовать GetAsyncKeyState... Только не получается...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC