IN4+FastReport
[Who]
Выводит переменную с именем Who, которая определена в коде события соответствующего текстового элемента. (Смотрите код ниже.)
[PARAM('NM')], [PARAM('AS')]
Извлекает данные участка по тегу формата IN4. В данном случае это имя землепользователя и площадь участка.
Ділянка № <b>[Num]</b>
Обращение к переменной Num, определенной в коде. Как видите, переменная включена в статический текст. Обратите также внимание на символы форматирования <b> </b>, которые включают и отключают вывод жирным шрифтом.
Обчислив: [FILE('Setup.ini','Обчислив')]
Обращение к аналогу DMT функции FIL, которая извлекает текстовые константы из файла.
Теперь, пожалуй, стоит познакомиться с языком PascalScript. Чтобы не быть голословными, приведем фрагмент скрипта из шаблона Catalog.fr3, с которым мы познакомились выше. Вот текст кода:
var
Num,Who: string; 
procedure Memo33OnBeforePrint(Sender: TfrxComponent);
begin
with Memo33, Engine do begin
Num:=PARAM('НД');
if Num='' then Visible:=false
end end;
procedure Memo15OnBeforePrint(Sender: TfrxComponent);
begin
S:=Param(-7);
if S='20000' then Who:='Землекористувач:' else Who:=Param(-5);
end;
begin
end.
В секции var декларируются две переменные строкового типа с именами Num и Who.
Процедура (подпрограмма), которая вызывается в ответ на событие OnBeforePrint элемента Memo33. Этот элемент можно рассмотреть на Рис.12.13 слева над “шапкой” каталога координат.
Отметим, что элементы имеющие “привязанный” код, помечены в окне дизайнера маленьким красным треугольничком.
Извлекаем номер участка из параметра с тегом НД. Если номер отсутствует (пустая строка) то свойству Visible элемента Memo33 присваиваем False, тем самым отключая его отображение. Свойство Visible связано в элементом Memo33 конструкцией with.
Процедура (подпрограмма), которая вызывается в ответ на событие OnBeforePrint элемента
Memo150.
Извлекаем код слоя участка из фиксированного параметра -7. Если код равен 20000, то есть соответствует слою “IN4_Ділянка”, то выводим “Землекористувач”, иначе выводим имя слоя (то есть значение из параметра -5).
В этой секции можно разместить стартовый код отчета, который выполнится сразу после запуска шаблона на генерацию документа. В стартовом коде выполняются все необходимые приготовления.
311
Глава 12. Применение в землеустройстве
Главный совет при разработке шаблонов: учитесь на примерах. Не стесняйтесь экспериментировать, внося изменения в поставляемые шаблоны. Если вы боитесь напортачить, то сделайте копию файлов с расширением FR3, находящихся в папке Templates.
Особенностью проектирования шаблонов отчетов в модуле Reports является тот факт, что в ряде случаев вы можете обойтись вообще без бэндов. Для примера, обратитесь к шаблону Технічна документація. Учитывая, что данный шаблон “заточен” под выдачу документа на один единственный участок, усложнять себе жизнь бэндами не было нужды.
Разработчику этого шаблона удалось обойтись без бэндов и в пофамильной версии отчета, которая предназначена для выдачи документов для пары участков с целевыми назначениями ОЖБ и ОСГ. Дополнительные аргументы функции PARAM позволяют извлечь данные из второго участка по его номеру, а сам номер участка можно отыскать, написав довольно простой код в скрипте.
Вообще, анализируя поставляемые с Digitals шаблоны можно заметить, что написанию в них программного кода отводится ведущая роль. Очень часто используется следующий подход: после запуска шаблона на выполнение в стартовом коде отчета вычисляются все необходимые в дальнейшем переменные, которые и используются в элементах шаблона вместо прямых вызовов функций.
Отсюда возникает еще один совет: вспоминаем школьные уроки информатики. Ну и не забываем заглядывать в справочную систему.
Данная технология призвана объединить оба описанных выше подхода (шаблоны документов DMT и отчеты FastReport) и учесть сложности, сопутствующие представлению обменного файла XML в кадастровой карте. Вот как все происходит:
1.Откройте файл XML и пометьте участок. Для примера можно взять файл XMLExample.xml из папки
Maps.
2.Выполните команду меню Сервис > Документы и выберите один из шаблонов, чье имя задано в угловых скобках и помечено
специальной иконкой. Например, пункт <CadPlanA4>.
Этот пункт соответствует пакету (по сути - папке) CadPlanA4.dmt, хранящейся в папке Templates. Внутри нее находится шаблон документа CP.dmt и шаблон отчета CadPlanA4.fr3.
3.Программа сгенерирует графическую часть на базе шаблона CP.dmt и откроет ее в новой карте. Далее, вам следует отредактировать ваш будущий план по своему вкусу. После окончания редактирования, нажмите кнопку Продолжить в диалоге ожидания.
Все, что попадает в рамку карты, будет автоматически экспортировано в файл формата WMF в подпапку Pictures программной папки под уникальным именем. Временная карта будет закрыта.
Далее, в буфер обмена программа запишет данные о самом обменном файле. Отметим, что от передачи в виде неявно формируемого Комбинированного списка разработчикам пришлось отказаться. Вместо этого используется тот же язык XML, немного адаптированный для данной задачи. Подробности чуть ниже.
4.На этом шаге запускается модуль Reports, в который на обработку передается шаблон отчета
CadPlanA4.fr3.
Здесь вступает в игру программный код, которым данный шаблон просто таки “нафарширован”. Код выполняет разбор данных, переданных из Digitals, создает элементы отчета (в частности, экспликацию), а также загружает сохраненную на предыдущем этапе графическую часть.
5.Готовый документ можно открыть для окончательной правки в дизайнере двойным щелчком. Сохранить и/или распечатать отчет можно с помощью стандартных команд модуля Reports.
Вероятно, самый простой способ создать новый шаблон - это воспользоваться Проводником Windows, чтобы скопировать существующий:
312
XML+DMT+FastReport
1.Создайте папку вида ИмяШаблона.DMT в папке Templates.
2.Скопируйте внутрь из другого пакета файл шаблона отчета FR3 и файл шаблона документа DMT. Чтобы новый пакет отобразился в меню Документы, Digitals придется перезапустить.
Отметим, что шаблонов DMT может быть несколько, если требуется несколько вариантов графической части, а может и не быть вовсе, если вы составляете, к примеру, шаблон каталога координат.
3.Отредактируйте шаблон DMT, просто открыв его в окне Digitals.
Здесь вам должна помочь информация, изложенная выше в разделах «IN4+DMT» и «XML+DMT».
4.Чтобы отредактировать шаблон отчета FastReport, запустите пакет на выполнение командой меню Сервис > Документы и, в открывшемся окне модуля Reports, выберите команду меню Дизайнер >
Правка шаблона.
За дополнительной информацией о работе с Дизайнером отчетов обращайтесь к разделу
«IN4+FastReport».
5.Повторяйте предыдущие два пункта, пока не добьетесь желаемого результата.
Чтобы представить себе, какие именно данные передаются модулю Reports из Digitals в случае создания документов из обменного файла XML, попробуем заглянуть в буфер обмена. Для этого, сразу после создания документа, следует открыть любой текстовый редактор и нажать кнопку Вставка.
В качестве редактора автор использовал NotePad++, рекомендованный одним из старожилов форума в ветке “XML против Reports3”. Будучи оснащенным плугином XMLTools, этот редактор является замечательным средством для просмотра и правки документов XML.
К слову, упомянутая ветка форума, несмотря на большей частью устаревшую информацию, содержит массу примеров по извлечению данных из XML. Также здесь можно найти и скачать довольно неплохие готовые шаблоны.
Ниже на снимке экрана показано содержимое буфера обмена после форматирования в редакторе. Поскольку полный текст занял бы слишком много места, часть информации “свернута” (такие строки слева помечены + плюсами).
3 http://www.geosystema.net/forum/viewtopic.php?f=1&t=2051
313
Глава 12. Применение в землеустройстве
Прежде чем мы продолжим, сделаем небольшой экскурс в синтаксис языка XML. Если сказать совсем просто, то язык состоит из элементов (или узлов), каждый из которых состоит из открывающего тега вида <element1>, соответсвующего ему закрывающего тега вида </element1> и данных, которые заключены между ними.
Элементы могут быть вложенными друг в друга, образуя тем самым иерархическое дерево. Для удобства чтения документов на языке XML человеком, вложенные элементы принято показывать с некоторым отступом. Цепочка вложенных элементов, ведущая к неким данным, представляет собой ветку или путь.
Для работы с путями используется так называемый язык запросов XPath. Подробное его изучение его в рамках данной книги невозможно, да и не нужно. В Digitals используется упрощенная его версия, которая позволяет извлекать значение одного заданного узла, содержащего текстовое значение.
Пути бывают абсолютными, то есть от самого внешнего элемента, и относительными - от текущего. Первые обязательно начинаются с символа / (прямого слэша). Такой же прямой слэш применяется и для разделения элементов, входящих в путь. Если на некотором уровне имеется несколько элементов, то конкретный элемент можно указать по номеру в [ ] квадратных скобках.
Например:
'ProprietorInfo/Authentication/NaturalPerson/FullName/LastName'
Извлекает фамилию собственника участка.
'ProprietorInfo[1]/Authentication/NaturalPerson/FullName/LastName'
В этом случае собственников несколько, поэтому указываем номер в квадратных скобках после элемента ProprietorInfo.
Теперь вернемся к снимку экрана, показанному выше. Что же мы видим:
•Вся информация заключена в один внешний элемент самого высокого уровня Data.
•На втором уровне находится три элемента, каждый из которых отвечает за свой “кусок” данных:
EmbeddedXML
Этот элемент предназначен для передачи “чистого” XML файла, каким бы вы его увидели при сохранении на диск. Пользователи, знакомые со структурой обменного файла формата XML, сразу узнают его по элементу UkrainianCadastralExchangeFile. Внутри последнего находится абсолютно все “родные” элементы, предусмотренные данным форматом.
Map
Этот элемент предназначен для передачи информации об исходной карте. Здесь имеется информация о слоях, параметрах, объектах и их узлах (точках).
Graphics
Вдочерних узлах этого элемента указаны имена файлов, содержащие графическую часть отчета (элемент Graphic), а также элемент, содержащий таблицу смежников (элемент Neighbours).
Таким образом, в распоряжении разработчика шаблона отчета имеется вся доступная информация - остается только ее правильно обработать. И здесь на сцену выходит язык PascalScript и функции запросов к XML.
Ниже даны формальные описания функций и примеры запросов. (В примерах, ввиду слишком длинных для книги строк, пришлось применить перенос строки, которого в реальном коде быть не должно.)
IsNodeExists(Path:String):Boolean
Проверка наличия узла. Возвращает True или False. Например, следующий запрос отвечает на вопрос, является ли первый по счету собственник участка физическим лицом:
IsNodeExists('InfoPart/CadastralZoneInfo/CadastralQuarters/
CadastralQuarterInfo/Parcels/ParcelInfo[1]/Proprietors/
ProprietorInfo[1]/Authentication/NaturalPerson')
314
NodesCount(Path,Tag:String):Integer
Возвращает количество узлов Tag в корне Path. Вот пример запроса, определяющего количество смежников для участка:
NodesCount('InfoPart/CadastralZoneInfo/CadastralQuarters/
CadastralQuarterInfo/Parcels/ParcelInfo[1]/AdjacentUnits',
'AdjacentUnitInfo')
XPath(Path:String):String
Возвращает текстовое значение из узла Path. Запрос, возвращающий целевое назначение участка, выглядит так:
XPath('InfoPart/CadastralZoneInfo/CadastralQuarters/
CadastralQuarterInfo/Parcels/ParcelInfo[1]/CategoryPurposeInfo/Use')
Описанные выше функции определены на уровне самого модуля Reports. Кроме этих функций, в коде шаблонов отчетов имеются десятки вспомогательных функций, написанных на языке PascalScript. Их также можно использовать, скопировав в свой шаблон. Изучите примеры кода и найдите свой путь для реализации собственных шаблонов.
Layout DMT
Это специализированный тип шаблона документа DMT, предназначенный для создания выкопировок из карт или схем расположения участков. Он объединяет в себе шаблон зарамочного оформления и функцию получения графического фрагмента. Шаблоны этого типа программа идентифицирует по наличию в названии файла слова layout. Размещаются такие шаблоны в программной папке.
Запускаются layout шаблоны обычным порядком из меню Сервис > Документы. В результате создается документ, в рамку которого вставляется растровое изображение исходной карты. Помеченный объект при этом переносится на специальный слой с условным знаком-штриховкой.
Рамка карты шаблона задает размах фрагмента исходной карты. Центр объекта на слое с кодом 7575001 “Layout object position” задает положение исходного объекта в документе. Размеры этого объекта значения не имеют. Шаблон автоматически масштабируется таким образом, чтобы соответствовать масштабу исходной карты, поэтому масштаб шаблона не важен. Имя файла создаваемого документа составляется из имени шаблона и результата выражения, заданного в имени карты шаблона (в окне свойств).
Давайте еще раз вспомним, что за шаблоны нам доступны, где они хранятся и как они запускаются. На листинге приведен фрагмент дерева папок и файлов внутри программной папки Digitals. Имена папок здесь взяты в [ ] квадратные скобки. Ниже даны необходимые пояснения.
[Digitals]
|
\-----[Templates]
| |
| |
|
| |
\-----[CadPlanA4.dmt] |
|
| |
| |
| |
| |
| |
\-----CadPlanA4.fr3 |
| |
| |
\-----CP.dmt |
| |
| |
|
| |
\-----Catalog.fr3 |
|
| |
\-----TD_privat.fr3 |
|
| |
|
|
\-----[1000.dmt] |
||
| |
| |
|
| |
\-----A4-1000.DMT |
|
| |
\-----Акт(погодження).DMT |
|
| |
Акт согласования границ.DMT |
|
\----- |
||
315