PDA

Показать полную графическую версию : .: 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.
27-01-2014, 00:18
Первое сообщение есть, аборта нет, второго сообщения нет. »
У меня такое впечатление, что вы ожидаете от команды Abort функционала, который ей не свойственен

У меня ваш скрипт отрабатывает корректно, т.е. Первое сообщение есть, второго сообщения нет, потому что срабатывает команда Abort

abort - прекращение выполнения команд ниже данной команды, а вы какой функционал от неё ожидаете?

Vincent7
27-01-2014, 00:20
Я жду закрытия программы. А на что еще нужен аборт?

Begin2Fly
27-01-2014, 00:22
Я жду закрытия программы. А на что еще нужен аборт? »
Много на что: http://nsis.sourceforge.net/Abort
Попробуйте "Quit".

K.A.V.
27-01-2014, 00:22
Я жду закрытия программы. А на что еще нужен аборт? »
Где вы прочитали, что команда abort закрывает инсталлятор? :o

Команда для закрытия инсталлятора - quit
abort - прекращение выполнения команд ниже данной команды

Vincent7
27-01-2014, 00:37
Ясно, спасибо. Совсем забыл про quit

Vincent7
27-01-2014, 22:24
Как ни странно, но с Quit результат такой же как и с Abort.

K.A.V.
27-01-2014, 23:05
Как ни странно, но с 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
Спасибо,работает. А как сделать вот такое- если в текст боксе вводят число меньшее, чем уже заданное там число, то выходе из текст бокса, это число автоматически менялось на заданое изначально число?

K.A.V.
28-01-2014, 18:11
на заданое изначально число? »
Для начала создайте отдельную переменную, чтобы хранить предыдущее значение, с которым будете сравнивать, если значение будет корректным при вводе, в эту переменную кидаете значение, которое ввели

если в текст боксе вводят число меньшее, чем уже заданное там число »
Для такого сравнения вам в помощь либо 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., при выходе из контрола, то есть при наведении курсора на любое другое место на странице

K.A.V.
28-01-2014, 20:28
при наведении курсора на любое другое место на странице »
Средствами nsDialogs этого не сделать, насколько мне известно

MKN
29-01-2014, 09:25
Средствами 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)

Saten
29-01-2014, 19:11
добрый вечер.. имеются 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
как то так...

K.A.V.
29-01-2014, 20:52
А можно ли сделать что бы было так? (как выделено красным) »
Справочник по 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?
А что в этом плохого?

K.A.V.
29-01-2014, 21:15
А что в этом плохого? »
1. Не красиво
2. Запутанно
3. Увеличение числа команд, которые мало того, что создают некрасивую, запутанную конструкцию, да ещё и используются все возможные команды, без которых нужно было обойтись, если вы предлагаете if конструкцию


---
Как я понял задачу, надо фиксировать "выход из текстбокса" указателя мыши - т..е. когда из области текстбокса будет убран курсор-указатель мыши.
Если так, то это можно организовать с помощью GetCursorPos с последующим определением GetClassName для места нахождения указателя и дальнейшей логикой сравнения - если GetClassName=Edit, то курсор мыши находится в области текстбокса, если нет, то посылаем в текстбокс нужные циферки. Где то такой код уже был... »
У меня получилось определить, что положение курсора нахоходится над элементом text, только функциями из Gdi32, могу позже выложить пример кода
Правда в такой ситуации, что, создавать только таймер и по нему определять, внесено ли в поле изменение? Или как? Я, к примеру, никогда не печатаю держа курсор на элементе - он меня смущает :biggrin: Какую тогда логику в коде строить? Проверка через X-секунд, вводилось ли значение в поле и потом определять, находится ли курсор над тексбоксом? Как-то не очень стабильно мне кажется...

Saten
30-01-2014, 00:01
Vincent7, K.A.V., блогодарю сделал по аналогии
Function page1Destroy
${NSD_GetState} $CheckBoxAct2 $CheckAct2
FunctionEnd

Function Page2Init
${If} $CheckAct2 == 1
Abort
${EndIf}
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd

MKN
30-01-2014, 10:29
Какую тогда логику в коде строить? Проверка через 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