FAQ - Работа с принтером.
DELPHI имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная PRINTER:TPINTER, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях DELPHI 1 он имеет "глюк" - не работают функции DRAW и STRETHDRAW. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта PRINTERS:
PROPERTY
- ABORTED:BOOLEAN - Показывает, что процесс печати прерван
- CANVAS:TCANVAS - Стандартный CANVAS, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст ... . Тут есть несколько особенностей, они описаны после описания объекта.
- FONTS:TSTRINGS - Возвращает список шрифтов, поддерживаемых принтером
- HANDLE:HDS - Получить HANDLE на принтер для использования функций API (см. Далее)
- ORIENTATION:TPRINTERORIENTATION - Ориентация листа при печати : (POPORTRAIT, POLANDSCAPE)
- PAGEHEIGHT:INTEGER - Высота листа в пикселах
- PAGENUMBER:INTEGER - Номер страницы, увеличивается на 1 при каждом NEWPAGE
- PAGEWIDTH:INTEGER - Ширина листа в пикселах
- PRINTERINDEX:INTEGER - Номер используемого принтера по списку доступных принтеров PRINTERS
- PRINTERS:TSTRINGS - Список доступных принтеров
- PRINTING:BOOLEAN - Флаг, показывающий, что сейчас идет процесс печати
- TITLE:STRING - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
METODS
- ASSIGNPRN(F:TEXTFILE) - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
- ABORT - Сбросить печать
- BEGINDOC - Начать печать
- NEWPAGE - Начать новую страницу
- ENDDOC - Завершить печать.
Пример :
PROCEDURE TFORM1.BUTTON1CLICK(SENDER: TOBJECT); BEGIN WITH PRINTER DO BEGIN BEGINDOC; { Начало печати } CANVAS.FONT:=LABEL1.FONT; { Задали шрифт } CANVAS.TEXTOUT(100,100,'Это тест принтера !!!'); { Печатаем текст } ENDDOC; { Конец печати } END; END;
Особенности работы с TPRINTER
- После команды BEGINDOC шрифт у CANVAS принтера сбрасывается и его необходимо задавать заново
- Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".
- У TPRINTER информация о принтере, по видимому, определяются один раз - в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов TRUE TYPE.
- Определение параметров принтера через API - Для определения информации о принтере (плоттере, экране) необходимо знать HANDLE этого принтера, а его можно узнать объекта TPRINTER -
PRINTER.HANDLE. Далее вызывается функция API (UNIT WINPROCS) : GETDEVICE(HANDLE:HDC; INDEX:INTEGER):INTEGER;
- INDEX - код параметра, который необходимо вернуть. Для INDEX существует ряд констант :
- DRIVERVERSION - вернуть версию драйвера
- TEXNOLOGY - Технология вывода, их много, основные
- DT_PLOTTER - плоттер
- DT_RASPRINTER - растровый принтер
- DT_DISPLAY - дисплей
- HORZSIZE - Горизонтальный размер листа (в мм)
- VERTSIZE - Вертикальный размер листа (в мм)
- HORZRES - Горизонтальный размер листа (в пикселах)
- VERTRES - Вертикальный размер листа (в пикселах)
- LOGPIXELX - Разрешение по оси Х в DPI (пиксел /дюйм)
- LOGPIXELY - Разрешение по оси Y в DPI (пиксел /дюйм)
Кроме перечисленных еще около сотни, они позволяют узнать о принтере практически все.
Параметры, возвращаемые по LOGPIXELX и LOGPIXELY очень важны - они позволяют произвести пересчет координат из миллиметров в пиксели для текущего разрешения принтера. Пример таких функций:
PROCEDURE TFORM1.GETPRINTERINFO; { Получить информацию о принтере } BEGIN PIXELSX:=GETDEVICECAPS(PRINTER.HANDLE,LOGPIXELSX); PIXELSY:=GETDEVICECAPS(PRINTER.HANDLE,LOGPIXELSY); END; { переводит координаты из мм в пиксели } FUNCTION TFORM1.PRINTERCOORDX(X:INTEGER):INTEGER; BEGIN PRINTERCOORDX:=ROUND(PIXELSX/25.4*X); END; { переводит координаты из мм в пиксели } FUNCTION TFORM1.PRINTERCOORDY(Y:INTEGER):INTEGER; BEGIN PRINTERCOORDY:=ROUND(PIXELSY/25.4*Y); END; --------------------------------- GETPRINTERINFO; PRINTER.CANVAS.TEXTOUT(PRINTERCOORDX(30), PRINTERCOORDY(55), 'Этот текст печатается с отступом 30 мм от левого края и '+ '55 мм от верха при любом разрешении принтера');
Данную методику можно с успехом применять для печати картинок - зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать. Иначе на матричном принтере (180 DPI) картинка будет огромной, а на качественном струйнике (720 DPI) - микроскопической.
- INDEX - код параметра, который необходимо вернуть. Для INDEX существует ряд констант :