Работа с принтером.
Материал из DRKB
Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer: TPinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers:
Свойства TPrinter[править | править код]
Aborted: Boolean
- Показывает, что процесс печати прерванCanvas: TCanvas
- Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст... Тут есть несколько особенностей, они описаны после описания объекта.Fonts: TStrings
- Возвращает список шрифтов, поддерживаемых принтеромHandle: HDS
- Получить Handle на принтер для использования функций API (см. Далее)Orientation: TPrinterOrientation
- Ориентация листа при печати : (poPortrait, poLandscape)PageHeight: Integer
- Высота листа в пикселахPageNumber: Integer
- Номер страницы, увеличивается на 1 при каждом NewPagePageWidth: Integer
- Ширина листа в пикселахPrinterIndex: Integer
- Номер используемого принтера по списку доступных принтеров PrintersPrinters: TStrings
- Список доступных принтеровPrinting: Boolean
- Флаг, показывающий, что сейчас идет процесс печатиTitle: string
- Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
Методы TPrinter[править | править код]
AssignPrn
- Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.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;
begin
GetPrinterInfo;
Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),
'Этот текст печатается с отступом 30 мм от левого края и ' +
'55 мм от верха при любом разрешении принтера');
end;
Данную методику можно с успехом применять для печати картинок - зная размер картинки можно пересчитать ее размеры в пикселах для текущего разрешения принтера, масштабировать, и затем уже распечатать.
Иначе на матричном принтере (180 dpi) картинка будет огромной, а на качественном струйнике (720 dpi) - микроскопической.
P.S. Мой комментарий.
Я производил печать следующим образом:
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;
Удачи!
Author: DenKop@mail.ru
Source: Взято с сайта http://blackman.wp-club.net/
ID: 03264