Использование компонентов 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 | Удаляет файл из проекта |
Выводит содержимое активного файла на печать | |
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
СВОЙСТВА КОМПОНЕНТОВ