Действительно, по сумме параметров скоростные матричные принтеры превосходят все остальные. Поэтому даже при смене поколений компьютеров и операционных систем устаревшие модели принтеров все еще занимают место на рабочих столах. И вовсе не обязательно обвинять пользователей в консерватизме, а руководителей донимать просьбами о покупке новых принтеров. Лучше попробуйте переделать свою Windows-программу для печати в текстовом режиме.

Здесь и далее разговор пойдет о программировании на Visual FoxPro, потому что большинство прикладных программ под DOS написаны именно в старых версиях этой СУБД или в совместимых по синтаксису dBase или Clipper. Однако данный принцип будет интересен и для программистов, работающих в любой другой среде разработки. Ну а пользователям Microsoft Office не стоит пропускать эту статью - прочитайте последний абзац.

Вначале, чтобы не забыть, установите необходимый параметр в настройках принтера. Зайдите в меню кнопки "Пуск / Настройка / Принтеры" и щелкните правой кнопкой по значку матричного принтера. Зайдите в "Свойства" и откройте закладку "Сведения". Нажмите "Параметры порта" и в появившемся окне отметьте галочкой пункт "Очередь для заданий печати DOS". Это нужно, чтобы никакая DOS-программа не могла заблокировать принтер либо начать свою печать, прерывая печать других заданий.

Всем известно, что DOS-программы печатают в текстовом режиме, т. к. они используют прямой вывод на принтер. Операционная система DOS не содержит специальных драйверов принтеров, а содержит лишь символьный драйвер, который резервирует имена PRN / LPT1 / LPT2 и т. д. и поддерживает прямой вывод данных в соответствующие порты ввода-вывода.

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

Чтобы обойти это препятствие, не нужно использовать какие-либо нестандартные функции Windows API. Для решения поставленной задачи вполне достаточно всем известного свойства Windows.

Как вы уже догадались, это предоставление DOS-программам прямого вывода на принтер в целях совместимости со старым ПО.

"Как же так? - спросите вы. - У нас же Visual FoxPro, никаким DOS и не пахнет!"

Все верно, однако обо всем по порядку. Вспомните старые добрые времена, когда еще не было редакторов отчетов и оформление вывода на печать приходилось выполнять программно, вручную составляя процедуру вывода строк данных на печать.

Вот таким же методом составьте небольшую процедуру вывода строк, но не на принтер, а в текстовый файл и сохраните его в каталоге, принятом по умолчанию. При этом не забудьте попутно конвертировать символы из кодировки Windows-1251 в DOS-866, иначе увидите на бумаге всего лишь бестолковый набор всевозможных закорючек. Сразу на принтер выводить нельзя - см. выше ограничение Windows.

Исходный текст будет выглядеть примерно так:

procedure TextPRN
priv Ftx, line

* создать файл
Ftx= FCREATE('MyText.TXT')

* формирование строк данных
line= dtoc(date())+' РАСЧЕТНЫЙ ЛИСТОК №'

* перекодировка строки
* из кодовой страницы Windows в DOS
line= CPCONVERT(1251, 866, line)

* запись строки в текстовый файл
= FPUTS(Ftx, line)

* закрыть файл
=FCLOSE(Ftx)
return

Сохраните его в файле TextPRN.prg

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

Создайте в том же каталоге .BAT-файл (например, MATRIX.BAT) и впишите в него единственную строку:

COPY %1 TO PRN


Она дает команду операционной системе копировать файл, указанный в параметре, на устройство PRN.

Потом создайте файл-ярлык MATRIX.PIF, указывающий на MATRIX.BAT, откройте его свойства и на закладке "Программа" включите параметр "Закрывать окно по завершении сеанса работы", а на закладке "Разное" пункт "Фоновый режим / Полная остановка" обязательно выключите.

В подпрограмме вывода на печать напишите следующий код:

* Сформировать текстовый файл
DO TextPRN

* Распечатать текст
RUN /N MATRIX.PIF MyText.TXT


Для начала потренируйтесь запустить сие в командном окне. А потом можете смело кричать "ура!";-). Ну а если что-то не получается, в свойствах ярлыка отключите параметр "Закрывать окно..." и посмотрите сообщения системы. Возможно, вы просто неправильно указали расположение файлов - используйте команду SET DEFAULT TO.

Далее, обратите внимание, как легко и просто сделать перенос процедур печати из старых версий FoxPro под DOS на Visual FoxPro. Все они выглядели примерно следующим образом:

* Установить поток вывода на принтер
SET DEVICE TO PRINTER

* Вывод строки
@ $+1, 0 SAY 'Пошла строка на печать'

* Вернуть вывод на экран
SET DEVICE TO SCREEN


Для достижения аналогичного результата из-под Windows на Visual FoxPro нужно добавить всего-навсего три строки кода:

* 1: Установить поток вывода принтера в файл
SET PRINTER TO FILE C:\Output.txt

* Блок старой DOS-программы
SET DEVICE TO PRINTER
@ $+1, 0 SAY 'Пошла строка на печать'
SET DEVICE TO SCREEN

* 2: Сбросить поток вывода принтера
SET PRINTER TO

* 3: Распечатать текстовый файл
RUN /N MATRIX.PIF C:\Output.txt


Если же ваши программы разрабатывались с использованием генератора отчетов, то Visual FoxPro сможет конвертировать старый отчет и вывести его в текстовый файл той же командой REPORT FORM с небольшими изменениями.

REPORT FORM MyForm TO FILE Output.txt ASCII


Но, взглянув на результат, вы поймете, что не все так просто, как кажется, - многие слова и строки обрезаны, линий, естественно, нет, а расположение текста далеко от желаемого. Я уже не говорю, что текст выводится в кодировке Windows-1251, поэтому для использования в печати в текстовом режиме его необходимо будет конвертировать в DOS-866.

В таком случае вам предстоит выбор - либо многократно редактировать отчеты, подгоняя к более-менее приемлемому виду, спотыкаясь на различных ограничениях, либо сделать все заново программным путем, используя вышеописанную технологию.

В дополнение ко всему вышесказанному могу предложить пару профессиональных советов.

1. Никогда не используйте жестко прописанные имена файлов для вспомогательных операций. В ситуации, когда программа будет запущена в нескольких экземплярах на одном компьютере либо с файл-сервера, возникнет конфликт - различные копии программы будут пытаться создавать один и тот же файл.

Лучше используйте временные файлы. Для создания уникального имени файла в Visual FoxPro воспользуйтесь функцией SYS(3) или выражением SUBSTR(SYS(2015),3,10).

2. Желательно, чтобы окна временных DOS-сессий не мелькали на экране. Для этого в свойствах ярлыка на закладке "Программа" нужно указать параметр "Окно" как "Свернутое в значок". А можно сделать это программно, слегка изменив команду запуска ярлыка:

RUN /N7 MATRIX.PIF C:\Output.txt

Именно в таком виде печатает расчетные листки и некоторые списки модуль "Расчет зарплаты" в моем бухгалтерском комплексе, который вы можете свободно скачать с www.victoryday.web.com из раздела OpenSoft и самолично убедиться в работоспособности изложенных текстов.

Ну а те, кто не знаком с Visual FoxPro, но работает в Microsoft Office 97, конечно же, скажут: а слабо напечатать таблицы Excel или данные Access на матричном принтере в режиме draft!

А вот и не слабо! Могу вам сообщить, что такие модули уже готовы, и вам остается всего лишь дождаться следующей статьи с подробным описанием. К моменту выхода статьи в свет готовые примеры документов Office можно будет взять с упомянутого сайта в разделе Programming.

Желаю успеха.

Виктор Маковчик www.victoryday.web.com