Использование компонентов TPrinterDialog

и TpinterSetupDialog

Для того, чтобы включить в программу диалоговые окна выбора таких опций печати, как количество копий, упорядочивание, ориентация страницы достаточно поместить на форму компонент TPrinterDialog и добавить несколько строк кода. Ваше приложение теперь будет иметь диалоговые окна печати. Код, выполняющий это, выглядит так:

if PrintDialog1.Execute then

begin

{ваш код печати}

end;

При выполнении этого кода появляется стандартное диалоговое окно пе-

чати Windows, предлагающее пользователю меню предстоящей печати. После того, как пользователь сделает выбор, печать выполняется с использованием заданных установок, за исключением числа копий, что требует организации цикла.

Чтобы увидеть это в работе, модифицируйте программу печати файла, чтобы вызывался диалог печати. Сделайте копию предыдущей версии, сохранив ее под новыми именами. Сначала загрузите FILE2POB.DPR и сохраните его как PRNDLG.PAS. Когда сделаете некоторые простые изменения, можете проверить особенности диалога печати. Со страницы Dialogs возьмите компонент PrintDialog и поместите его на форму. Модифицируйте код кнопки "Печать", как показано в листинге 9.8.

Листинг 9.8. Добавление диалога печати

_________

Procedure PrintFile;

Var

F : TextFile;

TempStr, PageNum : String;

Ctr, x, PHeight, LineSpace: Integer;

begin

Ctr:=l;

{Открытие текстового файла, который надо печатать}

AssignFile(F, Fname) ;

Reset(F) ;

if PrintDialogI.Execute then

Begin

{Начало печати}

Printer.BeginDoc;

{Извлечение высоты страницы}

PHeight:=Printer.PageHeight;

{Вычисление расстояния между строками,

исходя из 60 строк на странице}

LineSpace := PHeight DIV 60;

{Извлечение номера текущей печатаемой страницы}

PageNum:=IntToStr(Printer.PageNumber);

{Обновление метки с номером текущей страницы}

Labell.Caption:='Теперь печатается '+ Fname +

' Страница ' + PageNum;

While Not Eof(F) Do

begin

(Чтение строки текста из файла в TempStr}

Readln(F, TempStr);

{Содержимое TempStr посылается на принтер}

Printer.Canvas.TextOut(0, х, TempStr);

{Увеличение х на соответствующее число пикселов

для печати следующей строки}

х := x+LineSpace;

{Подсчет числа напечатанных строк}

Ctr := Ctr + l;

{Если напечатано 60 строк, то начало новой страницы,

извлечение номера страницы и сброс счетчиков}

If Ctr > 59 then

begin

Printer.NewPage;

x := 0;

Ctr:= 0;

PageNum := IntToStr(Printer.PageNumber);

Labell.Caption := 'Теперь печатается '+ Fname +

' Страница ' + PageNum;

end;

end;

{ Закрытие текстового файла и запуск вывода

текста на принтер}

CloseFile(F);

Printer.EndDoc;

Labell.Caption := 'Печать закончена!' +'

' Число страниц = '+ PageNum;

end;

end;

_____________________________________________________________

Единственное отличие от предыдущей программы состоит в оператоpax:

if PrintDialogl.Execute then

begin

{код печати}

end;

Когда вы запустите программу и зададите печать, появится диалоговое

окно печати (см. фиг. 9.8). В этом окне пользователь может установить требуемые опции прежде, чем начнет печатать. Можно вызвать диалоговое окно свойств - опций печати, (см. фиг. 9.9) нажав соответствующую кнопку.

Фиг. 9.8

Диалоговое окно печати

Фиг. 9.9

Диалоговое окно опций печати

Шрифты и их размеры

Изменение шрифтов и их размеров так же просто. Предположим, например, что вы хотите изменить размер шрифта на 18, а сам шрифт на Times New Roman Cyr. Свойство Font канвы позволяет вам это сделать. Добавляя следующие строки к стандартной программе печати, вы легко можете изменить шрифт:

{Установка размера шрифта)

Printer.Canvas.Font.Size := 18;

{Установка типа шрифта}

Printer.Canvas.Font.Name := 'Times New Roman Cyr';

Впрочем, одна проблема остается. Исходная программа принимала по умолчанию размер шрифта 10 и предполагала, что на странице размещается 60 строк. Когда вы меняете шрифты и их размеры, прежняя программа не будет работать нормально.

Чтобы решить эту проблему, добавьте оператор, который вычисляет число строк на странице, исходя из размера шрифта. Например, приведенный ниже оператор добавляет 10 к размеру шрифта и вычисляет переменную LinesPerPage (число строк на странице) и переменную LineSpace (расстояние между строками) так, что остается междустрочное пространство:

{Расчет числа строк на странице исходя из размера шрифта}

LinesPerPage := PHeight Div (FontSize + 10);

{Расчет расстояние между строками исходя из числа строк

на странице}

LineSpace := PHeighn Div LinesPerPage;

Новыми переменными, которые добавляются для обеспечения этих изменений, являются FontSise и LinesPerPage. Добавьте эти изменения к коду кнопки "Печать". Вы получите текст, приведенный в листинге 9.9.

Листинг 9.9. Код кнопки "Печать"

______________________________________________________________

Procedure TFormI.Button2Click(Sender: TObject);

Var

F : TextFile;

TempStr,PageNum : String;

Ctr,x,PHeight, LineSpace, LinesPerPage, FontSize : Integer;

begin

Ctr := l;

{Открытие текстового файла, который надо печатать}

AssignFile(F, Fname);

Reset(F);

if PrintDialogl.Execute then

Begin

{Начало печати}

Printer.BeginDoc;

{Извлечение высоты страницы}

PHeight:=Printer.PageHeight;

{Установка размера шрифта 18}

Printer.Canvas.Font.Size:=18;

{Установка типа шрифта}

Printer.Canvas.Font.Name:='Times New Roman Cyr';

(Расчет числа строк на странице, основанное на размере

шрифта + 10 для междустрочного расстояния}

LinesPerPage:=PHeight Div (FontSize+10);

(Расчет расстояния между строками исходя

из числа строк на странице}

LineSpace := PHeight DIV LinesPerPage;

(Извлечение номера текущей печатаемой страницы}

PageNum:=IntToStr(Printer.PageNumber);

(Обновление метки с номером текущей страницы}

Labell.Caption:='Теперь печатается '+ Fname +

' Страница ' + PageNum;

While Not Eof F Do

begin

(Чтение строки текста из файла в TempStr}

Readln(F, TempStr);

(Содержимое TempStr посылается на принтер}

Printer.Canvas.TextOut(0, х, TempStr);

(Увеличение х на соответствующее число пикселов

для печати следующей строки}

х := x+LineSpace;

(Подсчет числа напечатанных строк}

Ctr := Ctr+l;

(Если напечатано LinesPerPage строк, то начало новой

страницы, извлечение номера страницы и сброс счетчиков}

If Ctr > LinesPerPage-1 then

begin

Printer.NewPage;

X := 0;

Ctr := 0;

PageNum := IntToStr(Printer.PageNumber);

Labell.Caption := 'Теперь печатается '+ Fname +

' Страница ' + PageNum;

end;

end;

(Закрытие текстового файла и запуск вывода текста на принтер}

CloseFile(F);

Printer.EndDoc;

Labell.Caption := 'Печать закончена!' + ' Число страниц = '+ PageNum;

end;

end;

_________

Программа печатает текстовые файлы в 18-ом кегле шрифта Times New Roman Cyr, вычисляет количество строк текста, умещающегося на странице, и начинает в надлежащем месте новую страницу. Используя подобную методику, вы можете позволить пользователю выбрать шрифт посредством диалогового окна шрифтов. Тогда вы будете получать информацию о шрифте от пользователя, а не навязывать ему свой шрифт.

Завершите программу добавлением диалога FontDialog, чтобы дать возможность пользователю выбрать шрифт, его размер, стиль и т. д. Добавьте на форму новую кнопку "Шрифт". Добавьте также команды, обеспечивающие программе возможность печатать число копий, заданное заказчиком.

Для изменения установки шрифта вы можете использовать свойство Font, а для его подсвойств получать информацию из FontDialog и передавать ее канве. Оператор

Printer.Canvas.Font.Size := FontDialogI.Font.Sise;

устанавливает размер шрифта по информации, полученной из диалогового окна "Шрифт". Оператор

Printer.Canvas.Font.Name := / Times New Roman Cyr';

устанавливает тип шрифта Times New Roman Cyr. А оператор

Printer.Canvas.Font.Type := FontDialogI.Font.Type;

устанавливает тип шрифта из диалогового окна "Шрифт".

Для печати нескольких копий надо создать цикл, заключающий в себе операторы печати и выполняющийся столько раз, сколько указано пользователем. Чтобы узнать заданное число копий, напишите следующий оператор:

NumCopies : = PrintDialogI.Copies;

Число копий будет храниться в переменной NumCopies.

Чтобы сделать эти изменения, модифицируйте код кнопки "Печать" так, как показано в листинге 9.10. Добавьте вторую метку на форму непосредственно под Label 1. Обратите особое внимание на приведенную программу: некоторые строки в ней сдвинуты, чтобы проще было видеть циклы.

Листинг 9.10. Кнопка "Печать" с выбором шрифта и числа копий

_________

Procedure TFormI.Button2Click(Sender: TObject);

Var

F : TextFile;

TempStr, PageNum : String;

Ctr, x, PHeight, LineSpace, LinesPerPage,

FontSize, CopyNum, NumCopies : Integer;

begin

if PrintDialogI.Execute then

begin

Ctr := l;

{Открытие текстового файла, который надо печатать}

AssignFile(F, Fname) ;

{Извлечение числа печатаемых копий из диалога печати)

NumCopies := Print Dialogi.Copies;

{Цикл печати копий}

for CopyNum := 1 to NumCopies do

begin

{Переход к началу файла}

Reset(F);

{Очистка счетчиков для следующей страницы}

х := 0;

Ctr := 0;

{Начало печати}

Printer.BeginDoc;

{Извлечение высоты страницы}

Pheight := Printer.PageHeight;

{Установка размера шрифта, заданного в диалоге печати}

Printer.Canvas.Font.Size:=FontDialogl.Font.Size;

{Установка типа шрифта, заданного в диалоге печати};

Printer.Canvas.Font.Name := FontDialogl.Font.Name;

{Установка стиля шрифта, заданного в диалоге печати}

Printer.Canvas.Font.Style := FontDialogl.Font.Style;

{Расчет числа строк на странице, основанное

на размере шрифта + 10 для междустрочного расстояния}

LinesPerPage := PHeight Div (FontSize+10);

(Расчет расстояния между строками исходя

из числа строк на странице}

LineSpace := PHeight DIV LinesPerPage;

(Извлечение номера текущей печатаемой страницы}

PageNum := IntToStr(Printer.PageNumber) ;

(Обновление метки с номером текущей страницы}

Labell.Caption := 'Теперь печатается ' + Fname +

' Страница ' + PageNum,

While Not Eof(F) do

begin

(Чтение строки текста из файла в TempStr}

Readln(F, TempStr);

(Содержимое TempStr посылается на принтер}

Printer.Canvas.TextOut(0, х, TempStr);

(Увеличение х на соответствующее число пикселов

для печати следующей строки}

х := x+LineSpace;

(Подсчет числа напечатанных строк}

Ctr := Ctr+l;

(Если напечатано LinesPerPage строк, то начало новой

страницы,извлечение номера страницы и сброс счетчиков}

If Ctr > LinesPerPage-1 then

begin

Printer.NewPage;

x := 0;

Ctr := 0;

PageNum := IntToStr(Printer.PageNumber);

Labell.Caption := 'Теперь печатается ' + Fname +

' Страница ' + PageNum;

end;

end;

(Закрытие текстового файла и запуск

вывода текста на принтер}

CloseFile(F);

Printer.EndDoc;

Labell.Caption := 'Печать закончена!' +

' Число страниц = '+ PageNum;

Label2.Caption := 'Число копий = ' + IntToStr(NumCopies) ;

end;

end;

end;

_________

Благодаря этим изменениям программа считывает опции, заданные в диалоговом окне «Шрифт», показанном на фиг. 9.10, и использует их при формировании задания для принтера. Печать выполняется столько раз, сколько указано пользователем.

Вы можете посмотреть другие полезные свойства, воспользовавшись встроенной в Delphi оперативной справочной системой. После того, как вы произвели все изменения в программе, она должна иметь вид, представленный в листинге 9.11.

Фиг. 9.10

Диалоговое окно «Шрифт»

Листинг 9.11. Использование диалоговых окон печати и шрифта

_________

Unit Prndig;

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, Printers;

type

TFormI = class(TForm)

Buttoni: TButton;

OpenDialog1: TOpenDialog;

Button2: TButton;

Label1: TLabel;

PrintDialogI: TPrintDialog;

FontDialog1: TFontDialog;

Button3: TButton;

Label2: TLabel;

Pocedure ButtonlClick(Sender: TObject) ;

Procedure Button2Click(Sender: TObject);

Procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Formi: TFormI;

Implementation

{$R *.DFM}

Var

Fname : String;

Procedure TFormI.ButtonlClick(Sender: TObject);

begin

if OpenDialogl.Execute then

begin

Fname := OpenDialogl.FileName;

Labell.Caption := ' Готов к печати ' + Fname;

end;

end;

Procedure TForml.Button2Click( Sender: TObject);

Var

F : TextFile;

TempStr, PageNum : String;

Ctr, x, PHeight, LineSpace, LinesPerPage, •

FontSize, CopyNum, NumCopies: Integer;

begin

if PrintDialogI.Execute then

begin

Ctr := l;

{Открытие текстового файла, .который надо печатать}

AssignFile(F, Fname);

(Извлечение числа печатаемых копий из диалога печати}

NumCopies := PrintDialogl.Copies;

{Цикл печати копий}

for CopyNum := 1 to NumCopies do

begin

{Переход к началу файла}

Reset(F);

(Очистка счетчиков для следующей страницы}

х := 0;

Ctr := 0;

{Начало печати}

Printer.BeginDoc;

{Извлечение высоты страницы}

Pheight := Printer.PageHeight;

{Установка размера шрифта, заданного в диалоге печати}

Printer.Canvas.Font.Size := FontDialogl.Font.Size;

{Установка типа шрифта, заданного в диалоге печати}

Printer.Canvas.Font.Name := FontDialogl.Font.Name;

{Установка стиля шрифта, заданного в диалоге печати}

Printer.Canvas.Font.Style := FontDialogl.Font.Style;

{Расчет числа строк на странице, основанное

на размере шрифта + 10 для междустрочного расстояния}

LinesPerPage := PHeight Div (FontSize+10);

{Расчет расстояния между строками исходя

из числа строк на странице}

LineSpace := PHeight DIV LinesPerPage;

{Извлечение номера текущей печатаемой страницы}

PageNum := IntToStr(Printer.PageNumber);

(Обновление метки с номером текущей страницы}

Label1.Caption := 'Теперь печатается ' + Fname +

' Страница ' + PageNum;

While Not Eof(F) do

begin

{Чтение строки текста из файла в TempStr}

Readln(F, TempStr);

{Содержимое TempStr посылается на принтер}

Printer.Canvas.TextOut(0, x, TempStr);

{Увеличение x на соответствующее число пикселов

для печати следующей строки}

x := x+LineSpace;

{Подсчет числа напечатанных строк}

Ctr := Ctr + l;

{Если напечатано LinesPerPage строк, то начало новой

страницы, извлечение номера страницы и сброс счетчиков)

If Ctr > LinesPerPage-1 then

begin

Printer.NewPage;

X := 0;

Ctr := 0;

PageNum := IntToStr(Printer.PageNumber);

Labell.Caption := 'Теперь печатается '+ Fname +

' Страница ' + PageNum;

end;

end;

{Закрытие текстового файла и запуск вывода текста на принтер}

CloseFile(F);

Printer.EndDoc;

Labell.Caption := 'Печать закончена!' + ' Число страниц = '+ PageNum;

Label2.Caption:='Число копий = ' + IntToStr(NumCopies);

end;

end;

end;

Procedure Tform1.Button3Click(Sender: TObject) ;

begin

FontDialogI.Execute;

end;

end.

_____________________________________________________________

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

Кнопка "Шрифт" позволяет выбрать используемый при печати шрифт с помощью стандартного для Windows диалогового окна "Шрифт". Кнопка "Печать" высвечивает на экране стандартный в Windows диалог "Печать". Как видите, большая часть кода связан с обработкой события OnClick кнопки "Печать".

Окончательный вид формы программы на экране показан на фиг. 9.11.

Работа 10.

ВЫВОД НА ПРИНТЕР ГРАФИКИ

Цель работы: Изучить методы вывода графической информации на принтер.

Предварительные сведения

Печать графики на принтере - это почти то же, что и вывод ее на экран. Для печати используется свойство Canvas объекта TPrinter, его подсвойства и методы, позволяющие рисовать или размещать графику. При этом графика сначала выводится на экран, а затем после ее просмотра и редактирования, код модифицируется и графика выводится на принтер.

Рассмотрим, например, следующий код. Он рисует окружность на поверхности формы Form1 в верхнем левом углу.

begin

(Установка ширины пера в 5 пикселов}

Form1.Canvas.Pen.Width := 5;

{Рисование эллипса с левым верхним углом в точке 0,0

и нижним правым углом в точке 200,200}

Forml.Canvas.Ellipse(0, 0, 200, 200);

end;

Заметим, что окружность является частным случаем эллипса и для ее рисование используется процедура:

Ellipse(0, 0, 200, 200);

Следующий код рисует ту же окружность при том же положении на канве принтера и посылает ее на принтер:

begin

{Открытие принтера}

Printer.BeginDoc ;

{Установка ширины пера в 5 пикселов}

Printer.Canvas.Pen.Width := 5;

{Рисование эллипса с левым верхним углом в точке 0,0

и нижним правым углом в точке 200,200}

Printer.Canvas.Ellipse(О, О, 200, 200);

{Завершение подготовки графики, печать на принтере}

Printer.EndDoc;

end;

Как видно, чтобы послать графику на принтер, достаточно в предыдущий код вывода на форму добавить операторы BeginDoc и EndDoc и заменить Form1 на Printer, чтобы направить данные на канву принтера вместо канвы формы. Рассмотренные два кода можно объединить в одной программе, предусмотрев в ней две кнопки: «Показать на экране» и «Вывести на принтер». Тогда графику можно посылать по желанию как на принтер, так и на экран.

Теперь создадим программу, которая позволит использовать диалоговое окно «Открыть» для выбора графического файла, выводимого на экран и на принтер. Тип файла может быть таким, как, например, битовая матрица (*.bmp) или метафайл Windows (*.wmf). В Delphi для хранения графики на экране удобно использовать компонент Image, а для переноса изображения на канву принтера - метод CopyRect, который посылает изображение на принтер. В этой программе можно предусмотреть коэффициент масштабирования размера конечной распечатки, а также команды для печати графического изображения в центре страницы.

Фиг.10.1

Создадим форму, показанную на фиг.10.1, со следующими компонентами:

Количество Компонент
Кнопка
Image
OpenDialog
Панель
Mетка
SpinEdit (со страницы Samples)

Создайте новый проект, назвав его PrintPic.dpr, а модуль - PicPrint.pas. Разместите компоненты на форме, как показано на фиг.10.1. Замените заголовок формы на "Печать изображения". Замените названия кнопок на "Загрузка" и "Печать". Добавьте фильтры к компоненту OpenDialog для графических файлов (*.bmp и *.wmf) и для других файлов. Для компонента SpinEdit установите MinValue на 1 и МахValue на 10. Замените заголовок Label1 на "Делитель размера", а заголовок Label2 - на "Графическая область". Измените значение свойства Image1.Stretch на True, чтобы размер изображения подгонялся, если возможно, под окно изображения при загрузке. Убедитесь, что свойство AutoSize установлено в False.

Фиг.10.2. Форма печати изображений

При размещении на форме панели изображения, ей необходимо придать разумные размеры и расположить так, чтобы свойства Тор и Left были равны 0. Позиционирование (установку их на 0) можно также выполнить в Инспекторе объектов.

Чтобы загрузить изображение, используется метод LoadFromFile для панели изображения, которую вы поместили на форму. В этом случае используйте имя файла из OpenDialog как параметр метода LoadFromFile. Изображение загрузится и будет отображено на экране.

If OpenGialog1.Execute then

Imagel.Picture.LoadFromFile(OpenDialogI.FileName);

Для того, чтобы напечатать изображение, надо знать, где центр канвы, чтобы совместить с ним центр изображения. Следующие операторы получают координаты х и у центра делением на 2 высоты и ширины страницы печати. Они сохраняются в переменных CenterX и CenterY.

(Определение центра канвы}

PHeight := Printer.PageHeight;

PWidth := Printer.PageWidth;

CenterX := PWidth div 2;

CenterY := PHeight div 2;

Для вычисления координат, исходя из заданного пользователем масштабного коэффициента, прежде всего, необходимо получить величину этого коэффициента из свойства Value компонента SpinEdit. Чтобы разместить изображение, нужно знать координаты х и у верхнего левого и нижнего правого углов. Соответствующие переменные показаны в следующей таблице:

Переменная Позиция
Х1 Левая
Y1 Верхняя
Х2 Правая
Y2 Нижняя

Следующие операторы вычисляют координаты на основании коэффициента масштабирования, заданного пользователем:

{Расчет центра на основании масштабного коэффициента пользователя}

SDiv := SpinEditl.Value;

XI := CenterX - (PWidth div (SDiv*2));

Y1 := CenterY - (PHeight div (SDiv*2));

X2 := CenterX + (PWidth div (SDiv*2));

Y2 := CenterY + (PHeight div (SDiv*2));

Масштабный коэффициент пользователя умножается на два. Затем на этот результат делится ширина и высота страницы. Затем полученные значения вычитаются или прибавляются к величинам CenterX и CenterY. Если пользователь выберет по умолчанию масштабный коэффициент равным 1, то изображение печатается центрированным относительно страницы и занимает ее всю. Если страница имеет размер 2000х2000 пикселов, то координаты центра равны 1000, 1000. Например:

XI = 1000 - (2000 div (1*2)) = 1000 - 1000 = 0;

X2 = 1000 + (2000 div (1*2)) = 1000 + 1000 = 2000;

Таким образом, X1=0, т.е. соответствует левой кромке страницы, а Х2=2000, т.е. соответствует правой кромке страницы. В данном случае изображение будет занимать всю страницу. Изменяя масштабный коэффициент, можно уменьшить размер напечатанного изображения. Для деления используется операция div, потому что работа идет с целыми числами и надо отбросить остаток от деления. По этой формуле изображение всегда будет печататься центрированным относительно страницы, независимо от масштабного коэффициента.

Чтобы поместить графику на канву принтера, надо использовать метод CopyRect, копирующий прямоугольную область с одной канвы на другую:

procedure CopyRect(Dest : TRect; Canvas : Tcanvas;

Source : TRect);

Исходный и конечный прямоугольники передаются как переменные типа TRect. В данном случае исходной канвой является канва Form1.

Вы помещаете окно изображения в точку (0,0), потому что оператор CopyRect берет изображение из канвы формы, а не непосредственно из панели Image. Если вы установите панель изображения в координаты (0,0) области клиента, то вам не придется беспокоится о смещениях при вычислениях. Если бы вы сдвинули панель изображения в другое место, не сопровождая это вычислением величин смещения, то могли бы потерять часть или все изображение, потому что оно оказалось бы вне прямоугольной области, которую вы копируете.

Так как CopyRect использует две переменные типа TRect, необходимо объявить две переменные этого типа и ввести в них данные. Объявление переменных имеет вид:

Var

PrnRect, ImgRect : TRect;

TRect определена в модуле Windows как запись следующего вида:

TRect = record

case Integer of

0: (Left, Top, Right, Bottom : Integer);

1: (TopLeft, BottomRight : TPoint);

end;

Как видно, засылаются четыре величины. Затем используется функция Rect для сохранения данных в новых переменных. Параметрами функции Rect являются координаты X1, Y1, X2, Y2 - Left (левая), Тор (верхняя), Right (правая). Bottom (нижняя), а возвращает эта функция запись типа TRect.

Пример:

{Сохранение желательного размера канвы компонента Printer

в переменной PrnRect}

PrnRect := Rect(X1, Y1, X2, Y2);

{Сохранение размера канвы компонента Image

в переменной ImgRect}

ImgRect := Rect(0, 0, Image2.Width, Image2.Height);

После того, как определены значения переменных PrnRect и ImgRect, можно использовать эти переменные в операторе метода CopyRect для копирования изображения на канву принтера:

{Копирование изображения с панели Image на канву принтера}

Printer.Canvas.CopyRect(PrnRect, Form1.Canvas, ImgRect);

Листинг 10.1 показывает полный текст программы "Печать изображения". Изучите включенные в нее комментарии и испытайте эту программу.

Листинг 10.1. Программа печати изображения

_____________________________________________________________

Unit PicPrint;

Interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, Printers, StdCtrls, ExtCtrls, Spin;

type

Tform1 = class(TForm)

Button1: TButton;

Button2: TButton;

OpenDialog1: TOpenDialog;

Image1: ТImage;

SpinEdit1: TSpinEdit;

Panel1: TPanel;

Label1: ТLabel;

Label2: TLabel;

Procedure Button1Click(Sender: TObject);

Procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TFom1;

Implementation

($R *.DFM}

Var

PHeight, PWidth : Integer;

Procedure Tform1.Button1Click(Sender: TObject);

Var

PrnRect, ImgRect : TRect;

CenterX, CenterY, X1, Y1, X2, Y2, Sdiv : Integer;

begin

Panel1.Caption := 'Пeчaть ...':

Printer.BeginDoc;

(Определение центра канвы}

PHeight := Printer.PageHeight;

PWidth := Printer.PageWidth;

CenterX := PWidth div 2;

CenterY := PHeight div 2;

(Расчет центра с учетом масшт. Коэффициента пользователя}

Sdiv := Spinfdit1.Value;

X1 := CenterX -(PWidth div (SDiv*2));

Y1 := CenterY -(PHeight div (Sdiv*2));

X2 := CenterX +(PWidth div (Sdiv*2));

Y2 := CenterY +(PHeight div (Sdiv*2));

{Сохранение желаемого размера области канвы Printer

в PrnRect}

PrnRect := Rect(X1, Y1, X2, Y2);

{Сохранение размера канвы компонента Image

в переменной ImgRect}

ImgRect:= Rect(0, 0, Image1.Width, Image1.Height);

{Копирование изображения из окна Image на канву принтера}

Printer.Canvas.CopyRect(PrnRect, Form1.Canvas, ImgRect);

Printer.EndDoc;

Panel1.Caption := 'Печать закончена!';

end;

Procedure Tform1.Button2Click(Sender: TObject);

begin

{Загрузка графики в панель изображения на форме}

If OpenDialog1.Execute then

begin

Label2.Visible := False;

Image1.Picture.LoadFromFile(OpenDialog1.FileName);

end;

end;

end.

_____________________________________________________________

Программа позволяет пользователю выбирать графический файл с помощью кнопки "Загрузка". Изображение отображается на форме в компоненте Image. Затем изображение может быть напечатано с помощью кнопки "Печать". Когда нажимается эта кнопка, программа копирует изображение из канвы формы и посылает его на принтер. Программа позволяет выбрать графическое изображение (*.bmp или *.wmf), выбрать число от 1 до 10 для масштабного коэффициента и распечатать изображение. Оно будет изменено по размеру и центрировано на странице.

Индивидуальные задания

Для своего варианта выберите самостоятельно примеры работы с графикой, иллюстрирующие рассмотренные сведения.

ПРИЛОЖЕНИЯ

КОМАНДЫ ОСНОВНОГО МЕНЮ

В меню File расположены команды для выполнения операций с проектами, модулями и файлами.

INew Позволяет выбрать тип элемента из репозитория (архива, в котором хранятся заготовки для новых программ) и создать его
New Application Создает новый проект, состоящий из формы, модуля и файла проекта
New Form Создает новую форму и подключает ее к проекту  
New Data Module Создает новый модуль данны и подключает ее к проекту  
Open Открывает ранее созданный проект, модуль, форму или текстовой файл
Reopen Вызывает список ранее загружавшихся проектов и форм для выбора и повторной загрузки
Save Сохраняет текущую форму или модуль или файл
Save As Сохраняет текущую форму с новым именем
Save Project As Сохраняет текущий проект с новым именем
Save All Сохраняет все открытые файлы, проект и используемые им модули
Close Закрывает текущую форму
CIose All Закрывает все открытые файлы
|Use Unit Добавляет имя указанного модуля в список используемых модулей (USES) текущего активного модуля
Add to Project Добавляет файл к проекту
Remove FromProject Удаляет файл из проекта
Print Выводит содержимое активного файла на печать
Exit Завершает работу Delphi

В меню Edit расположены команды, осуществляющие операции редактирования, работы с областью обмена данными, отмены действий и управления отображением компонентов.

     
Команда Описание  
Undo Этменяет ранее выполненные действия  
Redo Зосстанавпивает от  
Cut Вырезает выделенный объект и помещает его в буфер обмена данными  
Copy Копирует выделенный объект и или фрагмент текста программы и помещает его в буфер обмена данными  
Paste Копирует содержимое буфера обмена данными в редактор или форму  
Delete Удаляет выбранный объект или фрагмент программы  
Select All Выделяет все компоненты формы или весь текст програмы  
         
Align to Grid Выравнивает выбранный компонент по сетке
Bring to Front Перемещает выбранный компонент поверх других компонентов
Send to Back Перемещает выбранный компонент под другие компоненты
Align Выравнивает компоненты
Size Изменяет размер выделенных компонентов
Scale Изменяет размер всех компонентов в форме
Tab Order Изменяет порядок табуляции компонентов в активной форме
Creation Order Задает порядок создания невизуальных компонентов
Lock Controls Запрещает перемещение компонентов внутри формы
Add To Interface Позволяет определить новую процедуру, функцию или свойство компонента ActiveX

Меню Search предоставляет команды для поиска и замены, а также команды для поиска указанных символов и строк, содержащих ошибки найденные компилятором.

Команда Описание
Find Поиск указанного фрагмента текста
Find in files Поиск указанного текста в нескольких файлах, задаваемых в диалоговой панели
Replace Поиск указанного фрагмента текста и замена его новым текстом
Search Again Повторный поиск или повторная замена
Incremental Search Поиск текста по мере его ввода
Go to Line Number Перемещение курсора на строку с указанным номером
Show Last Compile Error Перемещение курсора на строку, содержащую ошибку, найденную компилятором
Find Error Поиск ошибки времени исполнения (run-time error)
Browse Symbol Показывает характеристики указанного символа программы по его имени

В меню View содержатся команды для отображения различной информации и вызова менеджера проектов, инспектора объектов, броузера объектов и других информационных утилит.

Команда Описание
Project Manager Менеджер проектов (Project Manager)
Project Source Отображает исходный текст файла проекта
Object Inspector Инспектор объектов (Object Inspector)
Alignment Palette Палитра выравнивания компонентов
Browser Броузер объектов (Object Browser)
Breakpoints Список точек останова (Breakpoints List)
Call Stack Стек вызовов (Call Stack)
Watches Список точек слежения за переменными (Watch List)
Threads Список потоков команд и их статус
Modules Список модулей, загружаемых при выполнении данного проекта
Component List Список компонентов
Window List Список открытых окон
Toggle Form/Unit Переключает активность из окна формы в окно текста программы и обратно
Unit Показывает окно текста программы
Forms Показывает окно формы
Type library Отображает содержимое библиотеки типов для компонентов ActiveX, серверов ActiveX и других СОМ-объектов
New Edit Window Открывает новое окно с текстом текущей программы
SpeedBar Отображает (прячет) панель быстрого доступа
Component Palette Отображает (прячет) палитру компонентов

В менюProject содержатся команды для компиляции и сборки проектов, а также для установки опций текущего проекта.

Команда Описание
Add to Project Добавляет файл к проекту
Remove from Project Удаляет файл из проекта
Import Type Library Импортирует в проект библиотеку типов элементов ActiveX
Add To Repository Добавляет проект в репозиторий объектов
Compile Компилирует модули, исходный текст которых изменился после последней компиляции
Build All Компилирует все модули и создает исполняемую программу
Syntax Check Проверяет синтаксическую правильность программы
Information Отображает информацию о проекте
Web Deployment Options Позволяет задать опции для внедрения компонента ActiveX или активной фирмы на Web-узел
Web Deploy Внедряет компонент ActiveX или активную форму на Web-узел
Options Задает опции компилятора и компоновщика, управляет рабочими каталогами

В менюRun расположены команды для отладки программ. Эти команды позволяют управлять различными функциями устроенного отладчика.

Команда Описание
Run Компилирует и выполняет программу
Parameters Задает параметры командной строки
Register ActiveX Server Регистрирует сервер ActiveX в реестре Windows
Unregister ActiveX Server Удаляет информацию о ранее зарегистрированном сервере ActiveX в реестре Windows
Step Over Пошагово выполняет программу
Trace Into Пошагово выполняет программу с заходом в подпрограммы
Trace To Next Source Line Пошагово выполняет программу до следующей строки исходного текста
Run To Cursor Выполняет программу до строки в окне редактора, на которой находится курсор
Show Execution Point Отображает оператор, на котором было прервано выполнение программы
Program Pause Приостанавливает выполнение программы
Program Reset Завершает выполнение программы
Add Watch Добавляет точку слежения за переменными
Add breakpoint Добавляет точку останова
Evaluate/Modify Позволяет узнать или изменить значение переменной

В менюComponent содержатся команды для создания компонентов, установки новых компонентов, импорта компонентов ActiveX, создания нового компонента на базе существующего и установки пакетов.

Команда Описание
New Component Вызывает окно эксперта компонентов
Install Component Помещает компонент в существующий или новый проект
Import ActiveX Control Импортирует компонент ActiveX
Create Component Template Сохраняет компонент как шаблон для создания других компонентов
Install Package Устанавливает пакеты, необходимые для прогона программы
Configure Palette Вызывает диалоговую панель конфигурации палитры компонентов

МенюDatabase содержит средства для работы с базами данных.

Команда Описание
Explore Вызывает инструмент исследования баз данных – Database Explorer или SQL Database (в зависимости от версии DELPHI)
SQL Monitor Вызывает инструмент запросов к БД - SQL Monitor
Form Wizard Вызывает окно эксперта форм для создания формы, отображающей наборы данных из удаленных или локальных БД

Из меню Tools доступны средства настройки среды, дополнительные утилиты, входящие в состав Delphi, а также репозиторий объектов.

Команда Описание
Environment Options Вызывает диалоговую панель настройки среды
Repository Вызывает репозиторий
Configure Tools Вызывает диалоговую панель редактирования опции Tools
Package Collection Editor Вызывает окно редактора пакетов
Image Editor Вызывает окно редактора графики
Database Desktop Вызывает инструмент обслуживания БД – Database Desktop

Меню Workgroups содержит средства для работы с коллективными проектами.

Команда Описание
Browse PVCS Projects Показывает окно коллективной работы нескольких программистов над одним проектом программы
Mange Archive Directories Показывает диалоговое окно управления архивом коллективного проекта программы
Add Project to Version Control Сохраняет текущую версию коллективного проекта
Set Data Directories Показывает диалоговое окно выбора каталогов для размещения версий коллективного проекта

В менюHelp содержатся команды для вызова различных разделов справочной системы и отображения диалоговой панели “О программе”.

Команда Описание
Contents Отображает содержание справочной системы
Keyword Search Выполняет поиск справки по ключевому слову
What's New Отображает справку по новым возможностям продукта
Getting Started Выводит онлайновый вариант книги “Getting Started”
Using Object Pascal Выводит онлайновый вариант книги “Using Object Pascal”
Developing Applications Выводит онлайновый вариант книги “Developing Applications”
Object and Component Reference Выводит онлайновый вариант книги “Object and Component Reference”
Borland Home Page Соединяет с главной страницей Web-узла фирмы Borland
Delphi Home Page Соединяет со страницей Web-узла фирмы Borland, посвященной Delphi
Borland Programs and Services Соединяет со страницей Web-узла фирмы Borland, посвященной программам и сервисам
About Отображает диалоговую панель “0 программе”

Приложение 2

СВОЙСТВА КОМПОНЕНТОВ

Наши рекомендации