|   |   | 
| 
 | 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С++"); КонецПроцедуры Процедура ПослеСозданияФормы() Сообщить("псф"); КонецПроцедуры Процедура ПослеСоздания() Сообщить("пс_Фэкс"); КонецПроцедуры Процедура ПослеОткрытия() Сообщить("пот"); КонецПроцедуры | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |