Имя: Пароль:
1C
1C 7.7
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С++");
КонецПроцедуры

Процедура ПослеСозданияФормы()
    Сообщить("псф");
КонецПроцедуры

Процедура ПослеСоздания()
    Сообщить("пс_Фэкс");
КонецПроцедуры

Процедура ПослеОткрытия()
    Сообщить("пот");
КонецПроцедуры
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший