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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Ошибка 4515 - Событие_ПриИзмененииРазмераОкна нарушает АктивизироватьОбъект
Ответ #30 - 02. Декабря 2010 :: 02:44
Печать  
Поскольку ответа по проблеме перехватчика, создал запись в багзилле.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #31 - 02. Декабря 2010 :: 05:19
Печать  
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #32 - 02. Декабря 2010 :: 05:20
Печать  
artbear писал(а) 02. Декабря 2010 :: 05:19:
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2

Расскажи, как 7.7 на 8.2 переносишь? Или они все типовые?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #33 - 02. Декабря 2010 :: 07:21
Печать  
Dmitry The Wing писал(а) 02. Декабря 2010 :: 05:20:
artbear писал(а) 02. Декабря 2010 :: 05:19:
Пока что некогда заниматься 1С++ Печаль
Конец года, переносы баз 77/8.1 на 8.2

Расскажи, как 7.7 на 8.2 переносишь? Или они все типовые?

77 у меня все доработки от типовых Бух 77, конечно Улыбка
Поэтому беру в руки КД + правила переноса из Бух 77 в Бух 2.0 и и с их помощью делаю собственные правила.
  

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #34 - 02. Декабря 2010 :: 07:24
Печать  
artbear писал(а) 02. Декабря 2010 :: 07:21:
77 у меня все доработки от типовых Бух 77, конечно Улыбка
Поэтому беру в руки КД + правила переноса из Бух 77 в Бух 2.0 и и с их помощью делаю собственные правила.

Я еще ни разу не пробовал переносить 7 на 8, но предполагаю, что наиболее сложным будет автоперенос периодики ... ведь принцип работы с такими значениями изменился в корне...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #35 - 06. Декабря 2010 :: 06:53
Печать  
avgreen писал(а) 01. Декабря 2010 :: 11:32:
Кстати версию 1с++ приведи. А то это проблему Артур решил совсем недавно и в старых версиях действительно не работал СтатусВозврата(0)
Да я разобрался - действительно, недочитал документацию. Теперь все работает.
А версия - 3.2.2.0


Теперь другой трабл:
Есть класс - наследник от ТабличноеПоле.
Этот же класс, при инициализации, натравливается на форму, как перехватчик событий.
Само по себе - все работает Ок.

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

И в том и в другом классе все выглядит примерно так:

Код
Выбрать все
Перем Перехватчик, ПредОбработчик, КонтекстФормы;

Процедура Инит() Экспорт
	...

	Перехватчик = СоздатьОбъект("Перехватчик");
	ПредОбработчик = Перехватчик.ПерехватитьСобытияГК(КонтекстФормы, Сам);
КонецПроцедуры	// Инит

Процедура Событие_ПриИзмененииРазмераОкна(ТипСобытия, Ширина, Высота) Экспорт
	...

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



Причем, пробовал как Перехватчик.ВыполнитьОригинальноеСобытиеГК(КонтекстФормы, "ПриИзмененииРазмераОкна", ПредОбработчик); так и
Перехватчик.ВыполнитьСобытиеГК(КонтекстФормы, "ПриИзмененииРазмераОкна", ПредОбработчик);

Собственно, трабл в том, что объект, инициализированный вторым, события перехватывает, нормально знает предыдущий обработчик; но перенаправление на обработчик события первого объекта не происходит.

Поскольку документация написана несколько сумбурно - подозреваю, что я что-то делаю не так.

PS можно, конечно, ручками вызывать ПредОбработчик.Событие_...() - но это еще надо дополнительно следить, что этот метод там определен... А я, как любой программист, ленив. (А был бы не ленив - хрен бы я выносил функционал в классы. Лень - двигатель прогресса.)


Вот, из документации:
Цитата:
7. При необходимости вызова обработчиков событий, которые определены в контексте или в глобальном модуле, в обработчике события внутри пользовательского класса нужно использовать код

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

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

КонецПроцедуры

И там же:
Цитата:
ВыполнитьСобытиеГК / RunEventOfGroupContext

Синтаксис: ВыполнитьСобытиеГК(ОбработчикСобытияИлиПустоеЗначение, ГрупповойКонтекстФормы, ИмяСобытия, ...)

Возвращает: тип: Число - статус возврата модуля указанного контекста.
Параметры:
ОбработчикСобытияИлиПустоеЗначение - тип: класс 1С++ или пустое значение.
ГрупповойКонтекстФормы - тип: ГрупповойКонтекст.
ИмяСобытия - тип: Строка.

Описание: Вызывает соответствующий обработчик события контекста формы. Если обработчик не задан, просто выполняется вызов ВыполнитьОригинальноеСобытиеГК Если обработчик задан, то выполняется вызов соответствующего метода. Если метод является функцией, возвращает результат выполнения этой функции, иначе 1 Если метод не найден, возвращается 1 и не выдается сообщений об ошибках.


Параметры пробовал передавать и в том и в другом порядке.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #36 - 06. Декабря 2010 :: 07:04
Печать  
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #37 - 06. Декабря 2010 :: 07:22
Печать  
Eprst писал(а) 06. Декабря 2010 :: 07:04:
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052

Объясни, пожалуйста, в чем здесь выигрыш? Чем это лучше обычных привязок реагированием на события?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #38 - 06. Декабря 2010 :: 07:55
Печать  
Да ни в чем, в простоте использования, разве что.
Не нужно все события описывать, используя обычный класс привязок.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #39 - 06. Декабря 2010 :: 07:57
Печать  
Eprst писал(а) 06. Декабря 2010 :: 07:04:
Посмотри класс УправлениеФормой - там реализованы привязки через Перехватчик.
http://www.1cpp.ru/forum/YaBB.pl?num=1278756052
Что-то я не понял, как тамошняя реализация коррелирует с моей проблемой.

На пальцах - суть моей проблемы:
Имеется форма, в которой инициализированы 2 объекта.
Каждый из объектов выступает перехватчиком событий формы.
Соответственно, при инициализации первого: он видит отсутствие текущего перехватчика - значит он после перехвата события, должен передавать вызов в контекст формы.
При инициализации второго: он видит, что назначен перехватчик и запоминает его. Далее, при возникновении события, сначала  его обрабатывает объект №2, в нем мы должны передать обработку на запомненный объект №1, а он уже - в контекст формы.

Вот этого я добиться не могу.
Когда перехватчик на форму только один - все работает.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #40 - 06. Декабря 2010 :: 08:04
Печать  
Что значит как ?
Там через класс перехватчика реализованы привязки формы.
Именно тот же лисапед, что и ты делаешь сейчас.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #41 - 06. Декабря 2010 :: 08:09
Печать  
Блин.
Дело было не в бобине(с).

Разобрался - заработало.

Однако, снова не все так просто - при передачи исполнения в  оригинальный обработчик в форме, получаю сообщение:
Цитата:
Перехватчик::ВыполнитьСобытиеКонтекста - Неверное число параметров у обработчика события <ПриИзмененииРазмераОкна>

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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #42 - 06. Декабря 2010 :: 08:11
Печать  
Eprst писал(а) 06. Декабря 2010 :: 08:04:
Что значит как ?
Там через класс перехватчика реализованы привязки формы.
Именно тот же лисапед, что и ты делаешь сейчас.

В третий раз.
Лисапед был не в реализации перехвата конкретного объекта.
А во взаимосвязи нескольких перехватчиков.

В указанном тобой классе (наборе классов) используется исключительно вызов оригинального события ГК.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #43 - 06. Декабря 2010 :: 08:12
Печать  
Цитата:
ПриИзмененииРазмераОкна


А тебе точно надо перехватывать это событие в классе перехватчика ?

Мот того, не нужен перехват этого события вообще ?
Что за специфические действия обрабатываешь в перехвате этого события ?

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Перехватчик. Для каких событий необходим ручной вызов оригинального?
Ответ #44 - 06. Декабря 2010 :: 08:41
Печать  
Eprst писал(а) 06. Декабря 2010 :: 08:12:
Цитата:
ПриИзмененииРазмераОкна


А тебе точно надо перехватывать это событие в классе перехватчика ?


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