Переключение на Главную Страницу Страницы: 1 2 [3] 4 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик. У кого как? (число прочтений - 17661 )
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #30 - 08. Ноября 2007 :: 12:34
Печать  
Спасибо!
  
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #31 - 08. Ноября 2007 :: 12:43
Печать  
На здоровье.
ТОлько твой класс можно еще облегчить.
Убрать Сам()
Конструктор()
Зачем они?
глобальную перем тож убери
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #32 - 08. Ноября 2007 :: 12:48
Печать  
varelchik писал(а) 08. Ноября 2007 :: 07:00:
Пот какой у меня порядок подключения перехватчика:

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

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: Перехватчик. У кого как?
Ответ #33 - 08. Ноября 2007 :: 12:50
Печать  
dnp писал(а) 08. Ноября 2007 :: 09:44:
Как я понял,

1. Специально запоминать СистемныйПерехватчик (который = СоздатьОбъект( "Перехватчик" ) ) действительно не обязательно. При выходе из зоны видимости или при прямом обнулении переменной, перехват продолжает работать. При следующем создании всю инфу по перехватам можно получить. Запоминать можно для оптимизации (сэкономить на частых созданиях\уничтожениях).

2. Запоминать свой ОКОП, перехватывающий события ГМ и включающий для них перехват - тоже не нужно, его помнит СистемныйПерехватчик.

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

По всем пунктам +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: Перехватчик. У кого как?
Ответ #34 - 08. Ноября 2007 :: 12:54
Печать  
varelchik писал(а) 08. Ноября 2007 :: 07:00:
Теперь два класса:
ПерехватГМ::
Код
Выбрать все
Перем _Перехватчик;

Процедура ВключитьПерехватСобытий() Экспорт
...
	_Перехватчик = СоздатьОбъект("Перехватчик");  
	_Перехватчик.ПерехватитьСобытияГлобальногоМодуля(Контекст);
КонецПроцедуры	// ВключитьПерехватСобытий
 



Циклическая ссылка при использовании Перем _Перехватчик;
деструктор данного объекта никогда не будет вызван Печаль, т.е. объект никогда не будет удален Печаль

Большой УПС Печаль - попутал свой же встроенный класс с твоим пользовательским классом Улыбка
Все ок, ничего не нужно менять Улыбка
« Последняя редакция: 08. Ноября 2007 :: 14:53 - artbear »  

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #35 - 08. Ноября 2007 :: 13:02
Печать  
Код
Выбрать все
Перем _Перехватчик; // БАГ !! - на самом деле этого не нужно !
 



Так это ж в конфе по тестированию классов .
Конфигурация::ВключитьПерехватСобытий()
Я от тудава и взял.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #36 - 08. Ноября 2007 :: 13:11
Печать  
varelchik писал(а) 08. Ноября 2007 :: 07:00:
Код
Выбрать все
ПерехватчикСобытий = СоздатьОбъект("Перехват"); //твой класс перехвата всех форм
ПерехватчикСобытий.Инициализация(Конт); 



Лучше вместо этого кода использовать спец. фабричный метод или еще лучше фабричный класс типа ФабрикаСозданияПерехватчиков.
Причины:
1) Наверняка для различных форм (отчеты, справочники, документы, журналы и т.д.) будут использоваться различные события, необходимо различать обработчики этих событий, т.е. плодить
различные классы
2) А также если для различных форм одного вида будут использоваться различные обработчики
И соответственно, в различных конфигурациях будут различные классы-перехватчики Улыбка

Поэтому, чтобы не менять каждый раз класс ПерехватГМ для каждой конфигурации или конфы, лучше сделать так:
1) Создаем базовый фабричный класс БазоваяФабрикаСозданияПерехватчиков
2) Определяем у него открытый метод ПерехватитьКонтекст(КонтФормы) Экспорт
Метод в классе ничего не делает или выдает исключение или создает пустой перехватчик. Типа этот класс является абстрактным, только для наследования Улыбка
Основное действие будет происходить в конкретных классах-наследниках Улыбка
3) для каждой различной конфы пишем код в ГМ
Код
Выбрать все
	ФабрикаСозданияПерехватчиков = СоздатьОбъект("ФабрикаСозданияПерехватчиковДляДаннойКонфы"); //твой класс перехвата всех форм
	НовыйПерехватчикГМ = ФабрикаСозданияПерехватчиков.ПерехватитьГМ(Конт); 


[code]
4) а в наследнике ФабрикаСозданияПерехватчиковДляДаннойКонфы в методе ПерехватитьКонтекст пишем код по созданию точных обработчиков для нужных форм в данной конфе

Т.е. ООП в действии Улыбка
Этот метод хорош тем, что происходит минимальное изменение существующего клиентского кода.
  

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: Перехватчик. У кого как?
Ответ #37 - 08. Ноября 2007 :: 14:52
Печать  
varelchik писал(а) 08. Ноября 2007 :: 13:02:
Код
Выбрать все
Перем _Перехватчик; // БАГ !! - на самом деле этого не нужно !
 



Так это ж в конфе по тестированию классов .
Конфигурация::ВключитьПерехватСобытий()

Большой УПС Печаль - попутал свой же встроенный класс с твоим пользовательским классом Улыбка
Все ок, ничего не нужно менять Улыбка
  

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


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #38 - 08. Ноября 2007 :: 16:17
Печать  
artbear писал(а) 08. Ноября 2007 :: 12:50:
Соответственно деструкторы собственных объектов-перехватчиков будут вызваны либо при закрытии формы (перехват ГК) либо при завершении работы 1С (перехват ГМ)


Точно. Просто не следовало мне, в Деструкторе перехватчика ГМ, вызывать Сообщить(), 1С ведь уже закрылась почти, и сообщать ей не куда. Видимо.

varelchik писал(а) 08. Ноября 2007 :: 12:43:
На здоровье.
ТОлько твой класс можно еще облегчить.
Убрать Сам()
Конструктор()
Зачем они?
глобальную перем тож убери

Класс делал из болванки, просто чтобы начал работать. Переменная осталась от поиска причины падежа. Удаление лишнего делаю, когда уже знаю, что не лишнее. Деструктор здесь и в самом деле ни к чему. Если на последок в SQL-базу ни чего записать не захочу...
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #39 - 09. Ноября 2007 :: 02:34
Печать  
Вообще странно, у меня деструктор для объекта-перехватчика ГМ вызывается нормально и сообщение выводится как модальное окно предупреждения.
  

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


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #40 - 09. Ноября 2007 :: 07:58
Печать  
artbear писал(а) 08. Ноября 2007 :: 13:11:
Поэтому, чтобы не менять каждый раз класс ПерехватГМ для каждой конфигурации или конфы, лучше сделать так:
1) Создаем базовый фабричный класс БазоваяФабрикаСозданияПерехватчиков


Спасибо за идею. Как раз наступил на грабли -  Перехват процедуры ПриЗаписи() - в одной конфе работает, в другой нет.
Просто в одной ПриЗаписи()  вызывается без параметров,  а вдругой - ПриЗаписи(Парам).
Как бы обойти этот момент, или для каждой формы создавать перехватчик?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #41 - 09. Ноября 2007 :: 09:00
Печать  
mdzen писал(а) 09. Ноября 2007 :: 07:58:
Как раз наступил на грабли -  Перехват процедуры ПриЗаписи() - в одной конфе работает, в другой нет.
Просто в одной ПриЗаписи()  вызывается без параметров,  а вдругой - ПриЗаписи(Парам).
Как бы обойти этот момент, или для каждой формы создавать перехватчик?

1. Для разных типов форм (документ/справочник/журнал/отчет) наверняка нужны отдельные классы-обработчики перехватов.
2. Приведи пример форм, в которых Цитата:
Просто в одной ПриЗаписи()  вызывается без параметров,  а вдругой - ПриЗаписи(Парам).
!
  

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


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #42 - 09. Ноября 2007 :: 14:29
Печать  
При открытии формы документа вываливает следующее:
Код
Выбрать все
Перехватчик::ВыполнитьОригинальноеСобытиеГК - Неверное число параметров у обработчика события <ПриОткрытии> 


Во всех документах - без параметров, а в этом есть параметр "Флаг".
Т.е. для текущего дока надо писать свой перехват событий, с учетом параметров, или можно создать универсальный класс, который бы обрабатывал события как с параметрами, так и без них?
Поискал по форуму. Нашел про конструкторы и ФабрикуОбъектов http://www.1cpp.ru/forum/YaBB.pl?num=1193554475/20#20
Попробую этот метод.
  
Наверх
ICQ  
IP записан
 
mdzen
Junior Member
**
Отсутствует


Копм вам не для того чтоб
орехи колоть!

Сообщений: 35
Местоположение: Набережные Челны
Зарегистрирован: 18. Сентября 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #43 - 09. Ноября 2007 :: 15:00
Печать  
Прошу помочь.
Как определить при перехвате события есть у него параметры или нет? Плачущий
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #44 - 09. Ноября 2007 :: 15:59
Печать  
Выложи код, что вызываешь и как вызываешь.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 
ОтправитьПечать