20.3. PRINTER
Объект Printer автоматически создается, если в программе указана ссылка на модуль printers. Этот объект предоставляет программисту все необходимое для того, чтобы научить программу выводить данные на один из подключенных к ПК принтеров.
Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство сап-vas объекта printer, содержащее набор чертежных инструментов и методы, свойственные классу TCanvas. Размер листа бумаги в пикселях принтера определяют свойства Height и Width, а набор принтерных шрифтов - свойство Fonts.
Свойства объекта printer:
property Aborted: Boolean; |
Содержит True, если выполнение предыдущего задания на печать было досрочно прекращено |
property Canvas: TCanvas;
|
Канва принтера - основной инструмент создания изображения на листе бумаги |
type TPrinterCapability = (pcCopies, pcOrientation, pcCollation) ; TPrinterCapabilities = set of TPrinterCapability; property Capabilities: TPrinter Capabilities; |
Содержит возможности текущей настройки драйвера принтера: pcCopies - может печататься несколько копий документа; pcOrien tation -драйвер поддерживает разную ориентацию листа бумаги; pcCollation -документ печатается в подбор по экземплярам |
property Copies: Integer;
|
Указывает требуемое количество копий документа |
property Fonts: TStrings; |
Содержит список всех доступных принтеру шрифтов |
TPrinterOrientation = (poPortrait, poLandscape) ; property Orientation: TPrinterOrientation; |
Определяет ориентацию листа бумаги: poPortrait вертикальная; poLandscape - горизонтальная |
property PageHeight: Integer;
|
Содержит высоту листа бумаги в пикселях принтера |
property PageNumber: Integers;
|
Содержит номер печатаемой страницы документа (начинается с 1) |
property PageWidth: Integer;
|
Содержит ширину листа бумаги в пикселях принтера |
property Printerlndex: Integer; |
Содержит индекс умалчиваемого принтера в списке Printers |
property Printers: TStrings; |
Содержит список всех доступных принтеров |
property Printing: Boolean;
|
Содержит True, если принтер занят печатью документа |
property Title: String; |
Содержит имя задания на печать |
Методы объекта printer: |
|
procedure Abort; |
Досрочно прекращает печать документа |
procedure BeginDoc; |
Начинает печать документа |
procedure EndDoc; |
Завершает печать документа |
procedure NewPage; |
Начинает печать новой страницы документа |
Вот как, например, можно напечатать текст, содержащийся в редакторе Memo 1:
procedure TForm1.Button1Click(Sender: TObject);
var
Y,dY,k: Integer;
begin
if Memol.Lines.Count=0 then Exit;
Screen.Cursor := crHourGlass;
with Printer do
begin
BeginDoc;
with Printer.Canvas do
begin
Font := Memol.Font;
dY := TextHeight('1'); // Определяем высоту строки
Y := 2*dY; // Отступ от верхнего края листа
for k := 0 to Memol.Lines.Count-1 do
begin
//Выводим очередную строку TextOut(О,Y,Memol.Lines[k]);
//Смещаемся на следующую строку листа
inc(Y,dY) ;
if PageHeight-Y<2*dY then
// Нижний край листа?
begin //Да
NewPage; //Переход на новый лист
// Выводим номер страницы
TextOut(0,0,'с.'+IntToStr(PageNumber)) ;
Y := 2*dY
end;
end;
end;
EndDoc;
end;
Screen.Cursor := crDefault;
end;
Замечу, что до обращения к BeginDoc программа не имеет никаких сведений о принтере, и поэтому широко распространенной ошибкой будет объединение такого рода:
with Printer, Printer.Canvas do
begin
BeginDoc;
Font.Size := 12;
end;
В этом фрагменте шрифт принтера вряд ли окажется нужного размера, т. к. относится к умалчиваемой канве некоторого абстрактного принтера. Лишь после обращения к BeginDoc канва получит истинные представления о возможностях принтера и сможет правильно управлять его свойствами. Нужно так:
Printer.BeginDoc; //Обращаемся к драйверу принтера
//и настраиваем нужным образом канву
with Printer.Canvas do
begin
Font.Size := 12;
end;
Во многих случаях для печати документа гораздо проще использовать специальные компоненты, расположенные на странице QRe-port галереи компонентов Delphi. Эти компоненты разработаны для создания отчетов по материалам, хранящимся в базах данных, но могут с успехом использоваться и для печати обычных документов. Центральный компонент QuickRep имеет метод preview, с помощью которого можно просмотреть образ печатного документа и при желании напечатать документ.
Методику использования компонентов QReport поясню на следующем примере. Пусть на форме Form1 имеется текстовый редактор Memol, просмотр содержимого которого в виде образа печатного документа открывает нажатие кнопки Button1. Создайте в проекте новую пустую форму Form2 и положите на нее компонент QuickRepl.
На этот компонент положите QRBand1, а на него - QRMemo1. Напишите такой обработчик нажатия кнопки Button1:
procedure TFormI.ButtonlClick(Sender: TObject);
begin
with Form2 do
begin
//Копируем содержимое Memol в QRMemo1:
QRMemoi.Lines.Assign(Memol.Lines);
//Используем установленный в Memol шрифт:
QRMemoi.Font := Memol.Font;
//Вызываем окно просмотра и печати документа:
QuickRepl.Preview
end;
end;
Окно просмотра образа печатного документа, появляющееся после щелчка по кнопке Buttoni, показано на рис. 20.1. Инструментальная кнопка В позволяет напечатать документ, а кнопка В - выбрать нужный принтер и настроить его параметры. При печати будут автоматически формироваться страницы документа, при необходимости они могут снабжаться заголовками, нумероваться и т. д.
Рис. 20.1 . Окно просмотра печатного документа