Переключение на Главную Страницу Страницы: 1 2 [3] 4 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Подписка на события vs Перехватчик в каждом классе (число прочтений - 24474 )
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #30 - 14. Августа 2008 :: 08:35
Печать  
Вот из-за того, что много возникает вариантов/мнений, не хочу выкладывать класс с подпиской в репозитарий.
Хочу услышать все мнения, а потом уже выложить то, что может удовлетворить всех.
Мне лично, нравиться вариант, когда класс указывает ОбязательноПолучатьСобытие=1, т.е. если ему очень нужно, то он получит событие, вне зависимости, прерывает кто-либо цепочку событий или нет. Т.е. это поведение более универсальное, особенно если класс обрабатывает только "свои реквизиты".
Замечу, что форма получит событие в любом случае, вне зависимости - есть обрыв цепочки или нет, т.к. она (форма) не подписывается на события, а получает в любом случае.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #31 - 14. Августа 2008 :: 08:40
Печать  
AndreyM писал(а) 14. Августа 2008 :: 08:26:
artbear писал(а) 14. Августа 2008 :: 08:15:
И от порядка подписки ничего не должно зависеть, это опять же мешает универсальности Печаль

Но так работает Перехватчик! Согласен?

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

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

ЗЫ пример Перехватчика - это не идеал Улыбка
  

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 Перехватчик в каждом кл
Ответ #32 - 14. Августа 2008 :: 08:41
Печать  
AndreyM писал(а) 14. Августа 2008 :: 08:35:
Замечу, что форма получит событие в любом случае, вне зависимости - есть обрыв цепочки или нет, т.к. она (форма) не подписывается на события, а получает в любом случае.

Надеюсь, получает только, если цепочка подписчиков разрешит это, а не независимо от подписчиков?
  

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 Перехватчик в каждом кл
Ответ #33 - 14. Августа 2008 :: 08:43
Печать  
artbear писал(а) 14. Августа 2008 :: 08:40:
В Перехватчике избран самый простой способ, с помощью которого можно построить любую схему работы Улыбка - т.е. специально не заведен какой-нибудь диспетчер, чтобы не ограничивать конкретного разработчика.

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

Например, таким образом ты смог сделать аж 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 Перехватчик в каждом кл
Ответ #34 - 14. Августа 2008 :: 08:52
Печать  
artbear писал(а) 14. Августа 2008 :: 08:40:
Так в этом и был весь смысл, чтобы разработчик для конкретной конфы сделал сам нужную ему универсальную схему работы классов.
В Перехватчике избран самый простой способ, с помощью которого можно построить любую схему работы Улыбка - т.е. специально не заведен какой-нибудь диспетчер, чтобы не ограничивать конкретного разработчика.

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

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #35 - 14. Августа 2008 :: 08:56
Печать  
artbear писал(а) 14. Августа 2008 :: 08:41:
AndreyM писал(а) 14. Августа 2008 :: 08:35:
Замечу, что форма получит событие в любом случае, вне зависимости - есть обрыв цепочки или нет, т.к. она (форма) не подписывается на события, а получает в любом случае.

Надеюсь, получает только, если цепочка подписчиков разрешит это, а не независимо от подписчиков?

В данной реализации получит независимо от подписчиков.
Теперь я тебя совсем не пойму: сейчас говоришь "если цепочка подписчиков разрешит это",  а выше говорил "нельзя разрывать цепочку"
Чё-то мы ходим вокруг да около  Улыбка
Можешь высказать мнение: было-бы классно, если бы было вот так!

ЗЫ Как мне интересно - я уже решил (не всё реализовал пока)
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #36 - 14. Августа 2008 :: 09:00
Печать  
Схему работы с перехватом для разных классов лично я вижу именно через подписку - это наиболее универсально ! Именно этот путь я планировал для использования клиентами Перехватчика при проектировании Перехватчика.

Кстати, очень похоже с твой подпиской.

Перенес описание в тематическую ветку http://www.1cpp.ru/forum/YaBB.pl?num=1218783847/1#1

Вот такая вот схема.
Что скажете?
« Последняя редакция: 15. Августа 2008 :: 07:13 - artbear »  

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 Перехватчик в каждом кл
Ответ #37 - 14. Августа 2008 :: 09:10
Печать  
AndreyM писал(а) 14. Августа 2008 :: 08:56:
Теперь я тебя совсем не пойму: сейчас говоришь "если цепочка подписчиков разрешит это",  а выше говорил "нельзя разрывать цепочку"
Чё-то мы ходим вокруг да около  Улыбка

эти цитаты о разных вещах Улыбка
"нельзя разрывать цепочку" - это об универсальных подписчиках, которые должны выполниться независимо от остальных, т.е. всегда


"если цепочка подписчиков разрешит это" - отвечаю

AndreyM писал(а) 14. Августа 2008 :: 08:56:
artbear писал(а) 14. Августа 2008 :: 08:41:
AndreyM писал(а) 14. Августа 2008 :: 08:35:
Замечу, что форма получит событие в любом случае, вне зависимости - есть обрыв цепочки или нет, т.к. она (форма) не подписывается на события, а получает в любом случае.

Надеюсь, получает только, если цепочка подписчиков разрешит это, а не независимо от подписчиков?

В данной реализации получит независимо от подписчиков.

"В данной реализации получит независимо от подписчиков." - это и плохо.
Например, у меня есть универсальные обработчики по проверке спец.прав доступа и по проверке даты дока по дате запрета редактирования.
И очень удобно, если один из классов запрещает открытие формы дока, возвращает 0, то я не хочу, чтобы форма дока открывалась и запускался локальный обработчик из модуля формы дока !
  

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 Перехватчик в каждом кл
Ответ #38 - 14. Августа 2008 :: 09:16
Печать  
К своей схеме добавил забытый п.8
  

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 Перехватчик в каждом кл
Ответ #39 - 14. Августа 2008 :: 09:29
Печать  
AndreyM писал(а) 14. Августа 2008 :: 06:25:
Уточни, это мы говорим о подписке или о БазовыйПерехватчик-НаследникПерехватчик?

угу
  
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



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

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

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

artbear писал(а) 14. Августа 2008 :: 09:00:
2. Т.е. при добавлении нового события придется менять либо сам класс диспетчера, либо наследоваться от него и менять код создания этого диспетчера. Это не проблема Улыбка

да, в моем варианте только добавить в класс ПодпискаБазовый
Код
Выбрать все
Функция Событие_НовоеСобытие(параметры) Экспорт
	Возврат _ВыполнитьСобытиеФормы("НовоеСобытие",параметры);
КонецФункции 


дело 15-ти секунд Улыбка

artbear писал(а) 14. Августа 2008 :: 09:00:
3. Классы, который хочет подписаться, знает о наличии этого диспетчера

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

artbear писал(а) 14. Августа 2008 :: 09:00:
4. Класс, который хочет подписаться на любые события формы, при своем создании подписывается на событие Диспетчера "Обработать_Событие_НачалоСобытийФормы". Это событие всегда вызывается при получении диспетчером первого события формы.
Это возможно в глобальнике или еще как-то.
Т.е. объекты классов-подписчиков могут храниться до открытия формы.

"который хочет подписаться ..." - см.выше п.3
"Это возможно в глобальнике или еще как-то" - см.выше п.3
"Т.е. объекты классов-подписчиков могут храниться до открытия формы" - см.выше п.3, см. http://www.1cpp.ru/forum/YaBB.pl?num=1218627334/15#16

artbear писал(а) 14. Августа 2008 :: 09:00:
5. Класс-подписчик в обработчике "Обработать_Событие_НачалоСобытийФормы" может/должен подписаться на нужные события формы.

Не очень понял, по "может/должен подписаться на нужные события формы" - если хочет подписаться на ВСЕ события, описанные в классе-подписчике, то вызываешь ПодписатьсяНаСобытияФормы(ГрупповойКонтекст,Класс), а если только на "ОпределенныйМетод" (а другие процедуры/функции с аналогичным именем события зачем-то описаны в классе-подписчике), то вызываешь ПодписатьсяНаСобытияФормы(ГрупповойКонтекст,Класс,"ОпределенныйМетод").

artbear писал(а) 14. Августа 2008 :: 09:00:
6. Также класс-подписчик может подписаться на событие формы в любой момент, например, на событие ПриЗаписи уже после открытия формы.

м. выше п.5 и п.4

artbear писал(а) 14. Августа 2008 :: 09:00:
7. При получении диспетчером от 1С++ события формы он вызывает всех своих подписчиков по цепочке.

Так и есть! Функция ) Экспорт

artbear писал(а) 14. Августа 2008 :: 09:00:
Сначала вызывается событие диспетчера по проверке - первое событие из п.2
Далее вызывается основное/второе событие диспетчера с передачей доп.параметра спец. флаг/состояние "вызывать ли событие формы".

см.выше п.1

artbear писал(а) 14. Августа 2008 :: 09:00:
Вот такая вот схема

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

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

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



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

чем плох параметр в подписке ОбязательноПолучатьСобытие=1 ? Т.е. "должны выполниться независимо от остальных, т.е. всегда" (я так понял, что ты не читал Ответ #23 в этой ветке)

artbear писал(а) 14. Августа 2008 :: 09:10:
"В данной реализации получит независимо от подписчиков." - это и плохо

Можно поставить проверку на возвращенное значение от подписчиков - нет проблем. Улыбка
я так понял это и есть "забытый п.8"?

ЗЫ Не забудь прочитать ответ выше
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #42 - 14. Августа 2008 :: 10:41
Печать  
Arta писал(а) 13. Августа 2008 :: 20:43:
AndreyM писал(а) 13. Августа 2008 :: 12:40:
А в наследнике:
Код
Выбрать все
Функция Событие_ПриНажатииПравойКнопки(Сост, Гор, Верт, ФСО) Экспорт
	Рез = База().Событие_ПриНажатииПравойКнопки(Сост, Гор, Верт, ФСО);
	Возврат Рез;
КонецФункции 


1. Зачем тебе возврат Рез, если есть ФСО?
2. Лучше делать так:

Родитель:
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры(Код, Альт, Шифт, Контрол, Символ, ФСО) Экспорт
	Перехватчик.ВыполнитьОригинальноеСобытиеГК(Конт, "ПриНажатииКнопкиКлавиатуры", Код, Альт, Шифт, Контрол, Символ, ФСО);
 


Наследник:
Код
Выбрать все
Процедура ПриНажатииКнопкиКлавиатуры(Код, А, Ш, К, Символ, ФСО) Экспорт
	Вирт().ПолучитьБазовыйКласс().ПриНажатииКнопкиКлавиатуры(Код, А, Ш, К, Символ, ФСО);
КонецПроцедуры
 



У тебя же может быть несколько наследников в иерархии


Да, спасибо Arta, ты прав на счет Вирт().ПолучитьБазовыйКласс() - если несколько наследников, то нужно именно так. Улыбка

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

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



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #43 - 14. Августа 2008 :: 16:53
Печать  
AndreyM писал(а) 14. Августа 2008 :: 10:41:
Перехватчик.ВыполнитьСобытиеГК(ПредПерехватчик, Сам().КонтФормы...

Какие предыдущие? Ты выполняешь это в базовом классе, а каждый наследник в иерархии вызывает своего родителя, пока не доберется до Базового.
У меня максимальная иерархия из трех классов. Этого достаточно
Например: ПерехатчикСобытийФормы-Документ-Документ.РасходнаяНакладная.
  
Наверх
 
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #44 - 15. Августа 2008 :: 06:04
Печать  
Arta писал(а) 14. Августа 2008 :: 16:53:
AndreyM писал(а) 14. Августа 2008 :: 10:41:
Перехватчик.ВыполнитьСобытиеГК(ПредПерехватчик, Сам().КонтФормы...

Какие предыдущие? Ты выполняешь это в базовом классе, а каждый наследник в иерархии вызывает своего родителя, пока не доберется до Базового.
У меня максимальная иерархия из трех классов. Этого достаточно
Например: ПерехатчикСобытийФормы-Документ-Документ.РасходнаяНакладная.

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

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
ОтправитьПечать