Вход | Регистрация


1С:Предприятие ::

Метки: 

v7: Потеря фокуса окна из ОбработкиОжидания

Я
   MWWRuza
 
03.04.18 - 11:13
Добрый день!
Задача: ПрайсЧекер(информационный киоск).
Все работает красиво, но, есть косяк под RDP Server 2003 R2 - не умеет он заставку по RDP транслировать. Поэтому, скринсейвер решил прямо в нем самом, на 1С организовать. Заставка - бегущая строка "Отсканируйте ШтрихКод проверяемого товара!". С этим, проблем тоже нет.
Но, после срабатывания заставки по ОбработкеОжидания Formex(штатной не получится - окно модальное), фокус с него убегает, как я понимаю на основное окно программы. Перестает отрабатывать "ОбработкаВнешнего События()" со сканера. Точнее, оно отрабатывает, но не в форме  обработки, а в глобальном модуле. Как сделать, что-бы фокус, после запуска заставки по ОбработкеОжидания, оставался на окне обработки?
Сейчас, процедура "Заставка()", вызываемая из обработки ожидания, такая:

Процедура Заставка() 
    Расш.ОбработкаОжидания("Заставка",0);// Останавливаю ожидание,нечего ждать, когда заставка уже крутится... 

    Форма.ИспользоватьСлой("Заставка",2);
    Побежали3 = 1;
    Расш.ЦветФона = 0;
    Форма.Обновить();
    Окно.НаПереднийПлан(Форма);// Не помогает

    Активизировать();          // Тоже не помогает  

КонецПроцедуры

Естественно, после того, как фокус потерян, сработка "ОбработкаВнешнегоСобытия()" в глобальнике, не "пробуждает" киоск... Кроме сканера по Com порту, на этой рабочей станции(тонкий клиент) нет других устройств ввода.
 
  Рекламное место пустует
   MWWRuza
 
1 - 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
   nicesc
 
2 - 03.04.18 - 11:38
Попробуй вместо Окно.НаПереднийПлан(Форма); повторно открыть  форму ПрайсЧекер?

Ну или в глобальном модуле в ОбработкеВнешнего проверь наличие открытой формы ПрайсЧекер, активизируй её и через FormEx вызови внешнеесобытие.
   MWWRuza
 
3 - 03.04.18 - 11:55
Попробовал. Он их "наслаивает" одну на одну, столько, сколько скринсейвер срабатывает. Если сначала делать Форма.Закрыть(), то тоже ничего хорошего не получается - открывается новая форма, и уже не в фокусе...

А вот второй вариант, несколько "через одно место", но, надо попробовать...
   nicesc
 
4 - 03.04.18 - 12:03
странно почему он их наслаивает, окно же модальное?

второй вариант через одно место, согласен, но должен работать
   ADirks
 
5 - 03.04.18 - 12:13
а что, заставка и осн.окно - это разные формы что-ли?
может, всё в одном флаконе сделать?
   MWWRuza
 
6 - 03.04.18 - 12:42
(5)Форма одна, слои разные.
   Сияющий в темноте
 
7 - 03.04.18 - 13:06
Нарисуйте уже ваб страницу в браузере в режиме киоска и делайте все,что хочется,зачем 1с насиловать?
   VoditelKobyly
 
8 - 03.04.18 - 13:16
Не понял как каа заставка реализована?
Через ЗапуститьПриложение или просто переключением слоев и выводом текста?
   VoditelKobyly
 
9 - 03.04.18 - 13:18
Если с формы не уходить, то и фокус не потеряется.
Заставку нужно делать в этой же форме.
   MWWRuza
 
10 - 03.04.18 - 13:32
(7)Я не знаю, как такое можно реализовать на семерке.

(8)Переключением слоев и выводом текста.
 
  Рекламное место пустует
   MWWRuza
 
11 - 03.04.18 - 14:23
ОбработкаОжидания тут, похоже ни при чем...
Где-то я в другом месте запутался.
Сделал для теста кнопки принудительного переключения с заставки на обычный режим, все обработки ожидания закоментировал. Все равно не работает, такое чувство, что при переключении слоев теряется фокус...
Вот процедура через кнопку "Заставка":
Процедура Заставка() 
//    Расш.ОбработкаОжидания("Заставка",0);

//    Форма.ИспользоватьСлой("Общий",1);
    Форма.ИспользоватьСлой("Заставка",2);
    Побежали3 = 1;
//    Форма.Обновить();

    Расш.ЦветФона = 0;
//    Окно.НаПереднийПлан(Форма);

//    Форма.Обновить();
//    Активизировать();

КонецПроцедуры

А вот по кнопке "Разбудить":

Процедура Разбудить() 
//    Расш.ОбработкаОжидания("Заставка",1000 * Константа.ВремяЗастКиоска);

//    Форма.ИспользоватьСлой("Общий",1);
    Форма.ИспользоватьСлой("Товар",2);
    Расш.ЦветФона = -1;
    Побежали3 = 0;
//    Форма.Обновить();

//    Окно.НаПереднийПлан(Форма);
//    Форма.Обновить();

КонецПроцедуры

Кнопки "Разбудить" две, одна в слое "Заставка", вторая в слое "Товар". Кнопка "Заставка" в слое "Товар".
После запуска программы, ВнешнееСобытие отрабатывает, товар сканируется.
Жмешь "Заставка" - все, все побежало, но и фокус убежал, ВнешнееСобытие в глобальнике работает...
Нажимаешь кнопку "Разбудить" в слое "Заставка", заставка останавливается, появляется слой товар, но, ВнешнееСобытие по прежнему в глобальнике отрабатывает, соответственно товар не ищется... Жмешь кнопку "Разбудить" в слое "Товар", и все, после этого начинает работать ВнешнееСобытие в форме!

Чета я совсем заработался, надо отвлечься... Не понимаю я как так может быть... Форма одна, ну и что, что слои разные... ВнешнееСобытие же не в слое работает, а в модуле формы... Фигня какая-то...
   MWWRuza
 
12 - 03.04.18 - 15:08
Хм... Штатный метод Активизировать(<ИмяРеквизита>,<Режим>)

<ИмяРеквизита> - необязательный параметр. Строка с именем поля диалога, которое нужно активизировать. Пустое имя элемента диалога используется для активизации всей формы.

Делаю на форме, в слое "Заставка", текстовый реквизит "Хрень". В процедуре "Заставка()" пишу "Активизировать("Хрень")". Запускаюсь, включаю кнопкой "Заставку", сканирую товар - просыпается! Но, не сканируется товар... Добавляю в слой "Товар" реквизит "Хрень2", в процедуре "Разбудить()" пишу "Активизировать("Хрень2")". Проверяю, Работает!
Бред какой-то... А как-же описание в синтакс-помошнике - "Пустое имя элемента диалога используется для активизации всей формы." - ???
   MWWRuza
 
13 - 03.04.18 - 15:38
Вернул ОбработкиОжидания, поубирал лишние тестовые кнопки, вывел "Хрени" за пределы формы, причесал код... Все работает, как было задумано :)
Всем спасибо!

Могу выложить, если кому-то интересно, только не знаю как здесь файл прикрепить...
   ADirks
 
14 - 04.04.18 - 07:43
А чего у тебя все манипуляции с окном в ПриОткрытии() ?
(обработку с майл.ру скачал)
Так-то после создания окна надо это делать, в ПослеСозданияФормы() или ПослеОткрытия()
типа
Процедура ПослеСозданияФормы()
    Окно     = СоздатьОбъект("Окна");
    Расш     = СоздатьОбъект("РасширениеФормы");
    Расш.УстановитьФорму(Форма);
    Сервис     = СоздатьОбъект("Сервис");
       
    Окно.НаПереднийПлан(Форма); 
       Окно.Максимизировать(Форма);
      Окно.ЦентрироватьОкно(Форма);
      Окно.ПоказыватьСтрокуСостояния(0);
       Окно.СтильОкна(Форма,2); 
       //Расш.УстановитьКурсор(КаталогИБ() + "cur.cur");

       
       Знак        = 1;
       ВремяЗастКиоска = 1;
    Расш.ОбработкаОжидания("Заставка",1000 * ВремяЗастКиоска); 
КонецПроцедуры
   MWWRuza
 
15 - 04.04.18 - 08:06
(14)Да. Согласен, но почему-то процедуры ПослеСозданияФормы() и ПослеОткрытия() у меня не отрабатывают в этой обработке. Ставлю точки отладки внутрь этих процедур, запускаю обработку, форма открывается, в отладчик не вываливается... Что я не так делаю - не могу понять, а хотел бы.
   ADirks
 
16 - 04.04.18 - 08:38
Т.е. в ПриОткрытии() всё это у тебя работает? о_О
не верю :))
Не может оно так работать, потому что окна нет, а стало быть рулить нечем (всякие там Окно.Максимизировать(Форма)  не могут без окна работать). И WindowProc тоже нет, а значит и таймер работать не может.
   MWWRuza
 
17 - 04.04.18 - 08:42
(16)Тем не менее, работает... Сам в шоке.
   ADirks
 
18 - 04.04.18 - 08:55
а версия FormEx какая? какие ещё ВК грузятся, в какой последовательности?  1С++?
если FormEx грузить не в обработке, а при старте системы?
   MWWRuza
 
19 - 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
В модальной форме ПослеОткрытия не отрабатывает.
И процедура называется
ПослеСоздания()
А не ПослеСозданияФормы
   ADirks
 
23 - 04.04.18 - 14:34
(22) ПослеСоздания() - это я не знаю чьё событие
есть ещё ФормаПриСоздании() в 1С++, а у FormEx именно так, как я написал.

можно проверить

Процедура ПриОткрытии()
    фрм = СоздатьОбъект("Форма");
    фрм.УстановитьФорму(Форма);
КонецПроцедуры

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

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

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

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



Список тем форума
  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует