Принцип составления шаблонов для печати
Директивы:
#name - наименование документа; используется для организации меню шаблонов, например:
#name Амбулаторная карта по форме ...
#width - ширина документа, например:
#width 130
#height - количество строк на странице (приблизительно 60 для 6 строк на дюйм, и 75 - для 8 строк на дюйм), например:
#height 75
#regim - режим печати (1 - Pica, 2 - Elite, 3 - Condensed, 4 - Pica 8 lpi, 5 - Elite 8 lpi, 6 - Condensed 8 lpi), например:
#regim 6
#albom - наличие этой директивы означает, что документ будет распечатываться в альбомной ориентации
#outlist - наличие этой директивы объявляет печать номера листа (начиная со второго)
// - комментарий (строка не интерпретируется)
#parameters - формальные параметры, посылаемые в функцию print_shablon(), например:
#parameters i,m,y
#private - объявление временных переменных (они действуют только внутри шаблона), например:
#private arr, k, i
#proc - выполнение процедуры (блока кода). Эта строка внутри функции выполняется следующим образом: eval( &("{||" + строка + "}") ).
Пример:
#proc arr := array(2)
#proc k := perenos(arr,org->name,width)
#proc i := 1
#proc i := i + 1
и т.п.
Примечание: в одну строку можно писать несколько процедур через запятую.
#var - описание шаблонов для печати (режим OVERWRITE), например:
#var $2 mkod
#var $3 put_val(schet->summa,11,2)
#var $12 center("за "+arr_month[m]+" месяц "+str(y,4)+" г.",width)
и т.п.
В каждой из таких строк обязательно наличие конструкции #var $. Затем следует число, представляющее собой номер переменной в шаблоне, а затем, через пробел, описание переменной в стиле содержимого блока кода.
#i_var - описание шаблонов для печати (режим INSERT), например:
#i_var $2 mkod
#i_var $3 put_val(schet->summa,11,2)
#i_var $12 center("за "+arr_month[m]+" месяц "+str(y,4)+" г.",width)
и т.п.
В каждой из таких строк обязательно наличие конструкции #i_var $. Затем следует число, представляющее собой номер переменной в шаблоне, а затем, через пробел, описание переменной в стиле содержимого блока кода.
#release - удалить все переменные #var и #i_var из памяти, т.е. после этого разрешается снова использовать те же самые номера переменных.
#title - начало описания заголовка первого листа.
#subtitle - начало описания заголовка N-го листа.
#endtitle - окончание описания заголовка первого (N-го) листа.
#do while <условие>
...
[#loop]
...
[#exit]
...
#enddo - Реализация конструкции DO-WHILE
<условие> - любая правильная логическая конструкция на X-Base языке (Clipper, FoxPro, и т.п.)
Допускается любая вложенность конструкций DO-WHILE.
Директива #loop пропускает операторы, стоящие после нее, и управление передается снова на #do while <условие>.
Директива #exit означает безуслоный выход из цикла.
Квадратные скобки означают необязательность данных инструкций.
#if <условие>
...
[#elseif <условие>]
...
[#else]
...
#endif - Реализация конструкции IF-ELSEIF-ELSE-ENDIF
<условие> - любая правильная логическая конструкция на X-Base языке (Clipper, FoxPro, и т.п.)
Допускается любая вложенность конструкций IF-ENDIF.
Квадратные скобки означают необязательность данных инструкций.
#return - безусловный выход из шаблона без входа в функцию просмотра/печати (т.е. без распечатки документа).
#formfeed - перевод страницы. Если эта директива совсем отсутствует в шаблоне, то перевода страниц вообще не будет. Когда интерпретатор встречает данную директиву - он работает следующим образом:
если <текущая строка> > height
перевод страницы
<текущая строка> := 0
<номер листа> := <номер листа> + 1
вывод номера следующего листа (если необходимо)
вывод заголовка N-го листа (#subtitle ... #endtitle)
иначе
ничего
Если содержание документа (количество строк) заранее известно, как например в случае договоров, можно вместо данной директивы использовать обычный перевод формата (CHR(12)) и переход на следующий лист принудительно.
(на данной строке вводится символ перевода формата chr(12) или две английские большие буквы F подряд: FF)
#proc n_list := n_list + 1, tek_stroke := 0
Здесь "n_list" - глобальная переменная, в которой хранится номер текущего листа, а "tek_stroke" - глобальная переменная, в которой хранится номер текущей строки на листе.
#proc formfeed(4) - перевод страницы в сквозных текстах типа "договор". Когда интерпретатор встречает данную комбинацию - он работает следующим образом:
если <текущая строка> > height - 4
перевод страницы
<текущая строка> := 0
<номер листа> := <номер листа> + 1
иначе
ничего
#para_begin - начало форматируемого абзаца.
#para_end - окончание форматируемого абзаца.
#r_margin - эта директива действует только на форматируемые абзацы; наличие этой директивы указывает на то, что форматируемые абзацы будут дополнительно выравниваться по правому краю. Она должна присутствовать в начале файла после директивы #regim.
Общие замечания:
· | расширение шаблона по умолчанию - *.SHB |
· | максимальная длина любой строки шаблона - 510 символов |
· | ширина (width) документа по умолчанию 60 символов |
· | высота (height) документа по умолчанию 60 строк |
· | режим (regim) печати по умолчанию 1 |
· | в строках #proc запрещается использовать конструкции ++, --, += и т.п. |
· | блок кода необходимо использовать совместно с функцией comp_block(), |
например, вместо
#proc dbeval({||aadd(arr_kod,kod)})
необходимо писать
#proc dbeval(comp_block("{||aadd(arr_kod,kod)}")).
(Функция comp_block() компилирует блок кода из строки во время выполнения программы).
· | если в шаблоне присутствует директива #title и отсутствует #subtitle, то на втором и последующих листах выводится тот же заголовок, что и на первом. |
· | если в шаблоне присутствует директива #subtitle и отсутствует #title, то на первом листе выводится тот же заголовок, что и на втором. |
· | если первый значащий символ строки не #, - данная строка обрабатывается следующим образом: |
§ | производится проверка на то, выводился ли уже заголовок первого листа; если нет, - то выводится заголовок первого листа, находящийся между директивами #title и #endtitle; |
§ | производится поиск всех вхождений знака $ (этот знак указывает на подстановку соответствующей переменной #var в данном месте методом OVERWRITE, а #i_var - методом INSERT); |
§ | соответствующие переменные выбираются из строк с директивами #var или #i_var, вычисляются как содержимое блока кода функцией EVAL, затем подставляются последовательно справа налево переменные #i_var, а затем слева направо переменные #var; |
§ | получившаяся строка выводится в документ. |
· | если первый значащий символ строки не #, и в строке не встретится ни одного знака $, эта строка без изменений выводится в документ. |
· | пустая строка в шаблоне означает, что в данном месте в документ также будет выведена пустая строка. |
· | если необходимо отформатировать несколько абзацев, следующих друг за другом, возможна такая запись: |
#para_begin
<строки абзаца>
#para_begin
<строки абзаца>
#para_end
т.е. промежуточные директивы #para_end можно опускать.