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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Системная проблема Перехватчика
21. Августа 2007 :: 13:29
Печать  
Народ, пришло время обсудить проблему при использовании несколько классов-перехватчиков для форм или глобального модуля.
ИМХО это системный баг, т.е. багофича выбранного мной проектирования.

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

в Класс1 есть обработчик события1
в Класс2 есть обработчик события2

выполняю код
Класс1.Перехватить
Класс2.Перехватить

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

Дело в том, что встроенный класс 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: Системная проблема Перехватчика
Ответ #1 - 21. Августа 2007 :: 15:12
Печать  
Схема простого обхода проблемы
во всех перехватчиках из цепочки определяем все события !

Исходные классы
Код
Выбрать все
// класс1
Функция Событие_ПервоеСобытие(Параметры, ...) Экспорт
// свой код
КонецФункции
// + метод по установке перехвата
 


Код
Выбрать все
// класс2
Функция Событие_ДругоеСобытие(Параметры, ...) Экспорт
// свой код
КонецФункции
// + метод по установке перехвата
 


И последовательность установки перехвата следующая
Класс1.Перехватить(КонтФормы)
Класс2.Перехватить(КонтФормы)

И решение
1) Т.е. если у класса 1 есть событие1, то у класса2 также должно быть событие1,
т.е. в класс2 нужно добавить еще след.код
Код
Выбрать все
// класс2
Функция Событие_ПервоеСобытие(Параметры, ...) Экспорт
// код в п.3
КонецФункции 



2) При установке повторного перехвата нужно выполнить код типа
Код
Выбрать все
// класс2
_ПредОбработчикСобытий = _Перехватчик.ПерехватитьСобытияГК(КонтФормы, Сам()); 


2) и обработчик события1 в классе2 должен просто вызвать обработчик события 1 из класса 1, т.е.  
в класс2 нужно добавить еще след.код типа
Код
Выбрать все
// класс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: Системная проблема Перехватчика
Ответ #2 - 21. Августа 2007 :: 16:52
Печать  
Простой пример - если в классе Перехватчик1 есть обработка событий мыши, а в классе Перехватчик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: Системная проблема Перехватчика
Ответ #3 - 22. Августа 2007 :: 14:34
Печать  
Типа ап!
ЗЫ вдруг кто-нибудь пропустил ветку в связи с проблемами на форуме Печаль
  

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: Системная проблема Перехватчика
Ответ #4 - 22. Августа 2007 :: 15:37
Печать  
artbear писал(а) 21. Августа 2007 :: 16:52:
Простой пример - если в классе Перехватчик1 есть обработка событий мыши, а в классе Перехватчик2 есть обработка событий клавы, но нет мышиных, то после установки перехвата на второй класс перестанут отрабатывать события мыши Печаль


Артур, я все же придерживаюсь своей точки зрения, которую озвучил тебе еще в Питере.
Не фига плодить кучу перехватчиков. Надо создавать разные классы, у которых есть свои определенные родители, в которых прописываются общие для всех события. У потомков - какие-то особенные.
У меня так создаются например классы с такой иерархией ОбщаяФорма-Форма.Документ-Форма.Документ.Заказ_наряд
В каждом классе есть по чуть чуть кода. В основном все прописано в ОбщаяФорма.

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

По крайней мере я твоих проблем не испытываю. И со страхом читаю ветку, так как ты можеш все поменять Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #5 - 23. Августа 2007 :: 05:15
Печать  
Arta писал(а) 22. Августа 2007 :: 15:37:
Артур, я все же придерживаюсь своей точки зрения, которую озвучил тебе еще в Питере.
Не фига плодить кучу перехватчиков.
...
По крайней мере я твоих проблем не испытываю. И со страхом читаю ветку, так как ты можеш все поменять Улыбка

Вот об этом я и говорю - конечный разработчик схемы сам все выстраивает, как нужно ему.

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

Тем более, что наследование совсем не обязательно - можно и агрегацией обойтись нормально Улыбка

Менять существующую схему не буду, она достаточно удобна и доказала свое право на жизнь Улыбка

Будет некое добавление в схему для разруливания подобных ситуаций и использования универсальных классов.
  

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: Системная проблема Перехватчика
Ответ #6 - 23. Августа 2007 :: 06:50
Печать  
artbear писал(а) 23. Августа 2007 :: 05:15:
Менять существующую схему не буду, она достаточно удобна и доказала свое право на жизнь Улыбка

Будет некое добавление в схему для разруливания подобных ситуаций и использования универсальных классов.



Гуд!
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #7 - 28. Ноября 2007 :: 21:21
Печать  
Вот увлекшимсь перехватчиком столкнулся с описаной выше проблемой.
Хотел спросить у artbear какие продвижения в данном направлении есть? если конечно есть  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #8 - 29. Ноября 2007 :: 04:41
Печать  
Хе. И МенеджерСобытий по нормальному не прикрутишь - число параметров у событий разное, придётся делать по менеджеру на каждое событие.. Бррр...
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #9 - 29. Ноября 2007 :: 05:46
Печать  
Arta,
у тебя объект обработчик событий формы создается Фабрикой?
когда появляется новый КОП в иерархии - корректируешь Фабрику? (спрашиваю от того, что написал ровно то же самое, но был отправлен в книжки Улыбка )

artbear,
у тебя объект обработчик событий формы создается хде? и кем? (кстати, кажется ты меня тоже посылал читать про Фабрику, а сам?... Подмигивание )
  
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #10 - 29. Ноября 2007 :: 06:10
Печать  
Кстати, мне кааца, что было бы проще жить, если бы 1С++ позволяла определять синглтоны.
Лепить переменные в ГМ бесит %(

Ага-ага.. следом я захочу метод УничтожитьОбъект(...) для отладки синглтонов  Смех

В общем-то, задача решается через тот же ФабричныйМетод или ФабричныйОбъект сидящий в глобальном модуле - сделал один раз, и синглтонь сколько хочешь.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #11 - 06. Июня 2008 :: 03:42
Печать  
Зарегил баг http://www.1cpp.ru/bugs/show_bug.cgi?id=3904
согласно теме ветки.
Начну решать.
  

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: Системная проблема Перехватчика
Ответ #12 - 06. Июня 2008 :: 06:15
Печать  
artbear писал(а) 06. Июня 2008 :: 03:42:
Зарегил баг http://www.1cpp.ru/bugs/show_bug.cgi?id=3904
согласно теме ветки.
Начну решать.
Народ, не бейте сразу ногами сильно...  Смех
Например, есть классы Базовый-Наследник. При создании Наследник'а копируются события/методы Базового класса. И так каждый раз при создании Наследник'а.
А можно-ли (вот именно тут не бейте  Улыбка) при создании первого Наследник'а создается экземпляр Базового класса, а при создании последующих - используется экземпляр уже созданного Базового класса?
При таком варианте проблема с Перехватчиком решалась бы просто, но всё-равно, как сказал Артур, теряется универсальность.
  

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



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #13 - 06. Июня 2008 :: 07:47
Печать  
Артур, может стоит изучить практику реализации механизма сигнал/слот и инсталляций фильтров событий в объект, порывшись в библиотеке Qt.
Вводная тут. http://www.crossplatform.ru/documentation/qtdoc4.3/signalsandslots.php
только приходит в голову некоторые НО:
В Qt данные механизмы поддерживаются на системном уровне, вплоть до разрыва связи перед удалением объекта.
Непонятно как синтаксически описать коннект....
в С++/Qt используется синтаксис такого рода:
connect(Объект1Сигнальщик, SIGNAL(ФункцияОбъекта1(ТипПарам1[,ТипПарамN})), Объект2Получающий, SLOT(ФункцияОбъекта2(ТипПарам1[,ТипПарамN})));
Наверное прийдется писать строкой....
На всякий случай прилагаю исходники класса QObject, возможно будут полезны.
  

kernel_qobject_h_cpp.zip ( 34 KB | Загрузки )
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Системная проблема Перехватчика
Ответ #14 - 06. Июня 2008 :: 10:34
Печать  
Не хочу я вводить механизм подписки Печаль, хотя наверняка придется.
Схема работы перехвата и его обработчиков не совсем подходит под подписку.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать