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



Сообщений: 51
Местоположение: Волжский Волгоградской обл.
Зарегистрирован: 27. Августа 2007
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #15 - 11. Октября 2007 :: 17:06
Печать  
Arta писал(а) 11. Октября 2007 :: 12:45:
А вообще - правильной дорогой идете товарисч! Улыбка
Как понравится - за уши не оттянешь от Перехатчика Улыбка

Да это-то понятно. Вот только пугают пока некоторые вещи - типа при переходе на новые релизы перестает работать то, что работало, но начинает работать то, что не работало раньше.
Пока "нервно курим" и решаем что лучше - неудобно но стабильно работает или удобно но падает. Нерешительный
  
Наверх
wwwICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #16 - 11. Октября 2007 :: 17:31
Печать  
Настороженность понятна.
Но на данном этапе функционал Перехватчика стабилен, за исключением пары извращенных случаев его использования (привет, Артур  Язык )
1. У меня ночник в боевой базе. Проблем НЕТ!
2. "Перестает работать то, что работало" - давно такого не припомню, за исключением последних событий с формексом.
3. Почти все охвачено тестами. Ребята хорошо все организовали.
4. Большой минус - отсутствие примеров использования. Много чего можно почерпнуть с спец.конфе что выложена Артуром в репозитарии.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #17 - 15. Октября 2007 :: 10:22
Печать  
Arta писал(а) 11. Октября 2007 :: 17:31:
Настороженность понятна.
Но на данном этапе функционал Перехватчика стабилен, за исключением пары извращенных случаев его использования (привет, Артур  Язык )
1. У меня ночник в боевой базе. Проблем НЕТ!
2. "Перестает работать то, что работало" - давно такого не припомню, за исключением последних событий с формексом.
3. Почти все охвачено тестами. Ребята хорошо все организовали.
4. Большой минус - отсутствие примеров использования. Много чего можно почерпнуть с спец.конфе что выложена Артуром в репозитарии.

+1 по всем пунктам.
Над примерами поработаю Улыбка

ЗЫ привет, привет  Язык
  

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: Перехватчик. У кого как?
Ответ #18 - 16. Октября 2007 :: 12:32
Печать  
Артуру огромное спасибо за Перехватчика!
Просто ураганная вещь!
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #19 - 16. Октября 2007 :: 13:17
Печать  
+1

Ну наконец-то народ вкусил сей плод Улыбка

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #20 - 17. Октября 2007 :: 05:52
Печать  
А ты думал!
Вот если б уважаемый Артур еще умудрился перенаправить в Перехватчик:
Записать()
Провести()
Удалить()
Установить()
Тоди было бы вообще ЖИРНО!
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #21 - 17. Октября 2007 :: 08:54
Печать  
Остается только ждать  Улыбка
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #22 - 08. Ноября 2007 :: 06:20
Печать  
Arta писал(а) 11. Октября 2007 :: 12:41:
Ох...
Если у тебя один класс на все формы, то в классе перехваченного глобальника (он уже у тебя есть) делаешь:
<....>
и делаешь класс "ПерехватчикиСобытийФормы", в котором делаешь все свои безобразия. Хоть ПриОткрытии перехватывай, хоть ПриНажатииКлавиатуры...


Вот примерно так я планировал сделать, но только не один класс на все формы а вообще один ОКОП на все формы, висит себе в глобальной переменной, да подглядывает за всеми. Но задумался вот над чем :

Обормотчики событий получают только стандартные параметры события, контекста они не получают.

Таким образом, идея с одним классом ещё реализуема, а с одним объектом - нет.

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


В правильном направлении движусь?
  
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #23 - 08. Ноября 2007 :: 06:53
Печать  
Чево-то уважаемый я совсем не въехал.
Зачем скажите вам иметь переменную?
Я же несколькими постами выше описал как все делается.
Извиняюсь не тута выкладывал.
Один обработчик Форм для всех!
И ненадо его глобально запоминать.

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #24 - 08. Ноября 2007 :: 07:00
Печать  
Пот какой у меня порядок подключения перехватчика:
1. ГМ

ПриНачалеРаботыСистемы()
....
                 УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
                 Если УправлениеНастройками.Получить("EnableDebugging")=0 Тогда // это на всекий случай если включить отладку по совету Артура т.к. отладку с перехватчиком включать незя.
                       глПерехватчикСобытий=СоздатьОбъект("ПерехватГМ");
                       глПерехватчикСобытий.ВключитьПерехватСобытий();
                 КонецЕсли;
Теперь два класса:
ПерехватГМ::
Перем _Перехватчик;

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

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


Функция СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт
     Если ПустоеЗначение(Конт) = 0 Тогда
           ПерехватчикСобытий = _Перехватчик.ПолучитьПерехватчикСобытийГК(Конт);
           Если ПустоеЗначение(ПерехватчикСобытий) = 1 Тогда
                 ПерехватчикСобытий = СоздатьОбъект("Перехват"); //твой класс перехвата всех форм
                 ПерехватчикСобытий.Инициализация(Конт);
           КонецЕсли;
     КонецЕсли;
     Возврат 1; // Можно открывать форму
КонецФункции

Функция СобытиеГМ_ВводНаОсновании(ДокПолучатель,ДокИсточник) Экспорт
     Перем ДокПодч;
     Если ДокПолучатель.Вид()="Чек" Тогда
           Возврат 1;
     КонецЕсли;
     Сообщить("Ввод на основании");
     ДокПодч=глВернутьПодчиненного(ДокПолучатель,ДокИсточник);
     Если ПустоеЗначение(ДокПодч)=0 Тогда
           Сообщить(ДокПодч);
           Если ДокПодч.ПометкаУдаления()=1 Тогда
                 Возврат 0;
           КонецЕсли;
           _Конт="";
           ОткрытьФорму(ДокПодч.ТекущийДокумент(),_Конт);
           _Конт.ВводНаОсновании(ДокИсточник);
           _Конт.Форма.Обновить();
           Возврат 0;
     КонецЕсли;
     Возврат 1;
КонецФункции      // ВводНаОсновании

и класс перехвата ВСЕХ!!!!!! форм

Перехват::
Перем _Перехватчик;
Перем _КонтФормы;
Перем рФорма;
Перем СпНеИзменять;

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

Функция Событие_ПриЗаписи(Флаг) Экспорт
     рФорма.УстановитьФорму(_КонтФормы.Форма);
     тип=рФорма.ТипОбъекта();
     Если тип="Документ" Тогда
           глВнесеныИзменения(_КонтФормы);
           к);
     ИначеЕсли тип="Справочник" Тогда
           Вид=_КонтФормы.Вид();
           Если СпНеИзменять.Принадлежит(Вид)=0 Тогда
                 ПриИзмененииОбъектаМОД(_КонтФормы, _КонтФормы.ТекущийЭлемент(), РабочаяДата());
           КонецЕсли;
     КонецЕсли;
     Возврат _Перехватчик.ВыполнитьОригинальноеСобытиеГК(_КонтФормы,"ПриЗаписи");
КонецФункции      // ПриЗактытии



Функция Событие_ПриПереносеЭлементаВДругуюГруппу(Спр, Группа) Экспорт
     Вид=_КонтФормы.Вид();
     Если СпНеИзменять.Принадлежит(Вид)=0 Тогда
           Если ПустоеЗначение(Группа)=0 Тогда
                 ПриИзмененииОбъектаМОД(Группа, Группа.ТекущийЭлемент(), РабочаяДата());
           КонецЕсли;
           ПриИзмененииОбъектаМОД(_КонтФормы, Спр.ТекущийЭлемент(), РабочаяДата());
     КонецЕсли;
     Возврат 1;
КонецФункции      // Событие_ПриПереносеЭлементаВДругуюГруппу(Спр, Группа)


СпНеИзменять=СоздатьОбъект("СписокЗначений");
СпНеИзменять.ДобавитьЗначение("ПериферийныеБазы");
СпНеИзменять.ДобавитьЗначение("ПравилаЗагрузки");
СпНеИзменять.ДобавитьЗначение("ПравилаВыгрузки");

Вот и все.
А дальше уже извращается в этих классах как тебе хочется.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #25 - 08. Ноября 2007 :: 07:43
Печать  
На ВводеНового тоже надо ставить перехват.
  
Наверх
 
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #26 - 08. Ноября 2007 :: 09:44
Печать  
varelchik писал(а) 08. Ноября 2007 :: 06:53:
Один обработчик Форм для всех!


Ты имел ввиду Один Класс обрабатывающий все формы, я имел ввиду один объект этого класса. Идея с одним объектом - лажовая. Забыли.

varelchik писал(а) 08. Ноября 2007 :: 06:53:
И ненадо его глобально запоминать.


Как я понял,

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

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

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


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #27 - 08. Ноября 2007 :: 09:49
Печать  
Сделал. Однако вот такой ошибка при закрытии конфы.

1С 7.70.025
1С++ 2.5.0.4 Nightly build 2007-11-08
FormEx 2.0.5.78
Больше ни чего нет, конфа тестовая, перехватываю только ПриОткрытии.

  

hooker_fehler.PNG ( 16 KB | Загрузки )
hooker_fehler.PNG
Наверх
ICQ  
IP записан
 
dnp
Senior Member
****
Отсутствует


.

Сообщений: 479
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Перехватчик. У кого как?
Ответ #28 - 08. Ноября 2007 :: 11:43
Печать  
Может я что-то делаю неправильно?
Вот тест:

ЗЫ: В этом тесте вообще всё срезал, оставил только сам перехват глобальника...
  

hookz.rar ( 12 KB | Загрузки )
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Перехватчик. У кого как?
Ответ #29 - 08. Ноября 2007 :: 12:23
Печать  
убери деструктор()  из класса и все.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 5
ОтправитьПечать