Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Мини-класс для работы с множественными перехватами формы (число прочтений - 3799 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Мини-класс для работы с множественными перехватами формы
29. Июня 2012 :: 12:27
Печать  
В связи с тем, что автор признал нижеописанную технологию тупиковой ветвью развития, тема представляет собой разве что академический интерес.


Данный мини-класс, по сути, описывает технологию относительно удобной работы с множественными перехватчиками формы.


Например, у вас уже есть 2 класса, каждый из которых является перехватчиком событий формы (скажем, Привязки и ТабличноПоле).

Теперь возникает проблема: т.к. каждый из двух классов перехватывает события формы, их действия необходимо согласовывать.
Ибо каждый последующий навешаный перехватчик забирает все события на себя ("кто последний - тот и папа").

Собственно, в согласовании работы нет ничего сложного - достаточно запоминать предыдущий перехватчик в момент вызова ПерехватитьСобытияГК(), а потом, в обработчике перехваченного события, не забыть сделать ВыполнитьСобытиеГК.

Правда, есть еще один маленький нюанс - если во втором навешенном перехватчике нет какого-то обработчика события, то до первого событие просто не дойдет. А значит в каждом классе необходимо описывать полный набор методов.


Но мы же с вами люди ленивые! Зачем делать ручками то, что можно успешно автоматизировать?
Мы возьмем, и унаследуем оба наших класса (привязок и табличного поля) от приложенного класса ТПерехватчик.

При инициализации класса-наследника делаем
Код
Выбрать все
Сам.ПолучитьБазовыйКласс("ТПерехватчик").Инит(_Контекст);   //_Контекст - контекст перехватываемой формы 



И дальше, единственное, что требуется от нас - после своих телодвижений не забывать в классе-наследнике вызывать событие базового класса.
Например, так:

Код
Выбрать все
Процедура Событие_ПриОтжатииЛевойКнопки(Сост, Гор, Верт, ФСО) Экспорт
    _ПриОтжатииЛевойКнопки(Сост, Гор, Верт);

   и(Сост, Гор, Верт, ФСО);
КонецПроцедуры // Событие_ПриОтжатииЛевойКнопки
 



Если же в одном из классов обработчик события не нужен - то вообще ничего не нужно делать: в качестве обработчика выступит метод базового класса, который перенаправит событие туда, куда нужно.


http://infostart.ru/public/141653/
« Последняя редакция: 23. Октября 2012 :: 05:03 - Satans Claws »  

__________________004.ert ( 7 KB | Загрузки )
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Мини-класс для работы с множественными перехватами формы
Ответ #1 - 02. Июля 2012 :: 06:50
Печать  
Немного вкусностей из класса:

1) у классов-наследников от ТПерехватчик совсем не обязательно хранить контекст формы. Можно вызывать метод КонтекстФормы() базового класса.

2) есть метод ИнициироватьЛожноеЗакрытиеФормы(). Собственно, предназначен для серии известных багов (когда обновить форму получается только сказав Форма.Закрыть() и сделав СтатусВозврата(0) в ПриЗакрытии).
2а) Для отслеживания ложного закрытия формы есть метод ЭтоЛожноеЗакрытиеФормы() (скажем, если в классе наследнике нужно разрушить вспомогательные объекты, то, разрушив их при ложном закрытии, гарантированно огребешься).

3) ТипЭлементаФормы(). Полезно при обработке событий мыши и клавиатуры (скажем, если мы хотим "глобализировать" табличное поле на всю форму а-ля 1С - чтоб по INS начинался ввод новой строки ТП, даже если ТП не является активным элементом формы).

4) ЕстьКоллБэкМетод(). Проверяет наличие метода у формы. Используется, например, так (класс ТТабличноеПоле, от которого наследуются, например, классы ТТабличноеПоле.Журнал и ТТабличноеПоле.ТЗ. Методы ДобавитьСтроку()):
Код
Выбрать все
		Если (Код = 96) Или (Код = VK_INSERT) Тогда	//Num0 или Ins
			Если Сам.ЕстьКоллБэкМетод(ИмяКнопки+"ДобавитьСтроку") = 1 Тогда
				ФСО = 0;
				оСервис = СоздатьОбъект("Сервис");
				оСервис.ВыполнитьПроцедуру(КонтекстФормы, ИмяКнопки+"ДобавитьСтроку");
				Возврат 1;

			ИначеЕсли Сам.ЕстьКоллБэкМетод("ДобавитьСтроку") = 1 Тогда
				КонтекстФормы.ДобавитьСтроку(Сам);
				//Сам.ОбновитьСтроки();
				ФСО = 0;
				Возврат 1;
			Иначе
				Возврат Сам.ДобавитьСтроку();
			КонецЕсли;
 

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Мини-класс для работы с множественными перехватами формы
Ответ #2 - 02. Июля 2012 :: 07:17
Печать  
И еще "маааленькие" замечания:

1) в классе НЕТ обработчика события Событие_ПослеСозданияФормы() (специально закомментирован).
Связано с очень неприятным багом, в результате которого весь перехват идет лесом с перехватом начинаются чудеса чудесатые Печаль.
И вообще, НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЮ перехватывать событие ПослеСозданияФормы где бы то ни было.
А так же НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЮ создавать/инициализировать в событии ПослеОткрытия объекты, использующие перехватчик - ибо с перехватом начинаются чудеса чудесатые
Лично у меня ПослеСозданияФормы отряжено под создание доп. объектов с перехватчиком (которым нужна уже созданная форма), а все необходимые телодвижения перенесены в событие ПослеОткрытия.


2) Ну и вообще, в классе описаны, наверное, не все возможные события. События в него добавляются по мере необходимости.
Хотя, стоит отметить, что за последний год добавилось только одно событие (ПослеЗакрытияФормы) Улыбка

3) Остерегайтесь именовать методы классов навроде "ПослеОткрытия". Ибо если в какой-то момент вы решите прикрутить к нему перехватчик - будет много танцев с бубном по переименованию.
Лично я использую имена _ПослеОткрытия для методов-исполнителей и Событие_ПослеОткрытие - для методов-перехватчиков.
« Последняя редакция: 02. Июля 2012 :: 14:20 - Satans Claws »  
Наверх
 
IP записан
 
an2
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 43
Зарегистрирован: 23. Марта 2012
Re: Мини-класс для работы с множественными перехватами формы
Ответ #3 - 04. Июля 2012 :: 15:03
Печать  
Satans Claws писал(а) 02. Июля 2012 :: 07:17:
И еще "маааленькие" замечания:

1) в классе НЕТ обработчика события Событие_ПослеСозданияФормы() (специально закомментирован).
Связано с очень неприятным багом, в результате которого весь перехват идет лесом с перехватом начинаются чудеса чудесатые Печаль.
И вообще, НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЮ перехватывать событие ПослеСозданияФормы где бы то ни было.
А так же НАСТОЯТЕЛЬНО НЕ РЕКОМЕНДУЮ создавать/инициализировать в событии ПослеОткрытия объекты, использующие перехватчик - ибо с перехватом начинаются чудеса чудесатые
Лично у меня ПослеСозданияФормы отряжено под создание доп. объектов с перехватчиком (которым нужна уже созданная форма), а все необходимые телодвижения перенесены в событие ПослеОткрытия.



У меня анналогичная ситация.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Мини-класс для работы с множественными перехватами формы
Ответ #4 - 05. Июля 2012 :: 07:06
Печать  
an2 писал(а) 04. Июля 2012 :: 15:03:
У меня анналогичная ситация.


Баг известен давно.
Правда, маловероятно, что им кто-нить будет заниматься Печаль
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Мини-класс для работы с множественными перехватами формы
Ответ #5 - 23. Октября 2012 :: 05:01
Печать  
В связи с тем, что автор признал указанную технологию тупиковой ветвью развития, тема может представлять собой разве что академический интерес.


Технология диспетчера перехвата оказалась жизнеспособнее.


PS для статистики:
В этом ключе технология развивалась с декабря 2010 года по июль 2012.
Где-то в июле-августе было принято решение о необходимости реализации диспетчера перехвата.
Где-то к середине сентября 2012 была реализована новая технология.
Стоит отметить, что новая технология в достаточной мере использовала старую - базовый класс ТПерехватчик продолжил свое существование, хотя уже с немного отличающимися целями и функционалом.
  
Наверх
 
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Мини-класс для работы с множественными перехватами формы
Ответ #6 - 13. Ноября 2012 :: 13:37
Печать  
Где можно почитать про новый диспетчер?
  
Наверх
GTalkICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Мини-класс для работы с множественными перехватами формы
Ответ #7 - 14. Ноября 2012 :: 07:29
Печать  
Kalen писал(а) 13. Ноября 2012 :: 13:37:
Где можно почитать про новый диспетчер?


У меня в конфе Улыбка))

Общая мысль озвучена тут:
http://forum.infostart.ru/forum24/topic64755/ (4 и 13 комментарии).
То, что там обозвано "Фабрика событий" - суть диспетчер перехвата и есть. Только названо немного не верно.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать