[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

Секреты печати из программы на 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




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 4892 сегодня - 0

Работа с таймером на Win API
06-06-2010   

Таймер - вещь в хозяйстве очень полезная. Если некое действие нужно повторять с определенной периодичностью, то таймер, это как раз то, что нужно... подробнее

Кол. просмотров: общее - 4905 сегодня - 0

Работа с мультимедийным таймером на Win API
06-06-2010   

Мы уже знакомы с системным таймером, сегодня познакомимся с мультимедийным, основное отличие которого, более высокая скорость (точность) работы... подробнее

Кол. просмотров: общее - 5052 сегодня - 0

Создание CheckBoxов средствами Win API
06-06-2010   

Сегодня наша программа научится работать с CheckBoxами. CheckBox можно представить как флаг, который можно установить или сбросить, и в зависимости от его состояния выполнять определенные действия... подробнее

Кол. просмотров: общее - 5287 сегодня - 0

Создание группы RadioButton средствами Win API
06-06-2010   

В прошлый раз мы сделали несколько радио-кнопок, которые автоматически объединялись в одну группу. Сейчас рассмотрим, как создавать несколько независимых групп радио-кнопок... подробнее

Кол. просмотров: общее - 4932 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects