Печать в Delphi

Объект Printer автоматически создается в случае, если в программе указана ссылка на модуль Printers. Этот объект предоставляет программисту все необходимое для того, чтобы научить приложение выводить данные на один из подключенных к компьютеру принтеров.

Вывод на принтер в Windows ничем не отличается от вывода на экран: в распоряжение программиста предоставляется свойство Canvas объекта Printer, содержащее набор чертежных инструментов, и методы, свойственные классу TCanvas. Размер листа бумаги в пикселах определяют свойства Height и Width, а набор принтерных шрифтов – свойство Fonts.

Печать текста

Существует множество способов печати текста на принтере. Прежде всего следует назвать глобальную процедуру AssignPrn (она определена в модуле Printers), позволяющую использовать принтер как текстовый файл и печатать текстовые строки с помощью процедуры WriteLn. В листинге 1 (PrintText.dpr) приведен полный текст модуля, на форме которого расположены многострочный текстовый редактор Memo1 и четыре кнопки: для выбора текстового файла и ввода его содержимого в редактор, для выбора нужного шрифта отображения/печати документа, для инициации процесса печати и для завершения работы программы.
unit Unit1;    
     
interface    
     
uses    
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;    
     
type    
  TForm1 = class(TForm)    
    Memo1: TMemo;    
    Button1: TButton;    
    Button2: TButton;    
    OpenDialog1: TOpenDialog;    
    BitBtn1: TBitBtn;    
    Button3: TButton;    
    FontDialog1: TFontDialog;    
    procedure Button1Click(Sender: TObject);    
    procedure Button2Click(Sender: TObject);    
    procedure Button3Click(Sender: TObject);    
  private    
    { Private declarations }    
  public    
    { Public declarations }    
  end;    
     
var    
  Form1: TForm1;    
     
implementation    
     
uses Printers;  // Эта ссылка обязательна!    
     
{$R *.DFM}    
     
procedure TForm1.Button1Click(Sender: TObject);    
// Выбор файла с текстом и его загрузка в редактор    
begin    
  if OpenDialog1.Execute then    
    Memo1.Lines.LoadFromFile(OpenDialog1.FileName)    
end;    
     
procedure TForm1.Button3Click(Sender: TObject);    
// Выбор шрифта и связывание его с Memo1    
begin    
  if FontDialog1.Execute then    
    Memo1.Font := FontDialog1.Font    
end;    
     
procedure TForm1.Button2Click(Sender: TObject);    
// Печать содержимого редактора как вывод в текстовый файл    
var    
  Prn: TextFile;    
  k: Integer;    
begin    
  AssignPrn(Prn); // Переназначаем вывод в файл на вывод в принтер     
  Rewrite(Prn);   // Готовим принтер к печати (аналог BeginDoc)    
  { Для печати используем такой же шрифт, как и для показа    
    в редакторе: }    
  Printer.Canvas.Font := Memo1.Font;    
  // Цикл печати:    
  for k := 0 to Memo1.Lines.Count-1 do    
    WriteLn(Prn, Memo1.Lines[k]);    
  CloseFile(Prn);  // Аналог EndDoc    
end;    
     
end.

Описанный способ печати — самый примитивный: с его помощью невозможно вывести линии, разделяющие колонки или строки, трудно форматировать текст, вставлять заголовки, номера страниц и т.д.

Значительно более гибкие средства обеспечивает свойство Printer.Canvas. Покажем, как с его помощью можно напечатать текст, содержащийся в редакторе Memo1 (PrintText.dpr, листинг 2):
procedure TForm1.Button2Click(Sender: TObject);   
// Печать содержимого редактора c помощью свойства Printer.Canvas   
var   
  Y,dY,X,k: Integer;   
  S: String;   
begin   
  if Memo1.Lines.Count=0 then Exit;   
  Screen.Cursor := crHourGlass;   
  with Printer do   
  begin   
    BeginDoc;   
    with Canvas do   
    begin   
      Font := Memo1.Font;   
      dY := TextHeight('1');    //    Определяем высоту строки   
      Y := 3*dY;                   // Отступ от верхнего края листа   
      X := PageWidth div 15;       // Отступ от левого края   
      for k := 0 to Memo1.Lines.Count-1    do   
      begin   
        // Выводим очередную строку   
        TextOut(X,Y,Memo1.Lines[k]);   
        // Смещаемся на следующую    строку листа   
        inc(Y,dY);   
        if PageHeight-Y<2*dY then         // Нижний край листа?   
        begin                             // Да   
          NewPage;                        // Переход на новый лист   
          // Выводим номер    страницы посередине листа:   
          S := '- '+IntToStr(PageNumber)+'    -';   
          TextOut((PageWidth-TextWidth(S))    div 2, dy, S);   
          // и отчеркиваем    его от текста:   
          MoveTo(X, 3*dy div    2);   
          LineTo(PageWidth-X,    9*dy div 4);   
          // Ордината    первой строки:   
          Y := 3*dY   
        end;  // if PageHeight-Y<2*dY    
      end;  // for k := 0 to Memo1.Lines.Count-1    do   
    end;  // with Canvas do   
    EndDoc;   
  end;  // with Printer do   
  Screen.Cursor := crDefault;   
end;

Как можно увидеть, прямое обращение к чертежным инструментам свойства Canvas требует от программиста значительно больших усилий, но зато предоставляет ему полный контроль над печатным изображением.

Во многих случаях для печати документа и внесения в него элементарных средств форматирования (печать общего заголовка, заголовка на каждой странице, номеров страниц и т.п.) проще использовать специальные компоненты, расположенные на странице QReport палитры компонентов Delphi. Эти компоненты разработаны для создания отчетов по базам данных, но могут с успехом использоваться и для печати обычных документов (PrintText.dpr).

Наконец, очень хороших результатов можно достичь, используя специализированные средства просмотра/печати документов, как, например, текстовый процессор MS Word.

Печать изображений

Печать изображений может показаться очень сложным делом, однако свойство Printer.Canvas содержит метод:
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic );

который легко справляется с этой задачей. При обращении к нему в качестве первого параметра указывается прямоугольная область, отводимая на поверхности листа для распечатки изображения, а в качестве второго — объект класса TGraphic, в котором хранится изображение, например:
with   Printer do        
begin    
  BeginDoc;    
  Canvas.StretchDraw(Canvas.ClipRect, Image1.Picture.Graphic);    
  EndDoc;    
end;
Теги:
Печать, Printer, Printers
Добавлено: 08 Апреля 2018 06:47:23 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...