Имя: Пароль:
1C
1C 7.7
v7: FormEx: ПриНажатииКнопкиКлавиатуры
0 AL CAPONE
 
21.11.11
15:17
Имеется код

Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Сумма" Тогда
       Если Код = 77 Тогда
           Сообщить("Нажали ""m"" ");
           Сумма = Сумма * 1000;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Принажатии на клаве "m" месага выскакивает, но сумма не изменяется.
Если же к примеру повесить на кнопку
Сумма = Сумма * 1000;
всё отрабатывает безупречно.

В чём всё таки загвоздка ?
1 AL CAPONE
 
21.11.11
15:18
Сумма - реквизит табличной части типа "Число.15.0"
2 Ткачев
 
21.11.11
15:20
Что то мне кажется что Функцию надо и Возврат (Сумма * 1000);
3 AL CAPONE
 
21.11.11
15:23
(2)
не, в FormEx это предопределённая процедура

Процедура ПриНажатииКнопкиКлавиатуры(<?>,,,,,)
КонецПроцедуры
Синтаксис:
Процедура ПриНажатииКнопкиКлавиатуры(<КодКлавиши>,<Alt>,<Shift>,<Ctrl>,<Символ>,<ФСО>)
КонецПроцедуры
Назначение:
Предопределенная процедура при нажатии кнопки клавиатуры.
Параметры:
<КодКлавиши> - код нажатой кнопки клавиатуры.
<Alt> - флаг нажатия кнопки
<Shift> - флаг нажатия кнопки
<Ctrl> - флаг нажатия кнопки
<Символ> - символ нажатой кнопки в формате ASCII.
<ФСО> - флаг стандартной обработки. Изначально равен 1. Если в теле процедуры сбросить
значение в 0, то стандартная обработка события не вызывается.
4 Tatitutu
 
21.11.11
15:25
в том что это реквизит табличной части
5 akaBrr
 
21.11.11
15:25
(0) Как отображается сумма?
6 Tatitutu
 
21.11.11
15:27
Попробуй так:
НовоеЗначение = Сумма * 1000;
УстановитьАтрибут("Сумма",НовоеЗначение)
7 antoneus
 
21.11.11
15:27
умврчяднт?
8 AL CAPONE
 
21.11.11
15:31
(4)
но по кнопке то отрабатывает

(5)
т.е. ?

(6)
Процедура не обнаружена (УстановитьАтрибут)
9 FN
 
21.11.11
15:36
Форма.Обновить() - ?
10 Ёпрст
 
21.11.11
15:38
В ПриОтжатииКнопкиКлавы делай.
11 AL CAPONE
 
21.11.11
15:41
(9,10)
не помогает :(
12 AL CAPONE
 
21.11.11
15:43
Отладчик показывает, что значение Сумма увеличилось на 3 нуля, но на форме сумма не изменяется.
13 FN
 
21.11.11
15:57
(12) ну тогда точно Форма.Обновить()

Для проверки - нажми в документ "м", сохрани/закрой док и открой заново
14 Ёпрст
 
21.11.11
16:02
Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Сумма" Тогда
   
       Если Код = 77 Тогда
           Флаг=0;
           Сообщить("Нажали ""m"" ");
           Сумма = Сумма * 1000;
           Форма.Обновить(0);
       КонецЕсли;
       
   КонецЕсли;
КонецПроцедуры
15 Ёпрст
 
21.11.11
16:02
(13) Достаточно по строкам "побегать"
16 AL CAPONE
 
21.11.11
16:05
Добавил Форма.Обновить(), но это ПЗДЦ

Захожу в сумму, набираю "1", жму "m", нихера, в процедуру заходит, значение Суммы увеличивает на 3 нуля, на форме "1".

Если перед этим тискануть на кнопку с формулой Сумма = Сумма * 1000;, на форме становится "1.000.000", потом стать в поле суммы и нажать "m", начинает отрабатывать и на форме нормально, становится "1.000.000" и т.д.
17 FN
 
21.11.11
16:10
>Захожу в сумму, набираю "1", <ЖМУ ЭНТЕР> жму "m"...

Иначе переписывай через сендкей "0","0","0"
18 FN
 
21.11.11
16:11
(17)+ Либо делай ложное закрытие формы (тогда "1" запишется в значение реквизита), а потом *1000
19 AL CAPONE
 
21.11.11
16:13
(17)
нет, Enter-а там нету, сразу после цифры жму забитую в проге кнопку "m", процедура отрабатывает, но форма не обновляется; если же перед этим тискануть на кнопку с формулой Сумма = Сумма * 1000, на форме 1.000, и далее уже после "m" 1.000.000 1.000.000.000 и т.д.
20 Ёпрст
 
21.11.11
16:15
(16) дословно скопируй код из (14) и проверь
21 AL CAPONE
 
21.11.11
16:22
(20)
Хз почему, но не работает :(

Попробовал так

Перем ЗапретЗакрытияФормы;

Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Сумма" Тогда
       Если Код = 77 Тогда
           Сообщить("m");
           Сумма = Сумма * 1000;
           ЗапретЗакрытияФормы = 1;
           Форма.Закрыть(0);
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
   Если ЗапретЗакрытияФормы = 1 Тогда
       Активизировать("Сумма",1);
       ЗапретЗакрытияФормы = 0;
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
КонецПроцедуры

ЗапретЗакрытияФормы = 0;

При входе в сумму жму "1", далее "m", ничего не происходит, но курсор становится перед цифрой 1, после второго и последующих нажатий "m" наконец-то получается 1.000 , 1.000.000 и т.д.
22 Ёпрст
 
21.11.11
16:24
(21) ты читать то умеешь ? Скопируй дословно код из (14).
23 AL CAPONE
 
21.11.11
16:30
(22)
НЕ РАБОТАЕТ ЭТОТ КОД, ну не обновляет форму и всё тут
24 Ёпрст
 
21.11.11
16:30
(23) врешь. я проверил - всё работает
25 AL CAPONE
 
21.11.11
16:31
(24)
ну значит форма какая-то заколдованная
26 zuza
 
21.11.11
16:31
(23) флаг в ноль поставь
Флаг = 0;
27 AL CAPONE
 
21.11.11
16:33
(26)
да пробовал дословно, ну не отрабатывает как надо :(((
28 FN
 
21.11.11
16:39
Перем ЗапретЗакрытияФормы;

Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Сумма" Тогда
       Если Код = 77 Тогда
           Флаг=0;ЗапретЗакрытияФормы = 1;
           Форма.Закрыть(0);
           Сумма = Сумма * 1000;Форма.Обновить(0);
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
   Если ЗапретЗакрытияФормы = 1 Тогда
       Активизировать("Сумма",1);
       ЗапретЗакрытияФормы = 0;
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
КонецПроцедуры

ЗапретЗакрытияФормы = 0;

Должно работать и в процессе редактирования реквизита и просто при активном элементе.
29 AL CAPONE
 
21.11.11
16:42
(24)
Отрабатывает твоя процедура, но уже на сохранённом значении Суммы. Если же вводится в сумму новое значение "1", то после нажатия "m" процедура отрабатывает, но на форме в сумме становится "0" о_О
Если же в ячёйке Суммы уже 1 и ячейка сохранена, то при нажатии "m" на ней становится 1.000 и т.д.
30 AL CAPONE
 
21.11.11
16:50
(28)
это то же самое, что у меня в (21), работает но только после второго нажатия "m", после первого только и всего, что курсор становится перед числом.
31 FN
 
21.11.11
17:17
вот так будет работать, но это не надежно - есть вариант, что за эту секунду изменится текущая строка.

Процедура Добавить1000()
   Форма.обработкаОжидания("Добавить1000",0);
   Кво=Кво*1000;
   Форма.Обновить(0);
КонецПроцедуры // Добавить1000

Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Кво" Тогда
       Если Код = 77 Тогда
           Флаг=0;ЗапретЗакрытияФормы = 1;
           Форма.Закрыть(0);
           Форма.обработкаОжидания("Добавить1000",1);
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
   Если ЗапретЗакрытияФормы = 1 Тогда
       Активизировать("Кво",0);
       ЗапретЗакрытияФормы = 0;
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
КонецПроцедуры
32 AL CAPONE
 
21.11.11
17:57
(31)
мудрёно, попробую, спасибо за помощь !
33 Ёпрст
 
21.11.11
17:59
(29) ясен пень, а ты как хотел ? Ввод еще не окончен, в реквизите Сумма =0 еще при этом.
34 AL CAPONE
 
22.11.11
09:15
(33)
ну вот, а юзверь хочет как раз на лету эти цифры добавлять, когда в ячейке ещё числа и не было сохранено
35 Ёпрст
 
22.11.11
09:17
(34) тогда придЁтся отлавливать каждое нажатие, и запоминать полученное значение в своей переменной. Потом уже умножать на значение этой переменной.
36 Ёпрст
 
22.11.11
09:19
+35 либо по нажатию на "m" посылать ентер в начале (рули флагом фсо отмены в предопределенной проце), чтоб ввод был зафиксирован и потом уже помножать.
37 AL CAPONE
 
22.11.11
09:19
(35)
что-то типа проверять каждое значение в поле в диапазоне {0..9} и сразу копировать его в переменную ?
38 AL CAPONE
 
22.11.11
09:21
(36)
посылать Энтер - это чем же ?
39 Ёпрст
 
22.11.11
09:24
(38) тем же формексом
40 Ёпрст
 
22.11.11
09:25
(37) да.

ЗЫ: если будешь эммулировать клавиатуру и посылать ентер, нужно будет втыкать еще "защиту от АЛьФа" - чтоб бесконечного цикла не получилось : нажимаешь-ловишь-нажимаешь-ловишь..
41 AL CAPONE
 
22.11.11
09:29
(39)
попробовал так

Попытка
WSHShell = СоздатьОбъект("WScript.Shell");
WSHShell.SendKeys("{ENTER}");
Исключение
КонецПопытки;
Сумма = Сумма * 100;
Форма.Обновить(0);

после ввода 1 ячейка суммы Enter-ится, но значение в ней 0
42 AL CAPONE
 
22.11.11
09:55
Возможно всё не очень красиво, но вообщем работает так: объявил "Сум" глобальной переменной

Если Код = 96 Тогда //НАКАПЛИВАЕМ ЦИФИРИ
   Сум = Число(Строка(Сум) + Строка("0"));
КонецЕсли;
Если Код = 97 Тогда
   Сум = Число(Строка(Сум) + Строка("1"));
КонецЕсли;
Если Код = 98 Тогда
   Сум = Число(Строка(Сум) + Строка("2"));
КонецЕсли;
Если Код = 99 Тогда
   Сум = Число(Строка(Сум) + Строка("3"));
КонецЕсли;
Если Код = 100 Тогда
   Сум = Число(Строка(Сум) + Строка("4"));
КонецЕсли;
Если Код = 101 Тогда
   Сум = Число(Строка(Сум) + Строка("5"));
КонецЕсли;
Если Код = 102 Тогда
   Сум = Число(Строка(Сум) + Строка("6"));
КонецЕсли;
Если Код = 103 Тогда
   Сум = Число(Строка(Сум) + Строка("7"));
КонецЕсли;
Если Код = 104 Тогда
   Сум = Число(Строка(Сум) + Строка("8"));
КонецЕсли;
Если Код = 105 Тогда
   Сум = Число(Строка(Сум) + Строка("9"));
КонецЕсли;
Если Код = 13 Тогда //СУММА ПОДТВЕРЖДЕНА
   Сум = 0;
КонецЕсли;
Если Код = 111 Тогда // ПО НАЖАТИИ "/" СУММА УМНОЖАЕТСЯ НА 100
   Флаг = 0;
   Сум = Сум * 100;
   Сумма = Сум;
   Форма.Обновить(0);
ИначеЕсли Код = 106 Тогда // ПО НАЖАТИИ "*" СУММА УМНОЖАЕТСЯ НА 1000
   Флаг = 0;
   Сум = Сум * 1000;
   Сумма = Сум;
   Форма.Обновить(0);
КонецЕсли;

Всё как просил юзверь =)
43 Ёпрст
 
22.11.11
09:56
Можно так:
Перем РасшФ;
Процедура УвеличитьСумму()
   Расшф.ОбработкаОжидания("УвеличитьСумму",0);
   Сумма = Сумма * 1000;
   Форма.Обновить(0);
КонецПроцедуры
Процедура ПриНажатииКнопкиКлавиатуры(Код,Альт,Шифт,Контрл,Символ,Флаг)
   Если Форма.АктивныйЭлемент() = "Сумма" Тогда
       
       Если Код = 77 Тогда
           Если Сумма = 0 Тогда
               Сервис = СоздатьОбъект("Сервис");
               Сервис.ЭмулироватьКлавиатуру("{ENTER}");
               Расшф = СоздатьОбъект("РасширениеФормы");
               Расшф.УстановитьФорму(Форма);
               Расшф.ОбработкаОжидания("УвеличитьСумму",10);
               Возврат;
           КонецЕсли;
           
           
           Флаг=0;
           
           Сумма = Сумма * 1000;
           Форма.Обновить(0);
       КонецЕсли;
       
   КонецЕсли;
КонецПроцедуры
44 Ёпрст
 
22.11.11
09:58
(42) ты не учитываешь выделение мышой + кнопки del и BackSpace + возможность вставки цифры в середине числа.
45 Ткачев
 
22.11.11
10:05
Сумма = Форма.Сумма;
Сумма = Сумма * 1000;
Форма.Сумма = Сумма;
не пробовали ?
46 Ёпрст
 
22.11.11
10:08
(45) Сумма - не реквизит формы, это раз,Форма.Сумма = Сумма; - это никогда не будет работать, даже если Сумма была бы реквизитом формы, а не документа, это два.
47 Ткачев
 
22.11.11
10:15
(46)>Сумма - не реквизит формы
А где тогда он сумму набирает ?
...
Если Форма.АктивныйЭлемент() = "Сумма" Тогда
48 AL CAPONE
 
22.11.11
10:18
(43)
отрабатывает нормуль только 1 раз. Если нужно 6 нулей, уже не хочет.

(44)
хм, даже не подумал ...
49 AL CAPONE
 
22.11.11
10:26
(44)
а вот и лекарство для BackSpace

Если Код = 8 Тогда
   Сум = Число(Лев(Строка(Сум),СтрДлина(Строка(Сум)) - 1));
КонецЕсли;
50 Ёпрст
 
22.11.11
10:26
(47) сумма  - это реквизит табличной части документа.
Не путай теплое с мягким

(48) в смысле ? У меня работает.. проверено.
Сколько раз m нажал, столько и помножит, не зависимо от того, когда вводить начали
51 AL CAPONE
 
22.11.11
10:37
(50)
по первому нажатию "m" поле теряет фокус почему-то, и второе соотв. не срабатывает.

Юзверя всё устроило, уря, оставлю пожалуй свой вариант проги, как-то он понятнее, без обид Ёпрст3.
Всем спасибо за помощь !
52 Ёпрст
 
22.11.11
11:32
(51) ну дык, сделай тогда
Сервис.ЭмулироватьКлавиатуру("{ENTER 2}"); + еще нажатие end или home чтоб курсор был там где надо

Будет тебе реквизит в режиме редактирования всегда
53 ChMikle
 
22.11.11
12:48
(15) ЗА оффтопик извините , но читал вчера ваш пример на инфостате об изменении шрифтов на форме посредством вышеуказанной компоненты ,  набил все это у себя , ругается на неизвестный объект "Зум" , не вразумите , может еще какие библиотеки надо подключать ....
54 FN
 
22.11.11
12:55
(53) Может это про какой-то мой пример? а то у меня есть класс Зум и он как раз на инфостарте лежит...
55 ChMikle
 
22.11.11
13:33
был вроде Епрст , ну подскажите вы буду благодарен
56 ChMikle
 
22.11.11
13:43
http://infostart.ru/public/60448/ вобщем хелп (тихо так, глядя в моник) :)
57 Ёпрст
 
22.11.11
13:54
(56) для работы этого класса нужно загрузить 1cpp.dll и formex.dll
58 ChMikle
 
22.11.11
14:29
(57)Загрузил , на закладке параметры появились обе библиотЭки,и пример вбил в исходник формы , но ругается .... хотя другой пример с бибилиотекой Formex работал
59 Ёпрст
 
22.11.11
14:30
(58) это ты автора класса спрашивай, мне лень глядеть что там.
60 antoneus
 
22.11.11
14:31
ругается на неизвестный объект "Зум"? класс-то зарегистрировал?
61 ChMikle
 
22.11.11
15:22
да вроде да , буду в районе 19 часов за базой подробно напишу , вы на связи не будете , а то идея классная и как раз мне нужна , там форму подбора для сенсерного экрана одного размер шрифта табличной части , а для операторского другого , вот хочется этой библиотекой воспользоваться
62 FN
 
22.11.11
15:32
(61) Это я автор. Если будут вопросы - пиши на fn()inbox.ru
63 ChMikle
 
22.11.11
15:33
а вы в 19 на форуме будуте или в аське ....
64 ChMikle
 
22.11.11
15:41
19 часов :)
65 FN
 
22.11.11
15:41
в 19 по Москве я наверное смогу быть только в гугл-толке
66 ChMikle
 
22.11.11
15:44
а после 19 часов по мск , я с 19 до 21 буду около базы , отписался бы ... :) по почте долго , а ссылок нет на описание функционала