Список форумов Акцент Акцент
официальный форум разработчика программы Акцент
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Дополнительный модуль для формы.

 
Начать новую тему   Ответить на тему    Список форумов Акцент -> Прикладные решения от ЧП Казначей
Предыдущая тема :: Следующая тема  
Автор Сообщение
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Пн Авг 30, 2010 10:50 am    Заголовок сообщения: Дополнительный модуль для формы. Ответить с цитатой

Мне показалось, или инструкция
Код:
'#include "module1.avb"
не работает в тексте дополнительного модуля формы?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
treasurer



Зарегистрирован: 10.03.2005
Сообщения: 553

СообщениеДобавлено: Пн Авг 30, 2010 4:24 pm    Заголовок сообщения: Re: Дополнительный модуль для формы. Ответить с цитатой

nikman писал(а):
Мне показалось, или инструкция
Код:
'#include "module1.avb"
не работает в тексте дополнительного модуля формы?


Нет, тебе не показалось. AddScriptFragment работает уже после того, как инструкцуии #include заменены на тексты модулей.

Но теоретически я могу перед добавлением фрагмента сделать в нем такую же замену. Если получится, включу в обновления.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Чт Мар 24, 2011 5:36 pm    Заголовок сообщения: Ответить с цитатой

Можно дополнительный модуль подключать раньше чем в Form_OnLoad ?
В FormsInit ?
Иногда хочется модифицировать функцию Form_OnLoad.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
treasurer



Зарегистрирован: 10.03.2005
Сообщения: 553

СообщениеДобавлено: Пт Мар 25, 2011 9:46 am    Заголовок сообщения: Ответить с цитатой

nikman писал(а):
Можно дополнительный модуль подключать раньше чем в Form_OnLoad ?
В FormsInit ?
Иногда хочется модифицировать функцию Form_OnLoad.


Я попробую переставить AddScriptFragment в FormsInit.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
treasurer



Зарегистрирован: 10.03.2005
Сообщения: 553

СообщениеДобавлено: Пн Мар 28, 2011 9:31 am    Заголовок сообщения: Ответить с цитатой

treasurer писал(а):
Я попробую переставить AddScriptFragment в FormsInit.


До загрузки формы AddScriptFragment не работает. Так что ничего не выйдет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
treasurer



Зарегистрирован: 10.03.2005
Сообщения: 553

СообщениеДобавлено: Чт Апр 07, 2011 11:25 am    Заголовок сообщения: Re: Дополнительный модуль для формы. Ответить с цитатой

treasurer писал(а):
Но теоретически я могу перед добавлением фрагмента сделать в нем такую же замену. Если получится, включу в обновления.


Включил в 60 обновление.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Ср Янв 11, 2012 1:25 pm    Заголовок сообщения: Ответить с цитатой

Большая проблема обновлений, в том что приходится их сопровождать слишком часто.
Т.е. многие доработки перестают корректно работать после обновления решения.

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

Очень помогают дополнительные модули.
Но проблема доп. модуля в том, что чтобы что-то добавить
в стандартные функции типа "Form_BeforePrint",
приходится копировать весь текст этой функции в доп. модуль.
А эти функции почти всегда меняются вместе с изменениями самой формы.
В результате приходится менять доп. модуль также часто,
как если бы я менял программу самой формы.

В итоге доп. модуль теряет главную часть своего смысла --
уйти от необходимости вручную сопровождать обновления.

Чертовски хочется иметь функцию:

AddTextToSub(<BegEnd>, <SubName>, <Text>)

где:
<BegEnd> - логическое: начало или конец
<SubName> - название процедуры или функции
<Text> - произвольный текст

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

Пример вызова:

AddTextToSub(True, "Form_BeforeRecalc", "MyBeforeRecalc")

В результате вместо оригинальной процедуры:
Код:
Sub Form_BeforeRecalc(ByRef Cancel)
  <текст процедуры>
End Sub


будет появляться:
Код:
Sub Form_BeforeRecalc(ByRef Cancel)
  <текст процедуры>
  MyBeforeRecalc
End Sub


Я с радостью напишу эту функцию сам и передам Вадиму, чтобы затем она попала в Казначей.

А если еще потом вставить нечто вроде доп. модуля для
файла "Forms.avb" -- будет просто невероятно, сказочно здорово.
И это по-моему вполне реально. Можно легко вставить такую обработку в модуле "Workarea.avb".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Ср Янв 11, 2012 1:52 pm    Заголовок сообщения: Ответить с цитатой

nikman писал(а):
Большая проблема обновлений, в том что приходится их сопровождать слишком часто.
Т.е. многие доработки перестают корректно работать после обновления решения.

Простыми модулями не обойдешься. Нужно менять весь код формы. Так, чтобы там были только обработчики событий. А весь остальной код "лежал" в внешних модулях. Разработчик "подписывает" свой модуль на определенные события по типу того, как я показывал на последнем семинаре.

вот пример "подписки" на события в workareа

Код:
<Workarea>
   <OnProperties>
   </OnProperties>
   <OnLoad>
      <ST7 module = "ST74_Workarea.avb" proc = "ST74_OnLoad" />
   </OnLoad>
   <AfterCreate>
   </AfterCreate>


такой подходи позволяет "урегулировать" конфликт между разными обработчиками одного события и "отвязать" код от формы.
Через XML можно описать как события формы, так и для каждого контрола (при желании).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Ср Янв 11, 2012 3:42 pm    Заголовок сообщения: Ответить с цитатой

olimp писал(а):

вот пример "подписки" на события в workareа

Код:
<Workarea>
   <OnProperties>
   </OnProperties>
   <OnLoad>
      <ST7>
   </OnLoad>
   <AfterCreate>
   </AfterCreate>


такой подходи позволяет "урегулировать" конфликт между разными обработчиками одного события и "отвязать" код от формы.
Через XML можно описать как события формы, так и для каждого контрола (при желании).

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

Я бы сделал делегат обработчика:[сode]EventProcessor(ByVal op, ByVal frm, ByVal ctx)[/code]
а коде формы генерил обработку.
Код:

event(i).Sort ' Sort handlers by it's order
For j = 1 to event(Form, i).count
with event(Form, i).Item(J)
       if ctx.continue and .ShouldRun(op, Form, ctx) then .execute(op, Form.ctx) 'Run processor(j)
ENd With
if ctx.hasErrors then msg.showErrors(ctx)
Next

Полный список event можно генерить в Workarea.OnLoad, а в Form.OnLoad получать интересующие нас event-ы

Как-то так.....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Ср Янв 11, 2012 3:53 pm    Заголовок сообщения: Ответить с цитатой

AllexL писал(а):

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

Давай не будем говорить о многослойности Smile Ее тут нет априори, да и не нужно, скорее всего.

Никто не мешает цеплять несколько обработчиков на одно событие. При его возникновении они последовательно вызываются. Кто первый, тот и прав, т.е. может отдать дальше обработку, а может и запретить. Может и спорно, но так сделано Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Ср Янв 11, 2012 4:01 pm    Заголовок сообщения: Ответить с цитатой

olimp писал(а):

Давай не будем говорить о многослойности Smile Ее тут нет априори, да и не нужно, скорее всего.

Чистый бухучет - ведь не предел мечтаний? Э-э-э-эх Rolling Eyes, помечтать даже нельзя
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
treasurer



Зарегистрирован: 10.03.2005
Сообщения: 553

СообщениеДобавлено: Чт Янв 12, 2012 3:58 pm    Заголовок сообщения: Ответить с цитатой

nikman писал(а):

AddTextToSub(True, "Form_BeforeRecalc", "MyBeforeRecalc")

Я с радостью напишу эту функцию сам и передам Вадиму, чтобы затем она попала в Казначей.


Мне идея нравится. Если хочешь, напиши функцию.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Чт Фев 09, 2012 2:29 am    Заголовок сообщения: Ответить с цитатой

Вот, написал.
Оказалось довольно просто реализовать.
Хотя эта простота наложила незначительные ограничения:
В объявлении процедур между "Sub" и "SubName" должен быть только 1 пробел.
Вызов AddTextToSub должен быть только в одну строку.

Сейчас думаю, как направить такой же функционал на сам модуль "Forms.avb"
Тогда будет вообще идеально.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Чт Фев 09, 2012 10:43 am    Заголовок сообщения: Ответить с цитатой

nikman писал(а):
Вот, написал.
Оказалось довольно просто реализовать.
Хотя эта простота наложила незначительные ограничения:
В объявлении процедур между "Sub" и "SubName" должен быть только 1 пробел.
Вызов AddTextToSub должен быть только в одну строку.

Сейчас думаю, как направить такой же функционал на сам модуль "Forms.avb"
Тогда будет вообще идеально.


Гораздо "гигиеничнее" и, что немаловажно, проще вызывать сторонние процедуры по RunModule, описав соглашение о связях в документации.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Вт Фев 14, 2012 5:17 am    Заголовок сообщения: Ответить с цитатой

Итак, на текущий момент вот что получилось.

1. В любой модуль (например в "Forms.avb") можно программно добавлять свою инструкцию типа #include "myForms.avb"
Для этого в рабочий модуль добавляем:
Код:
'#include "eAddText.avb"
...
Sub Workarea_OnLoad

   TreasurerOnLoad
   AddInclude "Forms.avb", "myForms.avb"

End Sub

2. В процедуры и функции любого модуля можно вставлять свою строку.
Причем в любое место.
Для этого в рабочем модуле надо вставить инструкцию типа:
Код:
'#include "eAddText.avb"
...
Sub Workarea_OnLoad

   TreasurerOnLoad

   AddTextToFileSub "Forms.avb", "FormsOnLoad", "Form.AddScriptFragment Script", True, "TranslateAdd Script"

End Sub
Которая в модуль "Forms.avb"
в его процедуру "FormsOnLoad"
перед строкой "Forms.AddScriptFragment Script"
вставит строку "TranslateAdd Script"

3. Из доп. модуля в процедуры и функции скрипта формы можно добавлять свои строки.
По аналогии с п. 2 только синтаксис чуть проще, например:
Код:
AddTextToSub "Form_OnBarClick", "End Sub", True, "MsgBox ""ok"" "
в процедуру "Form_OnBarClick"
перед строкой "End Sub"
вставит строку "MsgBox "ok" "

п.1 и п.2 позволили мне теперь независимо от Вадима реализовать п.3., о котором шла речь изначально.
Ну и собственно пожелание полностью реализовано. Smile
Без необходимости дорабатывать Казначей.

20.02.2012.
Весь функционал в одном файле "eAddText.avb"
Совсем отказался от принципа "вставить в начало или в конец".
Теперь вставляется до или после ключевого слова.
Например перед инструкцией "Recalc".

03.03.2012
Добавил опцию для замены любой строки на собственную.
Добавил функцию для комментирования любой строки.
Добавил регистронезависимость в поиске.

Ох, сказочная штука получилась.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Акцент -> Прикладные решения от ЧП Казначей Часовой пояс: GMT + 2
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group