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