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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Набор классов для универсального перехвата событий
15. Августа 2008 :: 07:04
Печать  
Не удержался и реализовал свою схему перехватов событий формы и глобальников через подписку.
ИМХО Получилось просто, удобно и красиво   
Реализация разделена на несколько простых и слабо связанных классов, т.е. пример ООП-проектирования для 1С++

Пока я сделал явную подписку на события, т.е. каждый клиент-подписчик должен явно прописать, какие события он будет обрабатывать.

Приложена минимальная тестовая конфа с классами, в которой все видно и можно потестить.

В глобальнике только одна строчка - загрузка ВК 1С++  Улыбка

Пока обрабатываются только  -
СобытиеГМ_ПриОткрытии
Событие_ПриОткрытии (форма)

ЗЫ остался мелкий, нерешенный вопрос - каким образом и где добавлять описание всех используемых событий ГМ и форм.
Скорее всего, я выделю этот код в отдельный класс, который и нужно будет модифицировать при добавлении нового события.

Также нужно слегка доработать классы на предмет первого события в ГМ, после которого можно работать с формой - СобытиеГМ_ПриОткрытии, _ВводНового, _ВводНаОсновании. Это также несложно.
  

1cpp_Hook_Delegate.rar ( 15 KB | Загрузки )

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #1 - 15. Августа 2008 :: 07:13
Печать  
Краткое описание схемы

Схему работы с перехватом для разных классов лично я вижу именно через подписку - это наиболее универсально !


Именно этот путь я планировал для использования клиентами Перехватчика при проектировании Перехватчика.

Пример только для событий формы

1. Есть базовый диспетчер, класс-обработчик перехвата, в нем или его предках описываются абсолютные все события, которые может получить форма, т.е. именно этот диспетчер подключается как перехватчик формы, один единственный перехватчик.
На каждое событие формы описывается, как правило, два события диспетчера.
Первое - это быстрая проверка передачи события формы в саму форму - с возможностью прерывания цепочки.
Второе событие - это основная обработка события с доп.параметром "вызывать ли событие формы".
Но, если обработчик первого события в классе-обработчике отсутствует, ничего страшного, значит, первое событие этому обработчику не будет послано. Т.е. ускорение и упрощение.

2. Т.е. при добавлении нового события придется менять либо сам класс диспетчера, либо наследоваться от него и менять код создания этого диспетчера. Это не проблема Улыбка
3. Классы, который хочет подписаться, знает о наличии этого диспетчера
4. Класс, который хочет подписаться на любые события формы, при своем создании подписывается на событие Диспетчера "Событие_ПерехватФормы". Это событие всегда вызывается при получении диспетчером первого события формы.
Это возможно в глобальнике или еще как-то.
Т.е. объекты классов-подписчиков могут храниться до открытия формы.
5. Класс-подписчик в обработчике "Событие_ПерехватФормы" может/должен подписаться на нужные события формы.
6. Также класс-подписчик может подписаться на событие формы в любой момент, например, на событие ПриЗаписи уже после открытия формы.
7. При получении диспетчером от 1С++ события формы он вызывает всех своих подписчиков по цепочке.
Сначала вызывается событие диспетчера по проверке - первое событие из п.2
Далее вызывается основное/второе событие диспетчера с передачей доп.параметра спец. флаг/состояние "вызывать ли событие формы".
8. Диспетчер после обработки всеми подписчиками события №2 проверяет флаг/состояние "вызывать ли событие формы". Если он включен, то вызывается обработчик события в локальном модуле формы перехваченного контекста.
Если выключен, то не вызывается.

ЗЫ исходная версия http://www.1cpp.ru/forum/YaBB.pl?num=1218627334/36#36
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #2 - 15. Августа 2008 :: 07:15
Печать  
Для событий ГМ используется абсолютная та же схема.
Только добавочное событие называется "Событие_ПерехватГМ".
  

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #3 - 15. Августа 2008 :: 07:53
Печать  
Я заканчиваю полемику - не читаем сообщения друг-друга Печаль
В приведенном варианте, например в реализации класса Тест.Обработчик_ПриОткрытии2 (строка 89) опиши Событие_ПриОткрытии(ФСО), т.е. без ФлагЧтенияНастройки - полный вылет (точнее, зависалово).

ЗЫ я об этом писал, но ты не читал Печаль  Доделаю (упрощаю) свою реализацию, а правила, описанные тобой у меня полностью соблюдены
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #4 - 15. Августа 2008 :: 08:02
Печать  
AndreyM писал(а) 15. Августа 2008 :: 07:53:
Я заканчиваю полемику - не читаем сообщения друг-друга Печаль

У тебя очень много букв написано Печаль Просто не нашел сил изучить все Печаль

AndreyM писал(а) 15. Августа 2008 :: 07:53:
В приведенном варианте, например в реализации класса Тест.Обработчик_ПриОткрытии2 (строка 89) опиши Событие_ПриОткрытии(ФСО), т.е. без ФлагЧтенияНастройки - полный вылет (точнее, зависалово).

ЗЫ я об этом писал, но ты не читал Печаль  Доделаю (упрощаю) свою реализацию, а правила, описанные тобой у меня полностью соблюдены

Не видел Печаль - много букав.
Проверю. Отпишусь.

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

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



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #5 - 15. Августа 2008 :: 08:12
Печать  
artbear писал(а) 15. Августа 2008 :: 08:02:
У тебя очень много букв написано

Так ты много букв в качестве "Схемы работы с перехватом..." написал http://www.1cpp.ru/forum/YaBB.pl?num=1218783847/1#1 - я тебе ответил по каждой букве http://www.1cpp.ru/forum/YaBB.pl?num=1218627334/30#40,

а если бы написал: "Т.е. из всего тобой описанного, не реализовано только ПервоеСобытие, которое нужно более конкретно рассмотреть (что рассматривать, см.п.1) " - так мы точно друг-друга не поняли бы

ЗЫ Теперь-то я знаю что делать, поэтому ухожу в нирвану, упрощаю реализацию для понимания...
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #6 - 15. Августа 2008 :: 08:26
Печать  
AndreyM писал(а) 15. Августа 2008 :: 07:53:
В приведенном варианте, например в реализации класса Тест.Обработчик_ПриОткрытии2 (строка 89) опиши Событие_ПриОткрытии(ФСО), т.е. без ФлагЧтенияНастройки - полный вылет (точнее, зависалово).

ЗЫ я об этом писал, но ты не читал Печаль

Нужно помнить, что в обработчике события формы или ГМ не должно быть исключений - это ошибка проектирования
Именно из-за этого виснет 1С Печаль

Исправил реализацию Перехватчика в 1С++, теперь на подобное исключение просто будет выдаваться ошибка в окно сообщений и программа будет хромать дальше.

Аналогично в свое время kms сделал для событий ТП.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #7 - 15. Августа 2008 :: 08:33
Печать  
artbear писал(а) 15. Августа 2008 :: 08:26:
AndreyM писал(а) 15. Августа 2008 :: 07:53:
В приведенном варианте, например в реализации класса Тест.Обработчик_ПриОткрытии2 (строка 89) опиши Событие_ПриОткрытии(ФСО), т.е. без ФлагЧтенияНастройки - полный вылет (точнее, зависалово).

Нужно помнить, что в обработчике события формы или ГМ не должно быть исключений - это ошибка проектирования
Именно из-за этого виснет 1С Печаль

Исправил реализацию Перехватчика в 1С++, теперь на подобное исключение просто будет выдаваться ошибка в окно сообщений и программа будет хромать дальше.

http://www.1cpp.ru/bugs/show_bug.cgi?id=4075

Исправлено. Будет в очередной сборке icpp.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #8 - 15. Августа 2008 :: 08:34
Печать  
Ушел в оффлайн до понедельника.

ЗЫ Сборку icpp выложить уже не успеваю!
так что про исправление поверьте на слово Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Набор классов для универсального перехвата соб
Ответ #9 - 19. Августа 2008 :: 05:37
Печать  
artbear писал(а) 15. Августа 2008 :: 08:33:
artbear писал(а) 15. Августа 2008 :: 08:26:
Нужно помнить, что в обработчике события формы или ГМ не должно быть исключений - это ошибка проектирования
Именно из-за этого виснет 1С Печаль

Исправил реализацию Перехватчика в 1С++, теперь на подобное исключение просто будет выдаваться ошибка в окно сообщений и программа будет хромать дальше.

http://www.1cpp.ru/bugs/show_bug.cgi?id=4075

Исправлено. Будет в очередной сборке icpp.

Исправлено в 3.0.1.15
Прошу использовать.
  

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



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Набор классов для универсального перехвата событий
Ответ #10 - 01. Сентября 2008 :: 08:27
Печать  
ну наконец то есть пример подписки, это хорошо, однозначно попробую у себя применить.
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать