Звонок в фирму, которая занимается ремонтом компьютеров:
- Мой принтер начал плохо печатать!
- Вероятно его надо просто почистить. Это стоит $50. Но для Вас будет лучше, если Вы прочтете инструкцию и выполните эту работу сами.
Клиент, удивленный такой откровенностью спрашивает:
- А Ваш босс знает, что Вы таким образом препятствуете бизнесу?
- На самом деле, это его идея. Мы получаем куда больше прибыли, когда позволяем нашим клиентам сначала самим попытаться что-то отремонтировать.
Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers :
СВОЙСТВА
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 - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати
МЕТОДЫ
AssignPrn(f: TextFile) - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях.
Abort - Сбросить печать
BeginDoc - Начать печать
NewPage - Начать новую страницу
EndDoc - Завершить печать.
Пример:
procedure TForm1.Button1Click(Sender: TObject);
beginwith Printer dobegin
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) - микроскопической.
Я производил печать следующим образом:
procedure TForm6.SpeedButton1Click(Sender: TObject);
var
PRect: Trect;
PBitMap: TBitmap;
begin
PBitmap:=TBitMap.Create;
PBitmap.LoadFromFile('C:\1.bmp');
with PRect dobegin
left:=0;
top:=0;
right:=Printer.PageWidth;
Bottom:=Printer.PageHeight;
end;
with printer dobegin
BeginDoc;
font.name:='Times New Roman';
Canvas.StretchDraw(PRect,Bitmap);
EndDoc;
end;
PBitmap.Free;
end;
Работа с принтером в Delphi: управление процессом печати, использование объекта TPrinter и функций API для определения параметров принтера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.