Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Подписка на события vs Перехватчик в каждом классе (число прочтений - 24527 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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

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

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

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

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

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

Перенес в репозитарий
http://www.1cpp.ru/forum/YaBB.pl?num=1218783847/0
  

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: Подписка на события vs Перехватчик в каждом кл
Ответ #46 - 15. Августа 2008 :: 06:48
Печать  
Поясняю вышесказанное (в ответе #44): например у тебя есть класс-обработчик, который обрабатывает реквизит формы.
В классе Документ.РасходнаяНакладная ты создаешь несколько таких классов, например, для полей "Контрагент" и "МестоХранения". При нажатии кнопки клавиатуры класс-обработчик должен начать поиск по вхождению символа в имя конкретного реквизита. Как класс-обработчик получит нажатую клавишу?
Есть два варианта:
1) в классе-обработчике установлен перехват на текущую форму и он обрабатывает нажатую  клавишу (ответ на вопрос: "Какие предыдущие?")
2) из класса Документ.РасходнаяНакладная вызываешь метод класса-обработчика посредством КлассОбработчик.НажатаКлавиша(Символ)
Какой метод ты используешь?  Подмигивание
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #47 - 15. Августа 2008 :: 07:05
Печать  
artbear писал(а) 15. Августа 2008 :: 06:45:
Не удержался и реализовал свою схему перехватов событий формы и глобальников через подписку.
ИМХО Получилось просто, удобно и красиво Улыбка


Перенес в репозитарий
http://www.1cpp.ru/forum/YaBB.pl?num=1218783847/0
  

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: Подписка на события vs Перехватчик в каждом кл
Ответ #48 - 15. Августа 2008 :: 07:21
Печать  
Поясни, как подключить данный обработчик в рабочую конфу?

PS читал описание http://www.1cpp.ru/forum/YaBB.pl?num=1218627334/40 ?
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #49 - 15. Августа 2008 :: 08:10
Печать  
AndreyM писал(а) 14. Августа 2008 :: 09:56:
artbear писал(а) 14. Августа 2008 :: 09:00:
1. Есть базовый диспетчер, класс-обработчик перехвата, в нем или его предках описываются абсолютные все события, которые может получить форма, т.е. именно этот диспетчер подключается как перехватчик формы, один единственный перехватчик.
На каждое событие формы описывается, как правило, два события диспетчера.
Первое - это быстрая проверка передачи события формы в саму форму - с возможностью прерывания цепочки.
Второе событие - это основная обработка события с доп.параметром "вызывать ли событие формы".

Но тут возникает но...
Давай рассмотрим вариант класса-подписчика, который обрабатывает реквизит формы (у меня таких много). Т.е. класс-подписчик смотрит: Форма.АктивныйЭлемент() = "Мой" и обрабатывает его. По идее, если Мой, то я его обработал и остальным классам-подписчикам (обработчикам реквизитов) нет смысла проверять, потому что Мой реквизит я уже обработал, а Ваши неактивны в любом случае. Вопрос: что передавать в ПервоеСобытие ? Т.е. обрабатывать событие нужно, но только одним классом-подписчиком. Т.е. в ПервомСобытии есть смысл только в ограниченном кругу событий формы. Согласен? Сделать - не вопрос, только определиться в каких событиях это нужно

Ваше слово, сэр! Улыбка

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

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: Подписка на события vs Перехватчик в каждом кл
Ответ #50 - 15. Августа 2008 :: 08:12
Печать  
Если класс не нуждается в согласовании, он просто не определяет обработчик первого события (у меня тест3) и юзает только второе.
  

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: Подписка на события vs Перехватчик в каждом кл
Ответ #51 - 15. Августа 2008 :: 08:23
Печать  
Получается, у меня, нужно просто не реагировать на Возврат 0 (конечно не для ПервогоСобытия) и всё.
Добавляю первые события, для каких методов - определю сам.

"Понимаешь, ты переходишь к частным случаям - в твоем случае получается, что с этим реквизитом никакой другой класс работать не может Печаль" - вижу опять - не читал.
Предлагал в ПодписатьсяНаСобытияФормы(ГрупповойКонтекст, Класс, ИмяСобытия, ОбязательноПолучатьСобытие=0) в параметр ОбязательноПолучатьСобытие установить 1
Либо вообще отказаться от вылетов по цепочке - и всё. Повторюсь: делал аналогично поведению МенеджераСобытий! Считал, что так нужно.
  

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


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #52 - 15. Августа 2008 :: 09:03
Печать  
AndreyM писал(а) 15. Августа 2008 :: 08:23:
делал аналогично поведению МенеджераСобытий! Считал, что так нужно.

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

De quelle planète es-tu?
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #53 - 15. Августа 2008 :: 09:16
Печать  
kms писал(а) 15. Августа 2008 :: 09:03:
Менеджер событий - это довольно старый функционал с весьма спорной реализацией и дизайном.

Понял, спасибо.
Не знал, поэтому и вышел на форум, чтобы обсудить принципы работы подписки.

ЗЫ смотрел реализацию группового вызова в тестовой конфе, но отказался от такого метода из-за большого количества ограничений
  

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #54 - 15. Августа 2008 :: 18:36
Печать  
AndreyM писал(а) 15. Августа 2008 :: 06:04:
Если у тебя на одной форме несколько перехватчиков, то в предложенном варианте эти несколько не будут выполняться - только последний

а... ну я то расписываю всегда прелести наследования Улыбка
т.е. у меня никаких подписок, и я счастлив безмерно  Смех
  
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #55 - 16. Августа 2008 :: 06:36
Печать  
Arta писал(а) 15. Августа 2008 :: 18:36:
а... ну я то расписываю всегда прелести наследования Улыбка
т.е. у меня никаких подписок, и я счастлив безмерно  Смех

Ну да, в классе-наследнике вызываешь методы соответствующих классов-обработчиков реквизитов/правил/событий/защиты и т.п.
Это и есть подписка, но без явного вызова ПодписатьсяНаСобытия..., а прямо в классе Документ.РасходнаяНакладная ты вызываешь методы других классов (фактически - подписчиков), в зависимости от событий формы. Т.е. ты юзаешь именно то, о чем мы и говорим  Смех Тока называешь другими словами  Улыбка

В подписке точно также наследуется класс от базового класса-перехватчика, только в наследнике не прописываются сразу во всех событиях вызовы методов классов-обработчиков, а в одном месте (в Конструкторе или ПриОткрытии) добавляется одна строка: ПодписатьсяНаСобытияФормы(...).
И всё! Класс-обработчик, считай, сам прописал свои методы для всех событий формы/класса. Насколько меньше работы программеру! Представляешь?  Подмигивание

И если ты придумал новое поведение класса-обработчика, например, ПриДвиженииМыши, а раньше это событие у тебя не использовалось в этом классе-обработчике, соответственно вызов его не прописан в наследниках (таких как Документ.РасходнаяНакладная), то если не пользоваться подпиской, то тебе нужно пройтись по всем классам (Документ.РасхНакл, Док.Счет, Док.ПрихНакл и т.д.) и вписать вызов метода ПриДвиженииМыши класса-обработчика.
А при подписке - только реализовать этот метод в классе-обработчике. А остальные классы сами подхватят этот код!
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #56 - 17. Августа 2008 :: 04:15
Печать  
AndreyM писал(а) 15. Августа 2008 :: 09:16:
ЗЫ смотрел реализацию группового вызова в тестовой конфе, но отказался от такого метода из-за большого количества ограничений

Это ты про что?
  

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: Подписка на события vs Перехватчик в каждом кл
Ответ #57 - 17. Августа 2008 :: 16:40
Печать  
AndreyM писал(а) 16. Августа 2008 :: 06:36:
И если ты придумал новое поведение класса-обработчика, например, ПриДвиженииМыши, а раньше это событие у тебя не использовалось в этом классе-обработчике, соответственно вызов его не прописан в наследниках (таких как Документ.РасходнаяНакладная), то если не пользоваться подпиской, то тебе нужно пройтись по всем классам (Документ.РасхНакл, Док.Счет, Док.ПрихНакл и т.д.) и вписать вызов метода ПриДвиженииМыши класса-обработчика.
А при подписке - только реализовать этот метод в классе-обработчике. А остальные классы сами подхватят этот код!

Для чего тогда в этой схеме класс-родитель?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #58 - 17. Августа 2008 :: 17:48
Печать  
Когда же все таки Перехватчик начнет ловить не только события формы?
А и все остальные события?
Типа Записать(), Удалить() и т.п.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #59 - 17. Августа 2008 :: 20:21
Печать  
varelchik писал(а) 17. Августа 2008 :: 17:48:
Когда же все таки Перехватчик начнет ловить не только события формы?
А и все остальные события?
Типа Записать(), Удалить() и т.п.

А Записать и Удалить уже стали событиями?  Озадачен
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать