Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса (число прочтений - 2520 )
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
23. Апреля 2009 :: 10:40
Печать  
Суть следующая : необходимо назначить для контекста несколько перехватчиков событий. Для это имеем несколько классов со следующей иерархией :
Общие.Событие.Делегат -> Общие.Событие.Делегат.Контекст -> Общие.Событие.Делегат.Контекст.ПослеСозданияФормы
...-> Общие.Событие.Делегат.Контекст -> Общие.Событие.Делегат.Контекст.ПослеОбновленияФормы

При открытии формы вызывается метод ПерехватитьСобытия
Код
Выбрать все
Перем гСсылкаКонтекст; // храним контекст открытой формы

Процедура УстановитьТекущийКонтекст(СсылкаКонтекст) Экспорт

	гСсылкаКонтекст	= СсылкаКонтекст;

	---------------
	// Проверим, быть может уже включен перехват
	Перехватчик	= СоздатьОбъект("Перехватчик");
	Делегат		= Перехватчик.ПолучитьПерехватчикСобытийГК(СсылкаКонтекст);
	Если ПустоеЗначение(Делегат) = 0 Тогда
		//Статус	= _this(Контекст).НазначитьБазовыйКласс(ТипЗначенияСтр(Делегат));
		//Статус	= _this(Контекст).ЗаменитьЭксзБазовогоКласса("Общие.Событие.Делегат.Контекст", Делегат);
		Статус	= Вирт().ЗаменитьБазовыйОбъект("Общие.Событие.Делегат.Контекст", Делегат);
	КонецЕсли;

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

Процедура ПерехватитьСобытия(СсылкаКонтекст) Экспорт

	Делегат			= СоздатьОбъект(ТипЗначенияСтр(_this(Контекст)));
	Делегат.УстановитьТекущийКонтекст(СсылкаКонтекст);

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

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


каждого из классов. В перехватчиках определены соотвествующие методы (ПослеСозданияФормы, ПослеОбновленияФормы,...). Но работает только последний назначенный перехватчик (уже обсуждалось). Суть идеи - если при перехвате подменять родителя текущего перехватчика на предыдущий перехватчик в цепочке, то он должен унаследовать и вызываемые при событиях методы. К сожалению подменить класс-родитель на нужный так и не получилось. Какой метод подмены родителя рабочий ?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
Ответ #1 - 23. Апреля 2009 :: 10:58
Печать  
Ты пойми - у тебя в цепочке могут быть перехватчики различных типов, т.е. разные объекты.
И ты в принципе не можешь подменять родителя у объекта на объект произвольного типа. - это одно из основ 1С++
Схема с родителями для перехватчика никак не подойдет, потому что объекты в цепочке перехватов разные!
  

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


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
Ответ #2 - 23. Апреля 2009 :: 12:05
Печать  
Все перехватчики - наследники от Общие.Событие.Делегат.Контекст и реализуют единый интерфейс. Т.е. имеем текущий перехватчик -
Общие.Событие.Делегат.Контекст.ПослеСозданияФормы : Общие.Событие.Делегат.Контекст
, предыдущий перехватчик
Общие.Событие.Делегат.Контекст.ПослеОбновленияФормы : Общие.Событие.Делегат.Контекст
, необходимо получить в итоге
Общие.Событие.Делегат.Контекст.ПослеСозданияФормы : Общие.Событие.Делегат.Контекст.ПослеОбновленияФормы
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
Ответ #3 - 24. Апреля 2009 :: 08:16
Печать  
ты пойми, родитель один, а сами объекты-перехватчики имеют различные, несопоставимые типы.
  

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


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
Ответ #4 - 24. Апреля 2009 :: 20:35
Печать  
я читал в свое время вот это
http://ru.wikipedia.org/wiki/Антипаттерн


а потом меня послали
http://ru.wikipedia.org/wiki/Pattern

В голове прояснилось......................
« Последняя редакция: 24. Апреля 2009 :: 21:45 - lustin »  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Несколько перехватчиков / ЗаменитьЭксзБазовогоКласса
Ответ #5 - 06. Мая 2009 :: 05:58
Печать  
Решено. Правда другим путем.
Общий смысл реализации: в наследника от ВыполняемыйМодуль загоняем текст необходимых функций и назначаем его перехватчиком событий контекста.
Практический смысл: фильтр по перехватываемым событиям для контекстов. Особенно это касается часто возникающих событий - клавиатура, мышь. В системах Windows производительность на высоте и перехватывать события можно везде, но в системах Linux с работой 1С под wine (используется wine@etersoft) при перехвате частых событий наблюдаются "тормоза".
Тестовый пример прилагается. Необходимы компоненты 1cpp.dll и formex.dll
  

test_010.zip ( 314 KB | Загрузки )
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать