Отвечаю по пунктам (видимо из-за "запутанности", которую я на для исправлю - уже знаю как, у нас и получился этот диалог
)
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#16artbear писал(а) 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)
Ваше слово, сэр!