Кратко о организации печати в Clarion
- Автор: Still Zero
- Уровень знаний: начальный
- Подразделы: нет
- Дата публикации: 21.06.2005
Как вы знаете, печать в Кларионе организована с использованием структуры REPORT.
Report REPORT,AT(1000,2000,6000,7000),PRE(RPT),FONT('Arial',10,,),THOUS detail1 DETAIL,AT(,,,438),USE(?detail1) STRING('DATA STRING'),AT(2656,156),USE(?String1),TRN END END
Здесь описан простой отчет, состоящий всего из одного detail-а, на котором присутствует всего одна строка «DATA STRING».
Описывается отчет в секции данных.
Для того, чтобы напечатать данный отчет, необходимо выполнить следующий код:
open(Report) ! открыть отчет print(RPT:Detail1) ! напечатать detail close(Report) ! закрыть отчет
Существует возможность перенаправить вывод отчета, т.е. печатать не на принтер, а в файл. В этому случае в момент печати (при выполнении команды PRINT) Кларион создает WMF-файл на каждую страницу отчета. Размер (высота и ширина) WMF-файла такой, какой вы указали в структуре REPORT. Файл хранится во временной директории Windows (путь указан в переменных среды TEMP и TMP). После печати файл уничтожается.
WMF(Windows meta file) это обычный векторный графический файл. Таким образом, зная пути к файлам отчета можно ‘просмотреть/сохранить/отредактировать’ весь отчет.
Примерно таким же образом и работает стандартный preview-ер отчетов.
Существует свойство PROP:Preview, которое служит для перенаправления вывода печати и задания отчету очереди, которая будет содержать имена WMF-файлов. Также очередь можно задать в свойствах отчета на закладке Extra. Я описываю эту очередь следующим образом:
PreviewQueue QUEUE WMF_Image_Path STRING(256) END
Очередь состоит всего из одного поля — путь к WMF-файлу. Разбивка на страницы происходит при выполнении команды ENDPAGE.
Для того чтобы потом вывести отчет на принтер существует свойство PROP:FlushPreview. После установки этого свойства в TRUE Кларион удалит созданные WMF-файлы.
Таким образом код с использованием перенаправления вывода будет выглядеть так:
open(Report) ! открыть отчет Report{Prop:Preview}= PreviewQueue ! перенаправление вывода print(RPT:Detail1) ! напечатать detail endpage(Report) ! окончательная разбивка на страницы ... ! в этом месте в очереди содержатся имена wmf-файлов Report{Prop:FlushPreview}=TRUE ! печать отчета на принтер close(Report) ! закрыть отчет
Просмотр графических файлов
Я думаю, вы поняли каким образом можно получить список сформированных файлов-страниц. Пока они не удалены их можно скопировать в «другое место» 🙂 или сразу же просмотреть.
В Кларионе существует, известный вам, контрол IMAGE, который служит для просмотра «картинок». Контрол поддерживает wmf-формат. Для этого контрола можно динамически менять просматриваемый файл, используя свойство Prop:Text.
Таким образом, стандартное окно предварительного просмотра, не что иное как обычное окно, содержащее контрол IMAGE. Когда вы меняете текущую страницу, из очереди предварительного просмотра берется запись с порядковым номером этой страницы, т.е. выполняется примерно такой код:
get(PreviewQueue,CurrentPage) ?PreviewImage{Prop:Text} = PreviewQueue.WMF_Image_Path
Изменение масштаба просматриваемого изображения достигается путем изменения свойств IMAGE-контрола: Prop:Height, Prop:Width, Prop:MaxHeight, Prop:MaxWidth.
Свойства Prop:Vscroll, Prop:Hscroll влияют на появление вертикального/горизонтального скролл-баров.
Постраничная печать
Так как вы сами создаете окно предварительного просмотра, то вы можете реализовать любой нужный вам функционал. Например, вы можете организовать поиск строки в отчете (открыть wmf-файл как обычный текстовый файл, найти в нем строку, перейти на найденную страницу).
Наиболее необходимым является постраничная печать и задание количества копий для печати.
Для этого можно создать временную очередь и перебрасывать в нее необходимые записи из основной очереди. Если необходимо напечатать несколько копий, то записи в очереди необходимо продублировать. Т.е. если вам необходимо напечатать страницы 1 и 10, то код будет выглядеть примерно так:
tmp:PreviewQueue QUEUE(PreviewQueue). ! наследование очереди PreviewQueue code ... free(tmp:PreviewQueue) ! очистили временную очередь get(PreviewQueue,1) ! взяли первую запись, соответствующую первой странице tmp:PreviewQueue :=: PreviewQueue ! перенесли значение из основной во временную таблицу add(tmp:PreviewQueue) get(PreviewQueue,10) ! тоже самое с 10-ой страницей tmp:PreviewQueue :=: PreviewQueue add(tmp:PreviewQueue)
для того чтобы напечатать временную очередь создается «пустой» отчет:
TmpReport REPORT,AT(10,10,180,280),PAPER(PAPER:A4),PRE(RPT),FONT('Arial Cyr',10,,),MM Detail1 DETAIL,AT(,,,33),USE(?Detail1) END END
код для печати временной таблицы на принтер с использованием пустого отчета будет выглядеть примерно так:
open(TmpReport) ! открыли временный отчет TmpReport{Prop:Preview} = tmp:PreviewQueue ! назначили уже заполненную очередь endpage(TmpReport) ! разбили на страницы TmpReport{Prop:FlushPreview}=TRUE ! печать на принтер close(TmpReport) ! закрыли отчет
Пример
Пример содержит класс для предварительного просмотра и шаблон для подключения класса и замены стандартного окна предпросмотра.
Пример проверен на C55, C6.1 ABC.
Report Preview (814)
© Project Zero, 2005-2006. Все права защищены.