|
v7: Потеря фокуса окна из ОбработкиОжидания | ☑ | ||
---|---|---|---|---|
0
MWWRuza
гуру
03.04.18
✎
11:13
|
Добрый день!
Задача: ПрайсЧекер(информационный киоск). Все работает красиво, но, есть косяк под RDP Server 2003 R2 - не умеет он заставку по RDP транслировать. Поэтому, скринсейвер решил прямо в нем самом, на 1С организовать. Заставка - бегущая строка "Отсканируйте ШтрихКод проверяемого товара!". С этим, проблем тоже нет. Но, после срабатывания заставки по ОбработкеОжидания Formex(штатной не получится - окно модальное), фокус с него убегает, как я понимаю на основное окно программы. Перестает отрабатывать "ОбработкаВнешнего События()" со сканера. Точнее, оно отрабатывает, но не в форме обработки, а в глобальном модуле. Как сделать, что-бы фокус, после запуска заставки по ОбработкеОжидания, оставался на окне обработки? Сейчас, процедура "Заставка()", вызываемая из обработки ожидания, такая: Процедура Заставка() Расш.ОбработкаОжидания("Заставка",0); // Останавливаю ожидание,нечего ждать, когда заставка уже крутится... Форма.ИспользоватьСлой("Заставка",2); Побежали3 = 1; Расш.ЦветФона = 0; Форма.Обновить(); Окно.НаПереднийПлан(Форма); // Не помогает Активизировать(); // Тоже не помогает КонецПроцедуры Естественно, после того, как фокус потерян, сработка "ОбработкаВнешнегоСобытия()" в глобальнике, не "пробуждает" киоск... Кроме сканера по Com порту, на этой рабочей станции(тонкий клиент) нет других устройств ввода. |
|||
1
MWWRuza
гуру
03.04.18
✎
11:17
|
Картинки, что-бы было понятно, о чем речь идет:
Основной экран ПрайсЧекера: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/i-229.jpg Заставка, плавающая бегущая строка: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-228.jpg |
|||
2
nicesc
03.04.18
✎
11:38
|
Попробуй вместо Окно.НаПереднийПлан(Форма); повторно открыть форму ПрайсЧекер?
Ну или в глобальном модуле в ОбработкеВнешнего проверь наличие открытой формы ПрайсЧекер, активизируй её и через FormEx вызови внешнеесобытие. |
|||
3
MWWRuza
гуру
03.04.18
✎
11:55
|
Попробовал. Он их "наслаивает" одну на одну, столько, сколько скринсейвер срабатывает. Если сначала делать Форма.Закрыть(), то тоже ничего хорошего не получается - открывается новая форма, и уже не в фокусе...
А вот второй вариант, несколько "через одно место", но, надо попробовать... |
|||
4
nicesc
03.04.18
✎
12:03
|
странно почему он их наслаивает, окно же модальное?
второй вариант через одно место, согласен, но должен работать |
|||
5
ADirks
03.04.18
✎
12:13
|
а что, заставка и осн.окно - это разные формы что-ли?
может, всё в одном флаконе сделать? |
|||
6
MWWRuza
гуру
03.04.18
✎
12:42
|
(5)Форма одна, слои разные.
|
|||
7
Сияющий в темноте
03.04.18
✎
13:06
|
Нарисуйте уже ваб страницу в браузере в режиме киоска и делайте все,что хочется,зачем 1с насиловать?
|
|||
8
VoditelKobyly
03.04.18
✎
13:16
|
Не понял как каа заставка реализована?
Через ЗапуститьПриложение или просто переключением слоев и выводом текста? |
|||
9
VoditelKobyly
03.04.18
✎
13:18
|
Если с формы не уходить, то и фокус не потеряется.
Заставку нужно делать в этой же форме. |
|||
10
MWWRuza
гуру
03.04.18
✎
13:32
|
(7)Я не знаю, как такое можно реализовать на семерке.
(8)Переключением слоев и выводом текста. |
|||
11
MWWRuza
гуру
03.04.18
✎
14:23
|
ОбработкаОжидания тут, похоже ни при чем...
Где-то я в другом месте запутался. Сделал для теста кнопки принудительного переключения с заставки на обычный режим, все обработки ожидания закоментировал. Все равно не работает, такое чувство, что при переключении слоев теряется фокус... Вот процедура через кнопку "Заставка": Процедура Заставка() // Расш.ОбработкаОжидания("Заставка",0); // Форма.ИспользоватьСлой("Общий",1); Форма.ИспользоватьСлой("Заставка",2); Побежали3 = 1; // Форма.Обновить(); Расш.ЦветФона = 0; // Окно.НаПереднийПлан(Форма); // Форма.Обновить(); // Активизировать(); КонецПроцедуры А вот по кнопке "Разбудить": Процедура Разбудить() // Расш.ОбработкаОжидания("Заставка",1000 * Константа.ВремяЗастКиоска); // Форма.ИспользоватьСлой("Общий",1); Форма.ИспользоватьСлой("Товар",2); Расш.ЦветФона = -1; Побежали3 = 0; // Форма.Обновить(); // Окно.НаПереднийПлан(Форма); // Форма.Обновить(); КонецПроцедуры Кнопки "Разбудить" две, одна в слое "Заставка", вторая в слое "Товар". Кнопка "Заставка" в слое "Товар". После запуска программы, ВнешнееСобытие отрабатывает, товар сканируется. Жмешь "Заставка" - все, все побежало, но и фокус убежал, ВнешнееСобытие в глобальнике работает... Нажимаешь кнопку "Разбудить" в слое "Заставка", заставка останавливается, появляется слой товар, но, ВнешнееСобытие по прежнему в глобальнике отрабатывает, соответственно товар не ищется... Жмешь кнопку "Разбудить" в слое "Товар", и все, после этого начинает работать ВнешнееСобытие в форме! Чета я совсем заработался, надо отвлечься... Не понимаю я как так может быть... Форма одна, ну и что, что слои разные... ВнешнееСобытие же не в слое работает, а в модуле формы... Фигня какая-то... |
|||
12
MWWRuza
гуру
03.04.18
✎
15:08
|
Хм... Штатный метод Активизировать(<ИмяРеквизита>,<Режим>)
<ИмяРеквизита> - необязательный параметр. Строка с именем поля диалога, которое нужно активизировать. Пустое имя элемента диалога используется для активизации всей формы. Делаю на форме, в слое "Заставка", текстовый реквизит "Хрень". В процедуре "Заставка()" пишу "Активизировать("Хрень")". Запускаюсь, включаю кнопкой "Заставку", сканирую товар - просыпается! Но, не сканируется товар... Добавляю в слой "Товар" реквизит "Хрень2", в процедуре "Разбудить()" пишу "Активизировать("Хрень2")". Проверяю, Работает! Бред какой-то... А как-же описание в синтакс-помошнике - "Пустое имя элемента диалога используется для активизации всей формы." - ??? |
|||
13
MWWRuza
гуру
03.04.18
✎
15:38
|
Вернул ОбработкиОжидания, поубирал лишние тестовые кнопки, вывел "Хрени" за пределы формы, причесал код... Все работает, как было задумано :)
Всем спасибо! Могу выложить, если кому-то интересно, только не знаю как здесь файл прикрепить... |
|||
14
ADirks
04.04.18
✎
07:43
|
А чего у тебя все манипуляции с окном в ПриОткрытии() ?
(обработку с майл.ру скачал) Так-то после создания окна надо это делать, в ПослеСозданияФормы() или ПослеОткрытия() типа Процедура ПослеСозданияФормы() Окно = СоздатьОбъект("Окна"); Расш = СоздатьОбъект("РасширениеФормы"); Расш.УстановитьФорму(Форма); Сервис = СоздатьОбъект("Сервис"); Окно.НаПереднийПлан(Форма); Окно.Максимизировать(Форма); Окно.ЦентрироватьОкно(Форма); Окно.ПоказыватьСтрокуСостояния(0); Окно.СтильОкна(Форма,2); //Расш.УстановитьКурсор(КаталогИБ() + "cur.cur"); Знак = 1; ВремяЗастКиоска = 1; Расш.ОбработкаОжидания("Заставка",1000 * ВремяЗастКиоска); КонецПроцедуры |
|||
15
MWWRuza
гуру
04.04.18
✎
08:06
|
(14)Да. Согласен, но почему-то процедуры ПослеСозданияФормы() и ПослеОткрытия() у меня не отрабатывают в этой обработке. Ставлю точки отладки внутрь этих процедур, запускаю обработку, форма открывается, в отладчик не вываливается... Что я не так делаю - не могу понять, а хотел бы.
|
|||
16
ADirks
04.04.18
✎
08:38
|
Т.е. в ПриОткрытии() всё это у тебя работает? о_О
не верю :)) Не может оно так работать, потому что окна нет, а стало быть рулить нечем (всякие там Окно.Максимизировать(Форма) не могут без окна работать). И WindowProc тоже нет, а значит и таймер работать не может. |
|||
17
MWWRuza
гуру
04.04.18
✎
08:42
|
(16)Тем не менее, работает... Сам в шоке.
|
|||
18
ADirks
04.04.18
✎
08:55
|
а версия FormEx какая? какие ещё ВК грузятся, в какой последовательности? 1С++?
если FormEx грузить не в обработке, а при старте системы? |
|||
19
MWWRuza
гуру
04.04.18
✎
09:13
|
(18)Версия 2.0.5.93. Грузятся только ScanOpos, GodexESC, CCRS_CvtGoods. В общем, только то, что с торговым оборудованием работает. 1cpp не гружу, вроде незачем.
При старте системы не пробовал, надо попробовать. |
|||
20
Злопчинский
04.04.18
✎
13:44
|
В модальной форме отработка предопределённых процедур зависит от версии формекса.
|
|||
21
Злопчинский
04.04.18
✎
13:46
|
Проц ПослеСоздания()
Если форма.модальныйрежим()=0 тогда возврат; Конец если; ПослеОткрытия(); КонецПроц И уже в после открытия делаешь что надо с Окно и Расш |
|||
22
Злопчинский
04.04.18
✎
13:48
|
В модальной форме ПослеОткрытия не отрабатывает.
И процедура называется ПослеСоздания() А не ПослеСозданияФормы |
|||
23
ADirks
04.04.18
✎
14:34
|
(22) ПослеСоздания() - это я не знаю чьё событие
есть ещё ФормаПриСоздании() в 1С++, а у FormEx именно так, как я написал. можно проверить Процедура ПриОткрытии() фрм = СоздатьОбъект("Форма"); фрм.УстановитьФорму(Форма); КонецПроцедуры Процедура ФормаПриСоздании() Сообщить("пс_1С++"); КонецПроцедуры Процедура ПослеСозданияФормы() Сообщить("псф"); КонецПроцедуры Процедура ПослеСоздания() Сообщить("пс_Фэкс"); КонецПроцедуры Процедура ПослеОткрытия() Сообщить("пот"); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |