Должен немного повинится… Был занять важной, и столь же
нудной работой, которая совершенно не позволяла выкроить даже те несущественные
часы, которые необходимы на выпуск рассылки.
С другой стороны, я был немного обескуражен, обнаружив
проблему с лецензированием компонента, который используется для организацииработы с таблицам в приложениях,
которые создает наш генератор кода. Эта проблема проявляется только в процессе
генерации исходного кода и не так сильно бросается в глаза.
Собственно поразила меня не проблема, а именно то, что она
обнаружилась при развертывании среды разработки на «голом» компьютере. А так и
происходит, если кто-то пытается начать использовать нашу среду разработки по
ее прямому назначению.Из того, что
никто об этом не спросил и не сообщил, я делаю один простой вывод: НИКТО И
НЕПЫТАЕТСЯ ИСПОЛЬЗОВАТЬ СРЕДУ
РАЗРАБОТКИ. После понимания этого, а произошло это практически сразу после
предыдущего выпуска, я не перестаю удивляться не только тому, что вы, мои
дорогие, читаете мои рассылки, но и тому, что количество подписчиков продолжает
расти!!!
Интересная картина получается…
Для начала скажу, как справится с проблемой лицензирования.
Достаточно сходить на сайт ComponentSource взять оттуда пробную
версию Janus GridEx
поставить этот компонент. По крайней мере, на 45 дней у Вас проблем с
генерацией кода не будет. Прямая ссылка дана ниже.
Теперь перейдемк
основной теме выпуска - сегодня мы поговорим о декорировании документа.
Декорирование документа.
Все согласятся, что глупо предполагать, что, только описав
структуру документа, мы сразу получим, именно то, что нам видится во снах и
мечтается за чашкой кофе.
Привожу пример. Раздел «связи» - фактически он содержит
ссылки на другие документы. Каждая связь имеет нагрузку, т.е. не только ссылка
на документ, но еще и тип ссылки. Хотя можно придумать еще много полей, которые
можно было бы туда добавить. Ну например, кто установил ссылку и когда он это
сделал. Короче говоря, когда мы создаем запись в этом разделе у нас есть повод
показать форму редактирования и в ней задать все нужные поля. В остальных
случаях, нам в 95% случаях эта форма редактирования не понадобится. Нам надо
просто сразу открыть тот документ, который связан с этой строкой и все. Даже и
не очень правильно будет, если у нас будет возможность менять ссылку (указывать
на другой документ), хотя лучше эту возможность оставить.
Исключение лишних операций я и называю ДЕКОРИРОВАНИЕМ. Очень
часто встречаются ситуации, когда при создании строки в разделе мы вообщене хотим показывать форму редактирования. Ну
не нужна она нам.Например, мы знаем,
что строка некоторого раздела, это фактически ссылка на новый документ, другого
типа. И все редактирование мы как бы переносим на этот новый документ. Ну может
быть еще какие-то поля по умолчанию прописываем. Того же автора или дату…
Пример такого взаимодействия нескольких документов можно
найти в реализации документа «Клиент» из нашего примера. Там в разделах
«Контактные лица» и «Отчеты» можно найти пример именно такого декорирования. Из
строки мы сразу перескакиваем в соответствующий связный документ.
Еще одно замечание к этому вопросу. Документ можно сделать
несамостоятельным. Иначе кто-то мог бы просто удалить документ, который
фактически является логическим расширением раздела другого документа, а это не
так хорошо. Фактически, я говорю о механизме каскадного удаления связных
документов. Делается это так. Документ –родитель имеет раздел, будем называть
его раздел связи, строка этого раздела имеет идентификатор. Подчиненный
документ привязывается к этой строке при помощи вызова функции MTZSession.SetOwnerв качестве параметра используетсяпара значений – название раздела и идентификатор строки из
раздела связи.После вызова этой
функции несколько меняется алгоритм удаления документа. Он игнорирует команду
удаления, пока существует строка в разделе связи. И наоборот, при удалении
строки из раздела связи автоматически удаляются все документы, которые связаны
этой строкой. Это еще один элемент декорирования.
Собственно их не так и много:
- значения по умолчанию
- подмены алгоритма создания строки
- подмена (расширение) алгоритмов открытия, удаления и
редактирования
- связывание документов
- управление видимостью
- режим «только чтение»
Если бы я сказал, что все эти проблемы надо будет решать
самостоятельно, копаясь в исходном коде, то радость от такой среды разработки
была бы, минимальной.
Нет конечно, многое можно сделать уже на стадии описания
модели, но уже сейчас можно оставить иллюзии по поводу того, что не придется
разбираться с объектными моделями.
Пора готовиться к программированию…
Для начала разберемся с разделом «Связи».
Прежде все надо сказать, что в описании модели системы есть
специализированный раздел – «Методы и процедуры». В этом разделе фактически
описан набор блоков кода – процедур, на которые генератор кода должен
рассчитывать, и которые он включает в исходные тексты при генерации.
Рассмотрим Процедуру, которая называется: VBOpenRef – открыть документ
У нее есть два параметра:
ID – идентификатор
документа
StartMode –
режим открытия документа
И реализация для интерфейсной части:
on error
resume next
If ID <> "" Then
Dim Obj
As Object
Set Obj
= item.Manager.GetInstanceObject(ID)
If Not Obj
Is Nothing Then
Dim objGui
As Object
Set objGui
=item.Manager.GetInstanceGUI(Obj.ID)
If objGui
Is Nothing Then
Exit Sub
objGui.Show
StartMode & "", Obj
Set objGui
= Nothing
End If
End If
Реализация очень простая, и рассчитана на то, что метод
будет вставлен генератором в контекст, где Item указывает на объектную библиотеку документа, который мы
сейчас редактируем. Этот метод уже есть в базовой модели и создавать его больше
не надо.
Ну есть у нас метод. Теперь надо понять, как привязать его к
нужному разделу.
Для этого идем в описание раздела и находим там подпапочку «Методы раздела» и создадим
там запись. Достаточно заполнить поля «Название» и «Метод». Название дайте
любое пристойное (лучше английское и без пробелов), а в качестве метода надо
выбрать этот самый метод VBOpenRef.
Так, хорошо.
Теперь надо задать отображение полей раздела на параметры
метода.
Делаем так.CardRefотображаем на параметр ID, а пустую строку “” на StartMode.
Теперь осталось открыть описание раздела и в поле «При
открытии» - указать нужный нам метод раздела.
Теперь генератор способен сделать для нас тунебольшую работу по декорированию, которую
мы попросили. При двойном щелчке на строку раздела будет открываться нужный
документ.
Чтобы понять, как устроена взаимосвязь документов
воспользуемся разделом «Контактные лица» из документа «Клиент»
1. Значения по умолчанию. Правильнее было бы назвать этот
раздел код по умолчанию, но это не так важно. Важно, что мы можем попросить
генератор вставить специализированный кусок кода в метод, который вызывается
при создании строки раздела.
Код по умолчанию может быть задан для любого из полей.
Последовательность вставки кода для различных полей не фиксирована, поэтому
надо действовать аккуратно.
2. Метод раздела OpenRef. Тут все абсолютно так же как и с нашим разделом «Связи».
Единственное отличие – при отображении на параметр ID надо указывать .Person вместо .CardRef
3. Чтобы
исключить открытие формы редактирования строки при создании новой строки в
описании раздела надо значение поля «Поведение при добавлении» установить
значение RunAction. Это позволяет исполнить код
для инициализации полей (а в нем мы создаем новый документ и связываем его со
строкой раздела) и сразу перейти к открытию документа.
Об остальных приемах декорирования, которые связаны с
различными режимами работы документа мы поговорим в следующем выпуске.