Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
 

  Раздел: Компьютерная документация -> Программирование -> Delphi / Pascal

 

Секреты печати из программы на Delphi

Здравствуйте дорогие читатели. Сегодня мы разберем механизмы печати в программах Делфи.

TPrinter

Для упрощенного доступа к принтеру Delphi имеет стандартный объектTPrinter который находится в модуле Printers, в этом же модуле имеется функция Printer:

function Printer: TPrinter;
begin
  if FPrinter = nil then FPrinter := TPrinter.Create;
  Result := FPrinter;
end;

Как видно из листинга она проверяет был ли создан экземпляр объекта FPrinter:TPrinter, если нет, то создает и возвращает ссылку на него, что избвляет разработчика от необходимости создавать объект самому.

Вот основные методы и свойства объекта TPtinter.

Свойства:

СвойствоОписание
Aborted:booleanПоказывает, что процесс печати прерван
Canvas:TcanvasОбычный Canvas
Fonts:TstringsСписок шрифтов, поддерживаемых принтером
Handle:HDSHandle принтера для использования функций API
Printers:TstringsСписок принтеров
PrinterIndex:integerНомер используемого принтера в списке принтеров
Orientation:TprinterOrientationОриентация листа при печати : (poPortrait, poLandscape)
Title:stringИмя документа для диспетчера печати
PageWidth:integerШирина листа в пикселах
PageHeight:integerВысота листа в пикселах
PageNumber:integerНомер страницы
Printing:booleanФлаг процесса печати

Методы:

МетодОписание
AbortЭкстренно завершить печать
BeginDocНачать печать документа
NewPageПечать на новой странице
EndDocЗавершить печать документа

Простейший пример печати:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Printer.BeginDoc;
  Printer.Canvas.TextOut(200,200,'Delphi is cool');
  Printer.EndDoc;
end;

Настройки принтера

Для чтения настроек принтера можно пользоваться функциией GetDeviceCaps(DC:HDC,Index:integer):Integer, для ее вызова нам потребуется DC принтера (Printer.Handle). Второй параметр функии - это код того параметра настроек принтера который необходимо получить, его можно задать одной из констант:

Имя константыПараметр
DriverVersionверсия драйвера
HorzResГоризонтальный размер листа (в пикселах)
VertResВертикальный размер листа (в пикселах)
HorzSizeГоризонтальный размер листа (в милиметрах)
VertSizeВертикальный размер листа (в милиметрах)
LogPixelXРазрешение по горизонтали в dpi (пиксел / дюйм)
LogPixelYРазрешение по вертикали в dpi (пиксел / дюйм)

Теперь имея все эти данные мы можем распечатать документ с учетом полей и размеров шрифта.

И так поля практически у любого принтера имеется непечатаемая область (границы печати) и при установке полей печати документа необходимо учитывать эту непечатаемую область. Вот процедура вычисления границ печати:

var
  PixPerInchX,PixPerInchY,PageWidthInMM,PageHeightInMM,PhysOffsetX,PhysOffsetY,
  PageResX,PageResY,PhysPageWidth,PhysPageHeigth:integer;
  Margins:TRect;

procedure GetPrinterInfo;
var
  DC:HDC;
begin
  DC:=Printer.Handle;
  PixPerInchX:=GetDeviceCaps(DC,LOGPIXELSX);
  PixPerInchY:=GetDeviceCaps(DC,LOGPIXELSY);
  PageWidthInMM:=GetDeviceCaps(DC,HORZSIZE);
  PageHeightInMM:=GetDeviceCaps(DC,VERTSIZE);

  PhysOffsetX:=GetDeviceCaps(DC,PHYSICALOFFSETX);
  PhysOffsetY:=GetDeviceCaps(DC,PHYSICALOFFSETY);

  PhysPageWidth:=GetDeviceCaps(DC,PHYSICALWIDTH);
  PhysPageHeigth:=GetDeviceCaps(DC,PHYSICALHEIGHT);

  PageResX:=GetDeviceCaps(DC,HORZRES);
  PageResY:=GetDeviceCaps(DC,VERTRES);

  // границы печати
  Margins.Top:=round(PhysOffsetY/PixPerInchY*25.4);
  Margins.Left:=round(PhysOffsetX/PixPerInchX*25.4);

  Margins.Bottom:=round((PhysPageHeigth-PageResY-PhysOffsetY)/PixPerInchY*25.4);
  Margins.Right:=round((PhysPageWidth-PageResX-PhysOffsetX)/PixPerInchX*25.4);
end;

Теперь попробуем распечатать лист на котором будет рамка по периметру с отступами один сантиметр слева, справа и сверху и 1.5 см снизу.

procedure PrintMargins;
begin
  GetPrinterInfo;

  Printer.BeginDoc;
  Printer.Canvas.MoveTo(MilimetersToPixelsX(10-Margins.Left),
                        MilimetersToPixelsY(10-Margins.Top));
  Printer.Canvas.LineTo(MilimetersToPixelsX(10-Margins.Left),
                        MilimetersToPixelsY(PageHeightInMM-15+Margins.Bottom));
  Printer.Canvas.LineTo(MilimetersToPixelsX(PageWidthInMM-10+Margins.Right),
                        MilimetersToPixelsY(PageHeightInMM-15+Margins.Bottom));
  Printer.Canvas.LineTo(MilimetersToPixelsX(PageWidthInMM-10+Margins.Right),
                        MilimetersToPixelsY(10-Margins.Top));
  Printer.Canvas.LineTo(MilimetersToPixelsX(10-Margins.Left),
                        MilimetersToPixelsY(10-Margins.Top));
  Printer.EndDoc;
end;

А вот код процедуры печати текста обрамленного прямоугольником:

procedure TForm1.Button1Click(Sender: TObject);
var
  TextWidthMM:integer;
  TextHeightMM:integer;
begin
  GetPrinterInfo;

  Printer.BeginDoc;

  Printer.Canvas.Font.PixelsPerInch:=PixPerInchX;

  TextWidthMM:=round((Printer.Canvas.TextWidth('Печать')/PixPerInchX)*25.4);
  TextHeightMM:=round((Printer.Canvas.TextHeight('Печать')/PixPerInchY)*25.4);

  Printer.Canvas.Rectangle(MilimetersToPixelsX(19),MilimetersToPixelsY(19),
                           MilimetersToPixelsX(19+TextWidthMM+2),
                           MilimetersToPixelsY(19+TextHeightMM+2));
  Printer.Canvas.TextOut(MilimetersToPixelsX(20),MilimetersToPixelsY(20),'Печать');
  Printer.EndDoc;
end;

На этом пока все.

Автор: JB
Источник: www.asportal.h16.ru

Ссылки по теме
Алгоритмы Сортировки. Часть 1
Введение в Delphi 8
Работа с реестром в Delphi
Delphi и ресурсы компьютера
Советы начинающим программировать на Delphi
Структуры и базы данных, методы сортировки

Вся документация Pascal и Delphi

 

Компьютерная документация от А до Я - Главная

 

 
Интересное в сети
 
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full


Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.