![]() |
![]() |
![]() |
|
Перехват команд "Копировать" и "Вставить" в формах 1С 8.1 | ☑ | ||
---|---|---|---|---|
0
TormozIT
гуру
23.04.10
✎
12:01
|
Пока я придумал только сделать невидимую динамическую командную панель с двумя кнопками и сочетаниями клавиш CTRL+C и CTRL+V.
Но уже имею массу проблем. В некоторых случаях мне нужно продолжить обработку события с передачей стандартным обработчикам платформы. Для этого я временно отключаю сочетание вызванной кнопки и посылаю его через SendKeys, подключая одноразовый обработчик ожидания на обратное переключение. SendKeys - штука стремная. Как еще можно извратиться? |
|||
1
vde69
23.04.10
✎
12:05
|
я вот так извращался
Функция СформироватьСтрокуПоляВвода (Имя, Заголовок, Значение, Длина, Маска="") // маска допустима в формате где // # - это обязательная цифра Контроль = ""; Если Маска <> "" Тогда Контроль = "onkeypress=""check("+Имя+" "+Маска+")"""; КонецЕсли; Результат = " | <TR><TD>"+СокрЛП(Заголовок) + ":</TD><TD> <INPUT size=50 value="""+СокрЛП(Значение)+""" name="""+Имя+""" ID="""+Имя+""" maxlength="+Длина+" onCopy=""return false"" onDrag=""return false"" onDrop=""return false"" onPaste=""return false"" "+Контроль+" autocomplete=off></TD></TR>"; Возврат Результат; КонецФункции Процедура ПриОткрытии() Если ТЗ.Колонки.Количество() < 5 Тогда Предупреждение("Ошибка в параметрах процедуры"); ЭтаФорма.Закрыть(Ложь); Возврат; КонецЕсли; // функция check преднозначена для обработки реакции на ввод символа в соотвествие с маской // реализация ввода даты и числа ТекстМодуля = " |<script type=""text/javascript""> |function check(name, mask){ | |} |</script> | | <TABLE width=""100%""> | <TBODY> "; Для Каждого СтрокаПараметров из ТЗ Цикл Имя = СтрокаПараметров[0]; Заголовок = СтрокаПараметров[1]; Значение = СтрокаПараметров[2]; Длина = СтрокаПараметров[3]; Маска = СтрокаПараметров[4]; ТекстМодуля = ТекстМодуля + СформироватьСтрокуПоляВвода (Имя, Заголовок, Значение, Длина, Маска); КонецЦикла; ТекстМодуля = ТекстМодуля + " | </TBODY></TABLE>"; ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ТекстМодуля); КонецПроцедуры |
|||
2
vde69
23.04.10
✎
12:08
|
(1) это не доделано, но смысл, что перехват буфера только в ХТМЛ поле (возможно скрытом)
сейчас сделал вот так, хотя там то-же есть косячек Процедура ТЗЗначениеПриИзменении(Элемент) // нужно проверить а не из буфера обмена данные? Окно=ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow; ЗначениеБуфера=Окно.clipboardData.getData("Text"); // теперь привести вид Попытка Если ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда ЗначениеБуфера = Дата(ЗначениеБуфера); ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда ЗначениеБуфера = Число(ЗначениеБуфера); Иначе ЗначениеБуфера = СокрЛП(ЗначениеБуфера); КонецЕсли; Исключение ЗначениеБуфера = СокрЛП(ЗначениеБуфера); КонецПопытки; Если ЗначениеЗаполнено(ЗначениеБуфера) и (СокрЛП(Элемент.Значение) = СокрЛП(ЗначениеБуфера)) тогда Предупреждение("Поле требует ручного ввода значения"); Элемент.Значение = ОбщегоНазначения.ПустоеЗначениеТипа(ТипЗнч(Элемент.Значение)); КонецЕсли; КонецПроцедуры |
|||
3
TormozIT
гуру
23.04.10
✎
12:21
|
А с SetData("URL", <Внутреннее представление значения>) никто не экспериментировал?
Я вчера часа 2 убил на это и результата нет. Записывается вроде успешно, а считывается Null всегда почему то. |
|||
4
TormozIT
гуру
23.04.10
✎
12:24
|
Да. Забыл отметить, что у меня задача стоит по глобальному перехвату.
(1) И что, такой способ позволяет перехватить все команды Copy во всех элементах формы или хотя бы всех элементах документа HTML? |
|||
5
vde69
23.04.10
✎
12:29
|
(4) этот метод я делал для имитации всех реквизитов в поле хтмл, а у каждого поля ввода "INPUT" есть возможность прикрутить свой обработчик вставки/копирования.
на всю форму не действует |
|||
6
Один С
23.04.10
✎
12:31
|
все не читал, ибо ничо не понятно, но по (0) хотелось бы сказать
CTRL+C и CTRL+V - это не единственный способ скопировать/вставить... |
|||
7
TormozIT
гуру
23.04.10
✎
12:33
|
(6) Естественно. Но это максимум, до чего я додумался. И надо заметить, польза от такого решению уже есть ощутимая.
|
|||
8
vde69
23.04.10
✎
12:37
|
(7) я всегда пользуюсь комбинацией CTRL+Delete и SHIFT+Insert
способ (1) отлавливает любые способы вставки и копирования |
|||
9
TormozIT
гуру
23.04.10
✎
12:49
|
По проблеме (3) http://www.sitepoint.com/forums/showthread.php?p=3129291
Есть куча подобных тем в инете. Нигде нет объяснения, баг это или какая то особенность. Но победить никто не смог) |
|||
10
Stepa86
23.04.10
✎
12:58
|
(0) и (1): а можно не скромный вопрос? а зачем перехват буфера в 1Ске?
|
|||
11
Один С
23.04.10
✎
13:01
|
(10) это очень нескромный и пошлый вопрос..
|
|||
12
TormozIT
гуру
23.04.10
✎
13:16
|
(10)
Я сделал копирование и вставку значений. Т.е. там где можно копируется и вставляется именно значение, а не его представление. |
|||
13
vde69
23.04.10
✎
13:18
|
(10) у нас стоит задача запретить копирование из буфера для форм верификации (двойного ввода)
то есть - оператор вводит 2 раза одно и то-же поле на разных формах, оба ввода должны совпасть, если не совпало - значит оператор ошибся. Соответсвено нужно запретить оператору вбивать данные простым переносом (при копировании - он просто перенесет ошибку и все). А зачем это автору - я не знаю |
|||
14
Stepa86
23.04.10
✎
13:21
|
(13) а с активИксом не прокатило?
|
|||
15
Stepa86
23.04.10
✎
13:23
|
(12) я вот так делаю: http://screencast.com/t/MmUzNjAzMGMt
а вставку ловлю вот так: Процедура ОбязательствоОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка) Значение = СУПС_ОбщегоНазначения.ПолучитьСсылкуНаОбъектПоНавигационнойСсылке( Текст , Новый ОписаниеТипов("СправочникСсылка.СУПС_Обязательства") ); Если ЗначениеЗаполнено( Значение ) Тогда СтандартнаяОбработка = Ложь; Текст = ""; Обязательство = Значение; ОбязательствоПриИзменении(Элемент); КонецЕсли; КонецПроцедуры |
|||
16
TormozIT
гуру
24.04.10
✎
01:53
|
Обсуждение продолжено здесь v8: Аналог WSH.SendKeys через WinAPI (DynamicWrapper)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |