Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема 1C++::Перехватчик и ускоренный FormEx (число прочтений - 3379 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
1C++::Перехватчик и ускоренный FormEx
25. Августа 2007 :: 12:27
Печать  
Народ, в связи с ускорением работы ФормЕкс могут появиться некоторые проблемы в работе пользовательских классов Перехватчика.

Например, след.схема перехвата перестала работать
Код формы отчета
Код
Выбрать все
Процедура ПослеОткрытия()
	ПерехватчикПользователя = СоздатьОбъект("ПользовательскийПерехватчик");

	ОбъектПерехватчик=СоздатьОбъект("Перехватчик");
	ОбъектПерехватчик.ПерехватитьСобытияГК(Контекст, ПерехватчикПользователя);
КонецПроцедуры

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Экспорт
	Сообщить("Форма - КодКлавиши:" + КодКлавиши + " Alt:" + Alt + " Shift:" + Shift + " Ctrl:" + Ctrl + " Символ:" + Символ + " ФСО:" + ФСО);
КонецПроцедуры
 


Код класса
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО) Экспорт
	Сообщить("Класс - КодКлавиши:" + КодКлавиши + " Alt:" + Alt + " Shift:" + Shift + " Ctrl:" + Ctrl + " Символ:" + Символ + " ФСО:" + ФСО);
КонецПроцедуры
 



т.е. после открытия формы при нажатии любой клавиши будет выдаваться не сообщение класса, а сообщение из формы.

Проблема здесь в том, что перехват ставится уже после того, как оптимизатор событий в ФормЕкс выполнит в первый и последний раз поиск обработчиков событий в модуле формы.
В дальнейшем поиска не будет, т.е. Перехватчику не к чем будет подцепляться, в итоге наш класс перехвата перестанет работать.

Решение
Нужно поставить перехват до того, как сработает оптимизатор ФормЕкс Улыбка

Например,
Код формы отчета
Код
Выбрать все
Процедура ВводНового() // вместо ПослеОткрытия
	ПерехватчикПользователя = СоздатьОбъект("ПользовательскийПерехватчик");

	ОбъектПерехватчик=СоздатьОбъект("Перехватчик");
	ОбъектПерехватчик.ПерехватитьСобытияГК(Контекст, ПерехватчикПользователя);
КонецПроцедуры
 


и все будет ок, можете проверить.

или можно воспользоваться перехватчиками событий глобального модуля типа СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового, СобытиеГМ_ВводНаОсновании.
Я лично пользуюсь только этими событиями для установки перехватов в своих конфигурациях.

В дальнейшем я планирую сделать такое универсальное решение, которое не будет зависеть от порядка установки перехвата.
Схема -
1. добавить в ФормЕкс::Сервис или РасширениеФормы спец.метод типа ОбновитьМетодыМодуляФормы, чтобы Оптимизатор из ФормЕкс выполнил заново поиск обработчиков, и Перехватчик смог этот поиск перехватить.

2. При создании перехватчика можно будет создавать соответствующий объект формекс.
Если создание не удалось, то значит, ФормЕкс нет, и ничего не делаем.
Если же объект создан, вызываем указанный выше спец.метод, Оптимизатор заново ищет, а Перехватчик перехватывает, и перехват прекрасно работает.
Все это будет во внутренностях 1С++ и ФормЕкс, т.е. прозрачно для разработчика/пользователя 1С++, и не придется переделывать существующий код Улыбка

ЗЫ по этой причине не будет работать в конфе классов 1С++ пример для класса РедакторТаблицыЗначений
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
mvgfirst
Full Member
***
Отсутствует


В борьбе бобра с ослом
всегда побеждает бобро!

Сообщений: 152
Местоположение: Украина г. Кривой Рог
Зарегистрирован: 17. Августа 2007
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #1 - 01. Сентября 2007 :: 06:40
Печать  
Незнаю, по это ли причине, или по причине недостаточно глубоко изученной документации но у меня не получилось перехватить события FormEx такие как ПриДвиженииМыши, ПриНажатииКнопкиКлавиатуры, ПриНажатииЛевойКнопки... другие даже не пробовал перехватывать...
Имеется ввиду перехват именно глобальных событий.
Если эти же события просто указать в тексте глобального модуля то они нормально отрабатывают. В локльном контексте так же нормально отрабатывают.
А вот если создать класс который будет перехватывать глобальные события через "СобытиеГМ_"... перехвата этих событий не происходит.
Хотя другие события FormEx такие как ПослеОткрытия - перехватываются нормально.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #2 - 04. Сентября 2007 :: 04:26
Печать  
Давай свой код, у меня глобальный перехват ПриНажатииКнопкиКлавиатуры нормально работает и активно юзается.
Пример есть в репозитарии - конфа классов 1С++
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
mvgfirst
Full Member
***
Отсутствует


В борьбе бобра с ослом
всегда побеждает бобро!

Сообщений: 152
Местоположение: Украина г. Кривой Рог
Зарегистрирован: 17. Августа 2007
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #3 - 04. Сентября 2007 :: 12:52
Печать  
Вопрос снят, разобрался... оказывается действительно недоконца изучил предмет, вследствие чего не ставил "Экспорт" у методов которые перехватывают события....
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #4 - 08. Сентября 2007 :: 11:13
Печать  
artbear писал(а) 25. Августа 2007 :: 12:27:
или можно воспользоваться перехватчиками событий глобального модуля типа СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового, СобытиеГМ_ВводНаОсновании.


Хотелось бы добавить, что попытку перехвата надо делать именно во всех трех событиях. А то обеспечены косяки. Промучался полдня, прежде чем понял почему на определенном документе не работает ввод на основании.

Я делаю так:
Код
Выбрать все
Функция СобытиеГМ_ПриОткрытии(Конт) Экспорт
   Если ПустоеЗначение(Конт) = 0 Тогда
	Перехватчик = СоздатьОбъект("Перехватчик");
	ПерехватчикСобытий = Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
	Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
	   ПерехватчикСобытий = СоздатьОбъект("ПерехватчикиСобытийФормы"); //мой класс перехвата
	   ПерехватчикСобытий.Инициализация(Конт);
	КонецЕсли;
   КонецЕсли;
Возврат 1;
КонецФункции
 



Если сделать для всех трех событий, то форма будет 100% перехвачена.

Если же есть класс перехвата для определенной формы, например документа, то можно сделать так:
Код
Выбрать все
Функция СобытиеГМ_ПриОткрытии(Конт) Экспорт
   Если ПустоеЗначение(Конт) = 0 Тогда
	Перехватчик = СоздатьОбъект("Перехватчик");
	ПерехватчикСобытий = Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
	Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
	   РасширениеФормы = СоздатьОбъект("РасширениеФормы");
	   РасширениеФормы.УстановитьФорму(Конт.Форма);
	   ПолныйТипОбъекта = РасширениеФормы.ПолныйТипОбъекта();

	   Если ПолныйТипОбъекта = "Документ.Ваш_документ.Форма" Тогда
		ПерехватчикСобытий = СоздатьОбъект("Класс_перехвата_вашей_формы");
	   Иначе
		ПерехватчикСобытий = СоздатьОбъект("ПерехватчикиСобытийФормы"); //мой класс перехвата
	   КонецЕсли;
	   ПерехватчикСобытий.Инициализация(Конт);
	КонецЕсли;
   КонецЕсли;
   Возврат 1;
КонецФункции
 


  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #5 - 11. Сентября 2007 :: 11:11
Печать  
Arta писал(а) 08. Сентября 2007 :: 11:13:
Хотелось бы добавить, что попытку перехвата надо делать именно во всех трех событиях. А то обеспечены косяки. Промучался полдня, прежде чем понял почему на определенном документе не работает ввод на основании.

Хотелось бы отметить, что ИМХО это не проблемы Перехватчика, а проблемы его использования и использования штатных событий 1С Улыбка
Т.к. доступ к документам может быть осуществлен через 3 указанных события - новые документы через ВводНового или ВводНаОсновании, а уже записанные доки через ПриОткрытии
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1C++::Перехватчик и ускоренный FormEx
Ответ #6 - 11. Сентября 2007 :: 14:53
Печать  
Согласен. Артур, только начав пользоваться Перехватчиком мне этой информации точно недоставало.  Смех
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать