Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 11 ОтправитьПечать
Очень популярная тема (более 25 ответов) Перехватчик. Для каких событий необходим ручной вызов оригинального? (число прочтений - 71541 )
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #45 - 15. Декабря 2010 :: 08:21
Печать  
Вопрос - а Событие "ПослеОткрытия" перехватчик перехватывает?

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #46 - 15. Декабря 2010 :: 08:32
Печать  
Satans Claws писал(а) 15. Декабря 2010 :: 08:21:
Вопрос - а Событие "ПослеОткрытия" перехватчик перехватывает?

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.


Именно про это событие написано в справке ... а вообще - он перекрывает все предопределенное.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #47 - 15. Декабря 2010 :: 08:51
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 08:32:
Satans Claws писал(а) 15. Декабря 2010 :: 08:21:
Вопрос - а Событие "ПослеОткрытия" перехватчик перехватывает?

Да и вообще, составить бы список всех событий, которые подвластны перехватчику.


Именно про это событие написано в справке ... а вообще - он перекрывает все предопределенное.


Тогда спрашивается, почему приходится писать такой из**б в форме, в которой перехватываю события:

Код
Выбрать все
Перем фПослеОткрытия;

Процедура ПослеОткрытия()
	Если ПустоеЗначение(фПослеОткрытия) = 1 Тогда
		фПослеОткрытия = 1;

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



Общая схема работы организована таким образом:
Имеется несколько объектов, которым необходим перехват событий (ТабличноеПоле, Привязки).
Каждый из этих объектов дополнительно наследует от класса ТПерехватчик.
в классе ТПерехватчик для каждого события описан примерно следующий обработчик:
Код
Выбрать все
Функция Событие_ПриОтжатииКнопкиКлавиатуры(Код, Альт, Шифт, Ктрл, Символ, ФСО) Экспорт
	Возврат Перехватчик.ВыполнитьСобытиеГК(ПредОбработчик, КонтекстФормы, "ПриОтжатииКнопкиКлавиатуры", Код, Альт, Шифт, Ктрл, Символ, ФСО);
КонецФункции	// ПриОтжатииКнопкиКлавиатуры 



а в классах ТабличногоПоля и Привязок, в соотв. событиях после своих действий делается вызов
"Возврат атуры(Код, Альт, Шифт, Ктрл, Символ, ФСО);"

все работает, все замечательно.
Только после открытия не отрабатывает.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #48 - 15. Декабря 2010 :: 09:22
Печать  
Возможно, конечно, что трабл в том, в ПриОткрытии() создается объект привязок, перехватывающий события;
он перехватывает ПослеСозданияФормы (и тут же перенаправляет вызов в обработчик формы), где создается объект ТабличногоПоля, который так же перехватывает события.

Может, конечно, из-за этого кому-то рвет крышу.
Но фишка в том, что дальнейшие события (приОтжатииКнопкиКлавиатуры и т.п.) обрабатываются нормально.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #49 - 15. Декабря 2010 :: 09:46
Печать  
Satans Claws писал(а) 15. Декабря 2010 :: 08:51:
все работает, все замечательно.
Только после открытия не отрабатывает.

Т.е. в справку заглянуть религия не позволяет?
Во первых: это не предопределенное событие, а добавленное усилиями энтузиастов.
Во вторых: его надо отрабатывать несколько иначе (кстати, в этой теме уже обсуждалось).
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #50 - 15. Декабря 2010 :: 09:57
Печать  
Dmitry The Wing писал(а) 15. Декабря 2010 :: 09:46:
Т.е. в справку заглянуть религия не позволяет?
Во первых: это не предопределенное событие, а добавленное усилиями энтузиастов.
Во вторых: его надо отрабатывать несколько иначе (кстати, в этой теме уже обсуждалось).


1) справка прочитана и более того
2) Какой мой вопрос был? "Поддерживается ли конкретно это событие?" И связан он был именно с тем, что а) я знаю, что это событие формекса + б) наличию непонятного поведения в достаточно стройной структуре.
3) вот на счет обрабатывать иначе - в справке этого нет. Буду рыть тему.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #51 - 15. Декабря 2010 :: 10:13
Печать  
Похоже, я поторопился с "несколько иначе" - это касается только СобытиеГМ_ПриОткрытии, СобытиеГМ_ВводНового и СобытиеГМ_ВводНаОсновании, вместо которых рекомендовано использовать только СобытиеГМ_СозданиеКонтекста.
А Событие_ПослеОткрытия работает также как и Событие_ПриОткрытии - никакой разницы не наблюдается.
Другое дело, что перехват на форму я устанавливаю при перехвате СобытиеГМ_СозданиеКонтекста ... а у тебя (если я верно понял) перехват устанавливается в ПриОткрытии? - такой способ работы мною не пробован...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #52 - 15. Декабря 2010 :: 10:25
Печать  
Я решил не греть голову с глобальными перехватчиками.

ибо один фиг, в каждой форме используется свой набор классов.
Даже в отчетах не абсолютно везде изспользуется одна и та же методология (в подавляющем количестве написанных мною отчетов, но все же не везде. Плюс к тому, что от прошлого программера тут вообще зоопарк остался).


А многие из классов сами по себе являются перехватчиками событий (и как я уже писал, дополнительно наследуют от класса ТПерехватчик, задача которого - не потерять цепочку исполнения).

Попробую создать тестовую конфу, чтоб баг повторялся.
Если получится - выложу.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #53 - 15. Декабря 2010 :: 10:51
Печать  
Воспроизвел.

Отчет 1 - отрабатывает нормальною
Отчет 2 - выявляет баг.
Должно выводить:
Цитата:
Форма:ПриОткрытии
Класс:ПослеСозданияФормы. ТПерехватчик1
Форма:ПослеСозданияФормы
Класс:ПослеОткрытия. ТПерехватчик2
Класс:ПослеОткрытия. ТПерехватчик1
Форма:ПослеОткрытияФормы

Выводит:
Цитата:
Форма:ПриОткрытии
Класс:ПослеСозданияФормы. ТПерехватчик1
Форма:ПослеСозданияФормы
Форма:ПослеОткрытияФормы



1спп 3.2.2.0
формекс 2.0.5.93бета
  

hooker_test.rar ( 5 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #54 - 16. Декабря 2010 :: 02:10
Печать  
Satans Claws писал(а) 15. Декабря 2010 :: 10:51:
Воспроизвел.

У меня конфа не взлетела с твоего MD:
Невосстановимая ошибка Базы данных
Код: -10
Ошибка открытия словаря Базы данных

Она, кстати, и синтаксический контроль не проходит...

Satans Claws писал(а) 15. Декабря 2010 :: 10:51:
1спп 3.2.2.0
формекс 2.0.5.93бета

Странная версия формекса... уже давно есть 2.0.5.101 от 10.09.2010
Да и 1с++ уже 3.2.3.х.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #55 - 16. Декабря 2010 :: 03:59
Печать  
Dmitry The Wing писал(а) 16. Декабря 2010 :: 02:10:
У меня конфа не взлетела с твоего MD:
Невосстановимая ошибка Базы данных
Код: -10
Ошибка открытия словаря Базы данных

Она, кстати, и синтаксический контроль не проходит...

Открыть, изменить любые метаданные (коммент конфы) сохранить, не?
А полный синтаксический контроль она естественно не пройдет - обругается на все хидеры классов Подмигивание

Цитата:
Странная версия формекса... уже давно есть 2.0.5.101 от 10.09.2010
Да и 1с++ уже 3.2.3.х.

Формекс апдейтнул (делал ролбэк на версию, на которой все работало на прошлой работе - а потом забыл сделать роллбэк роллбэка). Баг сохранился.
А вот 3.2.3.х в снапшотах нема. Откуда качать? Нашел. 3.2.3.8 - баг в наличии.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #56 - 16. Декабря 2010 :: 04:00
Печать  
Кстати, сегодняшний взгляд на трезвую голову намекает, что там не только ПослеОткрытия() - но и весь перехват идет лесом...
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #57 - 16. Декабря 2010 :: 06:31
Печать  
Пришлось отключить весь перехват форм из-за жалоб юзеров на частый вылет 1С при работе с отчетами.
Эксперименты показали, что вылет сохранялся до тех пор, пока не закомментарил начало перехвата, т.е. СобытиеГМ_СозданиеКонтекста.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #58 - 16. Декабря 2010 :: 06:47
Печать  
Не, у меня стабильно работает, тьфу-тьфу.

Кстати - вылетами и непонятными глюками практически всегда заканчивается попытка обращения к контексту формы, которая уже закрыта.

Учитывая, что перехватчику эти контексты необходимы как воздух - покури код, может где-то действуешь небезопасно и тыкаешься в уже разрушенную форму?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #59 - 16. Декабря 2010 :: 07:03
Печать  
Самое странное то, что я не использую перехват событий формы. Добавил включение на будущее ... т.е. на данный момент единственное событие формы, которое перехватываю - это СобытиеГМ_СозданиеКонтекста.

Видимо, придется вернуться к использованию перехвата СобытиеГМ_ПриОткрытии.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 6 ... 11
ОтправитьПечать