Шаблоны печати

CHIP_MO

Навигация:  Основные положения > Принтер, печать >

Шаблоны печати

НазадВ началоВперед

Принцип составления шаблонов для печати

Директивы:

 

#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 можно опускать.