Как Visual FoxPro печатает на матричном принтере в текстовом режиме
В продолжающемся противостоянии программ для DOS и Windows основным аргументом в пользу первых (и уже последним) является возможность печати на матричных принтерах в текстовом режиме. Дело в том, что существует большое количество документов, для которых качество печати на уровне лазерного или струйного принтера не является решающим фактором. Это могут быть различные квитанции, расчетные листки по зарплате, счета абонентской платы и пр. Зачастую их необходимо печатать сотнями и тысячами, а иногда и в двух и более экземплярах. Поэтому для решения таких задач главными факторами являются скорость печати, возможность печати на рулонной бумаге и стоимость расходных материалов.
Действительно, по сумме параметров скоростные матричные принтеры превосходят все остальные. Поэтому даже при смене поколений компьютеров и операционных систем устаревшие модели принтеров все еще занимают место на рабочих столах. И вовсе не обязательно обвинять пользователей в консерватизме, а руководителей донимать просьбами о покупке новых принтеров. Лучше попробуйте переделать свою 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.
Желаю успеха.
Виктор Маковчик
Действительно, по сумме параметров скоростные матричные принтеры превосходят все остальные. Поэтому даже при смене поколений компьютеров и операционных систем устаревшие модели принтеров все еще занимают место на рабочих столах. И вовсе не обязательно обвинять пользователей в консерватизме, а руководителей донимать просьбами о покупке новых принтеров. Лучше попробуйте переделать свою 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.
Желаю успеха.
Виктор Маковчик
Компьютерная газета. Статья была опубликована в номере 21 за 2000 год в рубрике программирование :: разное