"Виртуальная библиотека Delphi" - читать интересную книгу автора

Работа с принтером.

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

1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново

2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и, главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".

3. У 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) — микроскопической.