Печать в delphi

Материал из DRKB


Печать в delphi

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


Печать текста в файл принтера[править | править код]

Листинг 1

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;

// Выбор шрифта и связывание его с memo1
procedure TForm1.Button3Click(Sender: TObject);
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[править | править код]

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

Значительно более гибкие средства обеспечивает свойство Printer.Canvas. Покажем, как с его помощью можно напечатать текст, содержащийся в редакторе Memo1 (printtext.dpr, листинг 2):

Листинг 2

// Печать содержимого редактора c помощью свойства Printer.Canvas
procedure TForm1.Button2Click(Sender: TObject);
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;
      end;
    end; // with canvas do
    EndDoc;
  end; // with printer do
  Screen.Cursor := crDefault;
end;


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

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

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


Печать изображений[править | править код]

with printer do
begin
  BeginDoc;
  Canvas.StretchDraw(Canvas.Cliprect, Image1.Picture.Graphic);
  EndDoc;
end;


Source: http://www.delphi.h5.ru/
ID: 03261