Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

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

Автор: JB
http://www.asportal.h16.ru
13 июня 2006 года

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

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;

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог