Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) События формы и КОП-наследник группового контекста (число прочтений - 15644 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
События формы и КОП-наследник группового контекста
18. Августа 2006 :: 14:55
Печать  
Народ, есть мысль добавить функционал перехвата в КОП-е, наследнике группового контекста, события формы контекста-предка.

Я вижу это так - либо
1) безусловный перехват любых методов базового контекста
Т.е. если в классе КОП-е есть метод с таким же названием, как в форме, будет вызван именно этот метод/событие, а не метод/событие формы.


Если в КОП метод ПриЗакрытии, будет вызван он при закрытии формы
Если в КОП и в форме есть метод МетодФормы, будет вызван метод из КОП

либо

2) в конструкторе происходит подписка на те методы/события, которые КОП будет перехватывать.
Т.е. Сам().ПерехватитьМетодГК(НаименованиеМетодаГК, НаименованиеСвоегоМетода);

Причем для обоих случаев можно обеспечить вызов и из 1С и из других модулей/контекстов.

А непосредственно к методу формы можно будет обратиться только из самого КОП
вызовом База.НужныйМетод() или База.НужноеСобытие()


Жду предложений

PS изучил исходники и ИМХО это довольно просто сделать с помощью средств ТурбоБЛ.
  

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: События формы и КОП-наследник группового конте
Ответ #1 - 18. Августа 2006 :: 16:40
Печать  
Прежде всего хочется сказать, что этого очень не хватает...


По сути, удобней был бы первый вариант, но как будет это работать при наследовани...

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




P.S. Вопрос снят, переклинило. Разговор идет про наследование от ГрупповогоКонтекста же...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #2 - 18. Августа 2006 :: 17:10
Печать  
Это было-бы здорово.
Мне больше нравится 1-й вариант.
только может сделать после вызова метода КОП метода ГК (если он есть).
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #3 - 19. Августа 2006 :: 06:39
Печать  
steban писал(а) 18. Августа 2006 :: 17:10:
Мне больше нравится 1-й вариант.
только может сделать после вызова метода КОП метода ГК (если он есть).

Не совсем понял, о чем ты говоришь Печаль
После вызова метода КОП нужно вызывать метод ГК? Это необязательно.
ИМХО наиболее гибкий вариант - когда КОП сам определяет, в какой момент вызывать "родной" метод ГК и вызывать ли его вообще.

Но здесь возникает вопрос наследования в следующих подклассах -
например, вполне возможна иерархия КОПДокНакладная - КОПДок - КОПФорма - ГрупповойКонтекст
Если использовать метод 1, в любом случае будет сначала будет вызываться метод из верхнего класса КОПДокНакладная, а уже затем нужно будет вызывать КОПДок.НужныйМетод и т.д.
Т.е. нужно предусмотреть возможность такой сложной иерархии, а не только простой связки КОПДокНакладная - ГрупповойКонтекст.
ЗЫ хотя вроде бы также не должно быть слишком сложно.

Мне лично также нравится 1 вариант.

Но есть еще один подводный камень - для обоих вариантов  возможна довольно неприятная ситуация при использовании типовых конфигураций.
В глоб. методе ПослеОткрытия(Конт) от формы дока наследуется объект КОПДок, все это происходит незаметно для формы документа и может быть запрятано далеко в классах. Далее все вызовы идут через КОП, т.е. фактически весь функционал реализован именно там.
Далее производится обновление типовой конфы, и, например, меняется функционал типовой формы документа, но глоб. метод ПослеОткрытия не меняется, функционала КОП-а также не меняется (например, вполне можно об этом забыть!)
Вуаля, конфигурация новая, а функционал формы дока старый. И ошибку можно искать довольно долго, если не знать об этой особенности 1С++ Улыбка

Лично я готов с этим мириться, мне и нужен сабжевый функционал, чтобы легче было обновлять типовые конфы.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: События формы и КОП-наследник группового конте
Ответ #4 - 19. Августа 2006 :: 07:58
Печать  
Погодите, не так быстро.

Перехват методов/событий. Что такое перехват событий, я еще понимаю. А что такое перехват методов?

Варианты перехвата. Как вы собираетесь перехватывать события? Нужно будет написать примерно такой код:
Код
Выбрать все
КОПДок=СоздатьОбъект("КОПДок");
КОПДок.ЗаменитьБазовыйОбъект(Контекст); 



Перехват произойдет при ЗаменитьБазовыйОбъект()? Почему бы тогда не сделать два отдельных метода?

Код
Выбрать все
КОПДок.ПерехватитьВсеСобытия(Контекст);
КОПДок.ПерехватитьСобытие(Контекст, "ПриЗаписи"); 



В принципе, возможно, стоит сделать автоперехват в ЗаменитьБазовыйОбъект(), но только по настройке.

А в каком контексте будет храниться созданный объект КОПДок? И когда он будет уничтожаться?

Может быть кто-нибудь напишет 3-5 строк кода, как бы он хотел использовать эту возможность? Тогда все станет более понятно и ему и другим.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #5 - 19. Августа 2006 :: 08:19
Печать  
Можно сделать любой из 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 записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #6 - 19. Августа 2006 :: 09:58
Печать  
Я за второй вариант. За подписку на перехваты. За тот пример, который предложил sedmin.

Причин несколько:
1. В модуле самой формы остается явный след о том, что в ней перехвачены какие-то предопределенные события. Количество потенциальных граблей резко сокращается.
2. В таком случае, как мне кажется, можно вообще не наследовать класс-перехватчик событий от группового контекста. Все равно Контекст мы передаем в качестве параметра метода .ПерехватитьСобытие() - пусть будет агрегат.
3. Агрегирование вместо наследования упрощает диагностику закрытой формы. Ибо решается внутри класса простой проверкой типа значения.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #7 - 19. Августа 2006 :: 10:05
Печать  
fez писал(а) 19. Августа 2006 :: 09:58:
Я за второй вариант. За подписку на перехваты. За тот пример, который предложил sedmin.

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

Неа, подобные грабли ты никак не обойдешь. Они возможны в любом случае.
Я же специально привел пример с глобальным методом ПослеОткрытия. И в итоге форма может ничего не знать о том, что ее методы/события перехватывают.
Как уже писал, я готов на это пойти, мне такой способ наиболее нравится, резко упрощается изменение форм в типовых конфигурациях.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #8 - 19. Августа 2006 :: 10:50
Печать  
Тогда надо реализовать оба варианта.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #9 - 28. Августа 2006 :: 09:38
Печать  
В общем, удалось получить нужный результат по перехвату событий группового контекста, а также перехвата событий формы от FormEx !!
Исполняем примерный код по перехвату событий (например, в ПриОТкрытии или ПослеОткрытия в форме или ПослеОткрытия даже в глобальнике)
Код
Выбрать все
КОП = СоздатьОбъект("ЛюбойКОП");
// возможно, этот вызов будет сделан по-другому
КОП.ПерехватитьСобытияГК(КонтекстФормы);
 


В КОП, например, есть функция (обязательно объявленная с  Экспорт)
Код
Выбрать все
Процедура ПриНачалеВыбораЗначения(ИдентификаторЭлемента, Флаг) Экспорт
	Сообщить("КОП::ПриНачалеВыбораЗначения");
КонецПроцедуры
 


Независимо от наличия в форме контекста процедуры "ПриНачалеВыбораЗначения" (т.е. в форме этой процедуры может и не быть) при работе в форме и начале выбора какого-нибудь значения выходит нужное сообщение
Цитата:
КОП::ПриНачалеВыбораЗначения


Возможно перехватить любые события, направляемые в форму 1С или ФормЕкс.

Данный функционал будет включен в ночную сборку после выпуска релиза 2.0.3 (что произойдет сегодня-завтра)

ЗЫ для нетерпеливых Улыбка могу выложить тестовую сборку 1cpp.dll где описанный перехват можно пощупать руками Улыбка
  

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: События формы и КОП-наследник группового конте
Ответ #10 - 28. Августа 2006 :: 10:11
Печать  
Добавлю, что реализация несколько отличается от того замысла, что изложен в начале ветки.
Сейчас перехватываются только события формы, которые инициируются самой 1С или FormEx, а не любые произвольные методы модуля формы.
  

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: События формы и КОП-наследник группового конте
Ответ #11 - 28. Августа 2006 :: 10:16
Печать  
И еще: КОП-перехватчик не обязательно должен быть наследником от ГрупповогоКонтекста !
  

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: События формы и КОП-наследник группового конте
Ответ #12 - 28. Августа 2006 :: 11:45
Печать  
Меня прет!  Смех


Наконец-то! Большущее спасибо!
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: События формы и КОП-наследник группового конте
Ответ #13 - 01. Сентября 2006 :: 10:44
Печать  
Данный функционал в описанном ранее виде с сегодняшнего дня включен в ночную сборку релиза 2.5.

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

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: События формы и КОП-наследник группового конте
Ответ #14 - 02. Сентября 2006 :: 12:00
Печать  
artbear писал(а) 28. Августа 2006 :: 09:38:
Код
Выбрать все
КОП = СоздатьОбъект("ЛюбойКОП");
// возможно, этот вызов будет сделан по-другому
КОП.ПерехватитьСобытияГК(КонтекстФормы);
 





Артур, не срабатывает на 2.5.0, типа "Поле агрегатного объекта не обнаружено". Где грабли?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать