Об открытом ПО, выводе на печать и многом другом...

Компьютерный мир развивается с поразительной быстротой. Год здесь спрессован настолько, что равняется десяткам, а может быть и сотням простых человеческих лет. Уже пройден этап первобытнообщинного строя, феодализм, период первоначального накопления капитала. Прошло время, когда каждая компания воздвигала вокруг своих продуктов "железный занавес", тщательно охраняя свои производственные секреты. Технологии достигли такого уровня сложности и охватывают такой широкий круг проблемных областей, что одной компании, будь она даже Microsoft, не под силу в одиночку разрабатывать программные продукты. Новое мышление в компьютерной индустрии - это открытый подход, когда любой программист сможет подключиться к разработке любого проекта. Впереди замаячили контуры единого евро.... тьфу ты... программистского сообщества.

Не желая отставать от требований времени, минская компания Golden Software выступила с инициативой. Мы готовы открыть исходные коды своих продуктов, а также инструментальных средств и передать их совершенно бесплатно всем заинтересованным разработчикам. Хотя наибольшую известность нашей компании принес комплекс экономических программ "Анжелика" - это не единственный наш продукт. Уже более пяти лет мы разрабатываем библиотеку компонентов для Delphi. На мировом рынке она продается немецкой компанией Fabula под маркой xTools. На сегодняшний день xTools содержит более сотни уникальных компонентов для Delphi 1-4. Их функциональность во многом превосходит то, что можно приобрести за 5 долларов в Ждановичах, а возможность контакта с разработчиками, наличие исходных текстов и документации, надеемся, сделает наше предложение весьма привлекательным.

Этой статьей начинается цикл материалов, посвященных технологии программирования, вопросам постановки задач и поиска наиболее оптимальных путей их решения.

Вывод на печать

Когда компьютер будет не только в каждом доме, но и у каждого члена семьи, не только в каждом офисе, но и у каждого работника, и не по одному, а по два, по три: один - настольный - на рабочем месте, один - мобильный - в кармане, один - в машине... И все это будет связано единой сетью, беспроводной и сверхпропускной. Только тогда можно будет серьезно говорить о переходе к безбумажным технологиям. И кто первым успеет к этому светлому дню - инженеры из силиконовой долины или лесорубы с бензопилами - вопрос открытый.

Пока же обязательным требованием практически к любой создаваемой программе является возможность вывода информации на печать. Причем избалованному окнами пользователю мало просто текста, ему подавай отчеты с графиками, картинками, табличками и прочим.

Что делать в этом случае программисту?

Первое, что приходит на ум, это рисовать отчет непосредственно в коде программы. Благо вывод на устройство во Windows унифицирован, и если вы уже рисуете отчет на экране, то отправить его на принтер - дело нескольких минут. Очевидно, что такой вариант подходит для такой программы, в которой: а) всего несколько отчетов; б) формы этих отчетов не изменяются; в) в отчетах не требуется замысловатого оформления, трехмерных графиков, сложных таблиц и т. п. Все три вышеперечисленных условия являются противоположными к определению серьезной, стоящей программы, за которую клиент с готовностью выложит свои кровные.

Если ваша цель создание программного продукта, на который не стыдно будет и самим посмотреть, и другим показать, то подсистеме вывода на печать стоит уделить самое серьезное внимание.

В стандартную поставку Delphi входит набор компонентов Quick Report. С его помощью за считанные минуты можно нарисовать шаблон отчета и подключить его к базе данных. Все операции понятны программисту и ничем не отличаются от обычного построения экранной формы. Пожалуй, единственный недостаток подобного подхода заключается в том, что изменить внешний вид отчета невозможно без вмешательства программиста и без перекомпиляции всего проекта. Этот недостаток весьма значительный, особенно если речь идет не об уникальной заказной работе, а о тиражном продукте. Не будешь же ведь выпускать пару сотен версий программ - по числу клиентов. А то, что изменения в выходные формы потребуются - гарантия 100-процентная. Простейший пример: в торговой программе каждый клиент желал бы поместить свой логотип в прайс-лист или отсканированное изображение печати и подписи в счет-фактуру.

Еще одно решение проблемы - воспользоваться имеющимся генератором отчетов. В свое время с седьмым Паскалем Borland поставляла систему Crystal Reports. С первым Delphi поставлялся Report Smith, а начиная со второй версии, уже упоминавшийся выше, - Quick Reports. Уже сам факт того, что компания Borland отказалась от поставки первых двух систем в комплекте с Delphi, говорит о наличии серьезных проблем при их использовании. Первая заключается в том, что run-time библиотека, которая устанавливается на компьютер пользователя, занимает много места и при работе потребляет слишком много системных ресурсов. Вторая - даже если пользователь и рискнет самостоятельно изменить внешний вид выходной формы, ему придется осваивать совершенно новый редактор. Шаг, на который подавляющее большинство пользователей ни за что не пойдет.

В свое время перед нами стояла проблема выбора наиболее подходящего генератора отчетов. Первым делом мы создали свой язык описания отчетных форм - APS. Язык базировался на формате PostScript, точнее - на одной статье о PostScript, вычитанной в журнале "МирПК". И хотя визуальное сравнение файлов не давало особых причин для беспокойств, ни один из PostScript принтеров его не воспринимал, равно как и любой редактор, поддерживающий этот формат. Зато его воспринимали наши программы. Но когда мы на собственном опыте убедились, что несовместимость - первый шаг к сумасшествию, решили искать другие варианты.

Как временное решение, впрочем, до сих пор применяющееся в некоторых продуктах, использовалась связь по DDE с MSWord'ом. Загружался редактор, по команде открывался файл, в него подставлялись данные, и все это отправлялось на печать. Хотя такой подход сработал, но проблемы в целом не решил. Уж очень требовательны к ресурсам продукты Microsoft. Загрузить одновременно программу, которая обращается к мегабайтной базе данных и Microsoft Word с отчетом на пару десятков страниц, все это на компьютере с 8 мегабайтами памяти - такого насилия над собой Windows выдержать не могла - или падала напрочь, или на сутки уходила в себя, свопируя своп файл. Ждать, пока произойдет революция цен и каждый пользователь обзаведется вторым пентиумом и 64 Мб памяти, мы не могли. Тем более, что Microsoft тоже не дремлет и еще не известно, сколько ресурсов будет требовать следующая итерация офиса.

Итак, два года назад перед нами стояла следующая задача: подсистема печати должна быть не требовательной к конфигурации компьютера и поддерживать один из общеизвестных форматов, с тем, чтобы конечный пользователь для корректировки внешнего вида мог воспользоваться хорошо знакомым ему инструментом. В качестве такого формата практически идеально подходит RTF (Rich Text Format). Во-первых, его понимают все текстовые редакторы. Во-вторых, он предназначен для работы с бумажными документами, а не с их электронной формой, как HTML.

Реализация обработчика RTF оказалась не столь тривиальной. Только формализованное описание этого стандарта занимает 68 (!) страниц. О сложности задачи говорит хотя бы то, что до сих пор мы не встречали компоненты, способные удовлетворительно работать с этим форматом. RichEdit из стандартной поставки Delphi не в счет, поскольку не поддерживает таблицы, графики, стили текста, разметку страницы, колонтитулы, поля и пр.

Только с третьей попытки, когда за дело взялся талантливый программист Владимир Белый, удалось получить работающую версию. Зато теперь с отчетами нет проблем.

Каждая форма представляет собой отдельный файл. Для его создания используется Microsoft Word. Документ содержит статичный шаблон отчета и поля, которые буду заполнены информацией в момент построения отчета. Поддерживаются следующие возможности формата RTF: текст, форматированный текст, параграфы, нумерованные и ненумерованные списки, таблицы (с оформлением), колонтитулы, стандартные поля, графика. В одном отчете можно вывести данные неограниченного числа таблиц, в том числе и связанных.

Для подключения отчета в программу достаточно поместить компонент TxReport на форму и связать его с источником данных (TDataSource) и файлом шаблона отчета. Готовый отчет можно просмотреть на экране, вывести на печать или сохранить в файл.

И последнее, существуют достаточно "экзотические" случаи, в решении которых вряд ли поможет даже самый совершенный генератор отчетов. Пример: печать на конвертах или на наклейках для дискет. В набор xTools входят два дополнительных компонента, решающих эти задачи.

Андрей Киреев


Компьютерная газета. Статья была опубликована в номере 13 за 1999 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета