Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Заменить текст модуля контекста (число прочтений - 8524 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #15 - 11. Декабря 2014 :: 17:31
Печать  
Для демонстрации своего замысла
на скорую руку наваял простеньку конфу с 3-мя классами:

- СинглтонГМ
- ВнедрительОбъектаНаФорму
- ОбъектНаФОрме

Коментарии внутри в:

    1) СинглтонГМ::СобытиеГМ_СозданиеКонтекста()

    2) ВнедрительОбъектаНаФорму::Событие_ПослеОткрытия()

Дальше кто хочет может развить эту мысль....
  

basa.7z ( 14 KB | Загрузки )
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #16 - 12. Декабря 2014 :: 16:09
Печать  
kos писал(а) 11. Декабря 2014 :: 10:45:
ПОЯСНЕНИЕ: моя конечная цель (чего ради):
мне нужна переменная(объект) в области видимости конкретного контекста
Именно поэтому нельзя делать "общественную" глобальную переменну для "МойКласс".
Именно поэтому приходится извращаться - в каждую форму тыкать.....
(изначально именно ради этого хотел динамическую замену модулей)

Может я не оригинален: но по крайней мере должно работать.

Считаю задача "динамическая замента текста модуля форм


У меня аналогичная потребность реализована так:

Процедура СобытиеГМ_ПриОткрытии( Конт, фЧтенияНастройки ) Экспорт

...
...

// ----------------
//
Структура = СоздатьОбъект( "Структура" );
Структура.Вставить( "struModule", "" );

fl__ДобавитьКонтекст = 0;                                 // Для того, чтобы отслеживать случай когда не получается выполнить функцию __ДобавитьКонтекст()
                                                          // /пока это не работает для объектов типа "ЖурналРасчетов"/

Попытка                              
     
 Конт.__ДобавитьКонтекст( Структура );
 Конт.struModule = СоздатьОбъект( "Структура" );

 struModule = Конт.struModule;

Исключение
 fl__ДобавитьКонтекст = 1;
 struModule = СоздатьОбъект( "Структура" );
КонецПопытки;
 
// ----------------
// --- После обработки события СобытиеГМ_ПриЗагрузкеФормы нам известны:
//
//     TypeModule       -  Тип объекта /Например: Справочник/
//
//     NameModule       -  Идентификатор объекта /Имя справочника, ... .../
//
//     ИмяФормыДляСпр   -  Ия формы /use только для справочников/
//
//     acUseLayers      -  Использованные слои
//
//     LastUseЗакладка  -  Номер последней использованной закладки формы
//
//     Сохраняем значение этих переменных в контексте модуля
//
struModule.Вставить( "TypeModule",      TypeModule,     1 );
struModule.Вставить( "NameModule",      NameModule,     1 );
struModule.Вставить( "ИмяФормыДляСпр",  ИмяФормыДляСпр, 1 );

acUseLayers = СоздатьОбъект( "АссоциативныйВектор" );

struModule.Вставить( "acUseLayers",     acUseLayers,    1 );

struModule.Вставить( "LastUseЗакладка", 1,              1 );    

if  fl__ДобавитьКонтекст = 1  Then
           
 VpIndex = глacКонтекст.НайтиКлюч(
  ПолныйТипОбъекта,
  1
 );

 if  VpIndex = -1  Then
  глacКонтекст.Добавить(
  struModule,                                             // value
  ПолныйТипОбъекта                                        // Ключ
 );
 endif;
     
endif;                                                    //

То бишь при создании контекста в него добавляется переменная типа "Структура" в которую уже затем помещаю необходимые мне
свойства.

Что имеем?
Любой контекст содержит всего одну добавленную переменную в
которую в любой момент можно добавить сколько угодно потребных свойств /грубо говоря переменных/





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


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #17 - 12. Декабря 2014 :: 18:49
Печать  
vladimirmir2012 писал(а) 12. Декабря 2014 :: 16:09:
...

Конт.__ДобавитьКонтекст( Структура );

...



правильно ли я понял, что
1)
- в модулях ТЕХ форм, где нужно что-то отслеживать
- в конфигураторе (напрямую в текст МД модуля) вписана такая функция ?
2) Далее
- если функция есть - мы что-то с этой формой делаем (ч/з Структуру)?

Код
Выбрать все
// в модуле формы "Конт"
функция _ДобавитьКонтекст(Структура)
 ....
конецФункции 


Если так, то в Вашем случае: это не динамическая замена модуля формы.
т.к. модуль МД был изменен (подготовлен в конфигураторе) заранее.

или этот кусок модуля (функция)
вставляется в модуль формы до компиляции формы?
Если "ДА" - очень интересно: поделитесь КАК ?????? Тоже так хочу.

Если "в рукопашную" - меня тоже так устроило бы, если бы:
- отслеживать нужно избранные формы (менее 5% от всех, скажем)
- конфигурация не сильно менялась бы (без постоянной доработки)

Но без этих "бы", в моем случае:
1) мне лень "копипастить" во все модули (90%) мой "универсальный" кусок
   (или даже добавлять минимальную функцию на 3 строки - слишком много модулей)
2) этот кусок постоянно дорабатывается
3) в глобальник выносить нельзя, т.к. в нем есть переменные
   которые должны быть локальными в контексте формы
   (есть ВК работа которой зависит от того - какя у нее "видимость")
4) При этом оригинальная конфигурация не изменяется
   (по возможности - минимум - только в ПриНачалеРаботыСистемы() )

Поэтому:
- синглтон: генерит промежуточный объект
- промежуточный объект: внедряет АктивХ в форму
- промежуточный объект: уничтожается
- АктивХ на форме теряет связь с "местом рождения"
- АктивХ имеет доступ к контексту своей формы
- доступ к АктивХ из вне: мы знаем что создали на форме
- АктивХ реализует нужный функционал

В частности: "АктивХ/ТабличноеПоле" я использую только потому
что именно его в 77 можно "внедрить".
И использую их совсем не по назначению ....
Просто других мыслей (для внедрения в контекст) не пришло.

P.S. Типа "вирус" на форме   Смех

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


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #18 - 12. Декабря 2014 :: 19:13
Печать  
kos писал(а) 12. Декабря 2014 :: 18:49:
Если так, то в Вашем случае: это не динамическая замена модуля формы.
т.к. модуль МД был изменен (подготовлен в конфигураторе) заранее.

В выше приведенном коде было показано как динамически в контекст
любой формы /при ее создании/, производится добавление переменной, которой нет в текстах модулей.

Что касается динамического добавления процедур и функций,
то у меня в общем то имеется ActiveX, который позволяет в md
изменить текст любого модуля /но это не то, что тебе нужно/.

Если бы эта возможность была реализована /не подмены форм, а
подмены текста/, то мноооого чего "вкусного" можно было бы
сделать.

PS: Этот функционал /на мой взгляд/ крайне важен.

     
        




« Последняя редакция: 15. Декабря 2014 :: 15:10 - vladimirmir2012 »  
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #19 - 12. Декабря 2014 :: 20:23
Печать  
Вот смотри экспромтом набрасываю идею динамического выполнения какой-либо процедуры
или функции в контексте какого-либо модуля:

 -  используем объект "ВыполняемыйМодуль";

 -  этот объект позволит нам присоедить и выполнить в
    контексте какого-то модуля динамически процедуру или функцию
    /КомпилироватьИВыполнитьМодуль/.
    Правильно?
    /по моему это все обеспечивается объектом "ВыполняемыйМодуль"/

 -  Ну а теперь совместим способ динамического создания переменных
    в контексте /которых нет в тексте модуля/ с возможностями,
    обеспечиваемыми объектом "ВыполняемыйМодуль"

 PS: На мой взгляд все должно "срастись".
  
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #20 - 13. Декабря 2014 :: 06:39
Печать  
Как у меня реализована работа с объектом "Прерывание"
-----------------------------------------------------

Добавляем в глобальный модуль

Перем  глMessageClass  Экспорт;                           // == 1 - Вывод диагностических сообщений
^
^-- Если ее установить равной 1, то увидим трассу обработки прерываний /очень полезно/

Процедура ПриНачалеРаботыСистемы()  

...
...

// ----------------
// --- Перехватчик событий /ООП/
//     http://www.1cpp.ru/docum/icpp/html/Hooker.html#id26
//
глПерехватчик = СоздатьОбъект( "Перехватчик" );

глПерехватчик.ПодключитьСобытие_НеобработаннаяОшибка();
глПерехватчик.ПодключитьСобытие_ЗаписьСобытияЖурналаРегистрации();
();

глПерехватчик.СнятьПерехватСобытийГлобальногоМодуля();

глКлассИнициализацияОтладки = СоздатьОбъект( "КлассИнициализацияОтладки" );

...
...

КонецПроцедуры                                             // Процедура ПриНачалеРаботыСистемы()  

В конфигураторе в обработки помещаем три обработки:

defcls, КлассИнициализацияОтладки и КлассПерехватСобытий /см. архив/

Все.
Этот код можно добавить в любую конфигурацию /для обеспечения работы с подсистемой "Прерывание"/

PS: В "КлассПерехватСобытий" конфигуратор будет ругаться на отсутсвие некоторых переменных.
    Просто уберите этот код /он используется для обеспечения сериализации объектов и
    подсистемы "Права"/.
   
    Кстати этот код проверен на многих конфигурациях /не мною разработанных/.

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

events.7z ( 17 KB | Загрузки )
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #21 - 13. Декабря 2014 :: 08:21
Печать  
vladimirmir2012 писал(а) 13. Декабря 2014 :: 06:39:

    Но вот проблема, которую не удалось решить.
    Как в модулях использовать обращение к процедурам и функциям, которые ни где не объявлены?

А вот как.

----------------------------------------
Добавляем в глобальный модуль:

глСервис  Экспорт;                                        // Объект сервисного класса "Сервис"

----------------------------------------
Процедура ПриНачалеРаботыСистемы()  

...
...

глСервис = СоздатьОбъект( "Сервис" );

...
...

----------------------------------------
В текст любомого модуля добавляем:
Перем  Конт;                                              // Контекст

В процедуру Процедура ПослеОткрытия() строку:
 глСервис.АктивныйКонтекст( Конт );

----------------------------------------
Обращение к динамическим процедурам и функциям будет выглядеть так:
 Конт.ИмяПроцедуры( ... );

Теперь конфигуратор не будем ругаться на то, что процедура ИмяПроцедуры()
ни где не объявлена

PS: Можно добиться того, что в тексты модулей программисту не  
     понадобится добавлять какой-либо код.
     Для этого достаточно в обработку КлассПерехватСобытий.ert
     /см. архив events.7z/ добавить то о чем 10 строками сказано
     выше /это тривиально просто/. Если хотите, то запощу заново
     подправленный КлассПерехватСобытий.ert.
     
« Последняя редакция: 15. Декабря 2014 :: 15:12 - vladimirmir2012 »  
Наверх
 
IP записан
 
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
Re: Заменить текст модуля контекста
Ответ #22 - 15. Декабря 2014 :: 01:25
Печать  
vladimirmir2012 писал(а) 13. Декабря 2014 :: 08:21:
.....
     Больше распинаться на эту тему не буду.
     Почему?
     Разговоры сильно расхолаживают ...


Не понял по поводу "все будет бесплатно" и "исходники не дам"
Так как "оно" будет-то? И будет ли?

Можно хоть что-нибудь увидеть?
Ссылку - типа "вот оно как работает"

А то в разных топиках на этом форуме (да и не только)
от Вас - одни только слова по поводу Web77.......

Уж простите за прямоту...

P.S. С идеей "Open 1C" носились многие, да вот не вышло ни у кого.
Бороться с 1С - бессмысленно.
Создать что-то свое в довесок к 1С - вот тогда (возможно) это будет жить.
Причем а-ля GPL, с формумом, вики и т.д.
Глядишь - и заинтересованные программеры появятся....
А вот тогда можно зарабатывать: на услугах внедрения (а не на софте).....
Чего исходники скрывать-то ?
Ведь кишки 1С77 давно известны, просто люди:
- либо уже плотно сидят на снеговике (нас и так не плохо кормят)
- либо времени нет заняться (проектно) этой темой....

Заинтересуй людей - глядишь кто-то да и подтянется....
И времени у самого будет побольше

А вообще - для этого нужен отдельный топик, а не постить в чужую ветку.....
(как бэ "смешались кони люди" - не по сабжу ведь...)

Хотя тема Web77 - не спорю - интересная,
Но: отдельным топиком, пож.

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


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Заменить текст модуля контекста
Ответ #23 - 15. Декабря 2014 :: 15:09
Печать  
kos писал(а) 15. Декабря 2014 :: 01:25:
... а не постить в чужую ветку.....

Перенес в другую ветку /извиняюсь/.
По предложенному способу работы с динамическими процедурами и функциями что скажешь?

PS: Замена текста модуля контекста насколько понимаю еще ни кем не реализована ...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Заменить текст модуля контекста
Ответ #24 - 16. Декабря 2014 :: 08:01
Печать  
Давно реализована в turbomd
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать