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

Previous  Top  Next

    
 

 

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 - Завершить печать.

 

Пример :

Code:

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 очень важны - они

позволяют произвести пересчет координат из миллиметров в пиксели

для текущего разрешения принтера. Пример таких функций:

Code:

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

 

 

P.S. Мой комментарий.

Я производил печать следующим образом:

Code:

procedure TForm6.SpeedButton1Click(Sender: TObject);

var

PRect: Trect;

PBitMap: TBitmap;

begin

PBitmap := TBitMap.Create;

PBitmap.LoadFromFile('C:\1.bmp');

with PRect do

   begin

     left := 0;

     top := 0;

     right := Printer.PageWidth;

     Bottom := Printer.PageHeight;

   end;

with printer do

   begin

     BeginDoc;

     font.name := 'Times New Roman';

     Canvas.StretchDraw(PRect, Bitmap);

     EndDoc;

   end;

PBitmap.Free;

 

end;

 

 

 

Удачи!

DenKop@mail.ru

 

©Drkb::03264

Взято с сайта http://blackman.wp-club.net/