2. Классы и компоненты Delphi,

предназначенные для создания изображений.

Компонент Timer — таймер

2.1. Общая характеристика

В Delphi имеется несколько классов общего назначения, позволяющих выводить гра­фические изображения на поверхность компонентов. К ним относятся классы: TFont (шрифт), ТРеn (карандаш), TBrush (кисть) и TCanvas (канва). В составе многих компо­нентов Delphi имеются свойства Font, Pen, Brush и Canvas соответствующего типа, при помощи которых создаются изображения любых рисунков и текстов. Предком классов TFont, TPen и TBrush является класс TGraphicsObject, происходящий непосредственно от класса TPersistent. Предком класса TCanvas является класс TPersistent.

В классе TGraphicsObject отметим событие (свойство) OnChange:

property OnChange: TNotifyEvent;

событие возникает при изменении графического объекта. После возникновения со­бытия графические объекты отображаются с обновленными значениями своих свойств.

В Delphi имеются компоненты, специально предназначенные для создания графичес­ких изображений:

Image - представляет собой удобное средство для отображения готовых гра­фических

файлов.

Shape - используется для создания на форме простых геометрических фигур –

квадратов, кругов, эллипсов и т. п.

PaintBox - позволяет на этапе выполнения программы создавать несложные ри­сунки на

своей канве Canvas; даёт нам простое окно с канвой для рисования

произвольных изображений. Канва (холст) содержится в свойстве Canvas

компонента, графические инструменты в свойствах Font, Pen и Brush, а

НЕ нашли? Не то? Что вы ищете?

собственно рисование осуществляется в обработчике события OnPaint.

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

2.2. Класс TFont

Класс TFont определяет характеристики шрифта, и свойства, имеющие этот классо­вый тип, присутствуют в любом компоненте, который может содержать некоторый текст. Характеристики шрифта в классе TFont задаются при помощи следующих свойств:

type TFontCharset = 0..255;

property Charset: TFontCharset nodefault;

определяет набор символов шрифта. Приведем некоторые константы, которые могут быть использованы в качестве значения свойства CharSet:

Константа

Значение

Описание

ANSI_CHARSET

0

Символы ANSI.

DEFAULT_CHARSET

1

Задается по умолчанию.

Шрифт выбирается только по его имени Name и размеру Size. Если описанный шрифт недоступен в системе, то Windows заменит его другим шрифтом.

SYMBOL_CHARSET

2

Стандартный набор символов.

MAC_CHARSET

77

Символы Macintosh. Недоступны для NT 3.51.

GREEK_CHARSET

161

Греческие символы. Недоступны для NT 3.51.

RUSSIAN_CHARSET

204

Символы кириллицы. Недоступны для NT 3.51

OEM_CHARSET

255

Определяется кодовой таблицей операционной системы.

property Color: TColor; определяет цвет символов.

property Height: Integer; устанавливает высоту шрифта в пикселях.

type TFontName = type string;

property Name: TFontName; задает имя шрифта.

type TFontPitch = (fpDefault, fpVariable, fpFixed);

property Pitch: TFontPitch;

Задает ширину шрифта и может принимать следующие значения:

fpDefault - ширина задается типом шрифта,

fpVariable - ширина символов переменная,

fpFixed - ширина символов фиксированная.

property Size: Integer; задает высоту шрифта в пунктах

(1 пункт = 1/72 дюйма).

type

TFontStyle = (fsBold, fsItalic, fsUnderLine, fsStrikeOut);

TFontStyles = set of TFontStyle;

property Style: TFontStyles;

задает тип шрифта и в качестве значения может принимать любое множество следу­ющих величин:

fsBold - полужирный,

fsltalic - курсив,

fsUnderline - подчеркнутый,

fsStrikeOut - перечеркнутый.

Заметим, что тексты в Delphi пишутся только горизонтально.

2.3. Класс ТРеn

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

К основным свойствам этого класса относятся:

property Color: TColor; определяет цвет линии, рисуемой карандашом. По умолчанию цвет черный.

type

TPenMode = (pmBlack, pmWhite, pmNop, pmNot, pmCopy, pmNotCopy,

pmMergePenNot, pmMaskPenNot, pmMergeNotPen,

pmMaskNotPen, pmMerge, pmNotMerge, pmMask, pmNotMask,

pmXor, pmNotXor);

property Mode: TPenMode;

определяет стиль рисования линий карандашом. Может принимать следующие значе­ния:

pmBlack

всегда изображается черная линия;

pm White

всегда изображается белая линия;

pmNop

бесцветная линия;

pmNot

цвет, инверсный цвету экрана;

pmCopy

цвет определяется значением свойства Color;

pmNotCopy

цвет, инверсный цвету, заданному в свойстве Color;

pmMergePenNot

комбинация цвета Color и инверсного цвета экрана;

pmMaskPenNot

комбинация цветов, общих у Color и инверсного цвета экрана;

pmMergeNotPen

комбинация цвета экрана и инверсного цвета Color;

pmMaskNotPen

комбинация цветов, общих у цвета экрана и инверсного цвета Color;

pmMerge

комбинация цветов экрана и Color;

pmNotMerge

цвет, инверсный комбинации цветов экрана и Color;

pmMask

комбинация цветов, общих у экрана и Color;

pmNotMask

цвет инверсный комбинации цветов, общих у экрана и Color;

pmXor

комбинация цветов, присутствующих у цвета экрана или Color, но не одновременно у обоих;

pmNotXor

цвет, инверсный комбинации цветов, присутствующих у цвета экрана или Color, но не одновременно у обоих.

По умолчанию цвет линии определяется свойством Color.

type TPenStyle = (psSolid, psDash, psDot, psDashDot, psDashDotDot,

psClear, psInsideFrame);

property Style: TPenStyle;

определяет стиль линии, рисуемой карандашом. Может принимать следующие значе­ния:

psSolid

сплошная линия (значение по умолчанию),

psDash

штриховая линия,

psDot

пунктирная линия,

psDashDot

штрихпунктирная линия,

psDashDotDot

штрихпунктирная линия с двумя пунктирами,

psClear

невидимая линия,

psInsideFrame

линия внутри замкнутой рамки.

property Width: Integer; определяет толщину рисуемой линии. Значением по

умолчанию является толщина, равная 1 пикселю.

2.4. Класс TBrush

Класс TBrush содержит определение характеристик кисти, которая используется для заливки (закраски) замкнутых областей. Рассмотрим основные свойства кисти.

property Bitmap: TBitmap;

Bitmap указывает на объект типа TBitmap, содержащий побитовое отображение изображения, размером 8*8 пикселей. Если Bitmap не пустой, то шаблон заполнения определяется именно им, а не свойством Style. В противном случае свойство должно иметь значение nil.

property Color : TColor; определяет цвет кисти. Значением по умолчанию

является белый цвет.

type TBrushStyle = (bsSolid, bsClear, bsHorizontal, bsVertical,

bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross);

property Style: TBrushStyle;

определяет орнамент кисти. Может принимать следующие значения:

bsSolid

сплошная раскраска,

bsClear

отсутствие раскраски,

bsHorizontal

горизонтальные линии,

bsVertical

вертикальные линии,

bsFDiagonal

левые диагональные линии,

bsBDiagonal

правые диагональные линии,

bsCross

клетка,

bsDiagCross

косая клетка.

2.5. Класс TCanvas

Класс TCanvas определяет объект Canvas, который представляет собой поверхность компонента, используемую для рисования, и инструменты, с помощью которых создаёт­ся изображение: шрифт (класс TFont), карандаш (класс ТРеn) и кисть (класс TBrush). Объекты классового типа TCanvas не являются компонентами и используются как свой­ства различных элементов управления, например формы.

Канва состоит из отдельных точек - пикселей. Каждый пиксель имеет горизонталь­ную и вертикальную координату. Начало координат, т. е. точка с координатами (0,0), рас­полагается в левом верхнем углу канвы. Горизонтальная ось направлена слева направо, а вертикальная - сверху вниз. Размер канвы зависит от размера и особенностей компонен­та. Так, например, для компонента Image размер канвы определяется свойствами Height и Width, а для формы - свойствами ClientHeight и ClientWidth.

На канве имеется невидимый графический курсор, который определяет текущее по­ложение карандаша. Как правило, рисование графических примитивов - линий, окружно­стей, прямоугольников и т. д. - начинается с текущего положения этого курсора. В про­цессе рисования положение курсора изменяется. В классе TCanvas имеются методы, позволяющие устанавливать курсор в заданное положение.

Рассмотрим основные свойства TCanvas.

property Brush : TBrush; задает кисть канвы;

property Font : TFont; задает шрифт канвы;

property Pen : TPen; задает карандаш канвы;

property PenPos: TPoint; определяющее текущее положение графического

курсора;

property Pixels[ X, Y : Integer] : TColor; задает цвета всех пикселей

канвы; X и Y — координаты пикселя.

В классе TCanvas определено много различных методов, предназначенных для рисо­вания всевозможных геометрических фигур. Все геометрические фигуры можно услов­но разбить на контурные (т. е. не имеющие внутренней закраски) и закрашенные (имею­щие внутреннюю закраску). При рисовании контурных фигур используется только каран­даш Реn с установленными в нем характеристиками (цвет линии, толщина и т. д.). Если фигура является закрашенной (например эллипс, многоугольник), ее внутренность закра­шивается кистью Brush с установленными в ней характеристиками (цвет, орнамент и т. д.). Тексты изображаются в соответствии с характеристиками (начертания, размер и т. д.), за­данными в шрифте Font. На этапе выполнения программы значения свойств Pen, Brush и Font можно изменять. Но следует иметь в виду, что установки должны быть выполнены до того, как они будут использованы в процессе рисования.

Рассмотрим основные методы, предназначенные для создания простых графических изображений:

procedure Arc(X1, Y1, Х2, Y2, ХЗ, Y3, Х4, Y4: Integer);

рисует дугу эллипса, который вписан в прямоугольник с координатами левого верх­него угла (X1,Y1) и правого нижнего угла (X2,Y2). Дуга начинается в точке пересе­чения эллипса с прямой, проходящей через центр эллипса и точку с координатами (X3,Y3), а заканчивается в точке пересечения эллипса с прямой, проходящей через центр эллипса и точку с координатами (X4,Y4).

procedure Ellipse(X1, Y1, X2, Y2: Integer); overload;

рисует эллипс, вписанный в прямоугольник с координатами левого верхнего угла (X1,Y1) и правого нижнего угла (X2,Y2).

type TFillStyle = (fsSurface, fsBorder);

procedure FloodFill(X, Y: Integer; Color: TColor;

FillStyle: TFillStyle);

Закрашивает кистью Brush поверхность канвы, начиная с точки с координатами (X, Y). Закрашивается поверхность до границы, заданной цветом Color, если параметр FillStyle имеет значение fsBorder, либо закрашивается участок поверхности, который имеет цвет Color, если параметр FillStyle имеет значение fsSurface.

procedure LineTo(X, Y: Integer);

проводит линию карандашом Pen из текущего положения графического курсора, определяемого свойством PenPos, до точки с координатами (X, Y). Свойство PenPos получает новое значение, определяемое координатами (X, Y).

procedure MoveTo(X, Y: Integer);

перемещает графический курсор в точку с координатами (X, Y).

procedure Pie(X1, Y1, Х2, Y2, ХЗ, Y3, Х4, Y4: Longint);

рисует сектор эллипса. Дуга эллипса задается так же, как и в случае метода Arc.

procedure Rectangle(X1, Y1, X2, Y2: Integer); overload;

рисует прямоугольник, у которого левый верхний угол имеет координаты (X1,Y1), a правый нижний угол - координаты (X2,Y2).

procedure RoundRect(X1, Y1, X2, Y2, ХЗ, Y3: Integer);

рисует прямоугольник, у которого левый верхний угол имеет координаты (X1,Y1), a правый нижний угол - координаты (X2,Y2). Углы прямоугольника закруглены частя­ми эллипса с осями ХЗ и Y3.

procedure TextOut(X, Y: Integer; const Text: string);

выводит текст Text на поверхность канвы таким образом, что координаты (X, Y) яв­ляются координатами левого верхнего угла прямоугольника, в котором выводится текст. Параметры текста задаются характеристиками шрифта Font, цвет фона - теку­щим цветом кисти Brush.

function TextHeight(const Text: string): Integer;

возвращает высоту текста Text в пикселях, определяемую шрифтом Font.

function TextWidth(const Text: string): Integer;

возвращает длину текста Text в пикселях, определяемую шрифтом Font.

В классе TCanvas определены события OnChange и OnChanging:

property OnChange: TNotifyEvent; возникающее перед тем, как в канве должны быть

произведены изменения.

property OnChanging: TNotifyEvent; возникает сразу же после того, как в канве

произведены изменения.

2.6. Компонент Image

Иерархия:

TObject <- TPersistent <- TComponent <-TControl <-TGraphicControl

Страница Палитры Компонентов: Additional.

Назначение

Компонент Image класса TImage используется для размещения на форме некоторой картинки. Файл изображения может быть битовой картой (файл с расширением. bmp), пиктограммой (файл с расширением. ico), метафайлом (файл с расширением. wmf).

Класс TImage является непосредственным потомком класса TGraphicControl и, сле­довательно, принадлежит к семейству графических элементов управления. Помимо на­следуемых, в классе TImage определены следующие свойства:

property Canvas: TCanvas;

предназначается для формирования изображения на этапе выполнения программы.

property Center: Boolean;

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

property Picture: TPicture;

свойство классового типа TPicture - определяет изображение, помещенное в компо­ненте.

property Stretch: Boolean;

если свойство имеет значение True, изображение определяемое свойством Picture, увеличивается или уменьшается до размеров компонента. По умолчанию имеет зна­чение False. Как и другие графические элементы управления, компонент Image обрабатывает все события от мыши. События по умолчанию не имеет.

При помещении изображения в компонент Image на этапе проектирования можно ис­пользовать окно задания изображения. Это окно раскрывается при активизации компо­нента либо при выборе свойства Picture в Инспекторе Объектов. Основное поле окна за­дания изображения предназначено для размещения выбранной картинки. Кроме этого, в окне имеются следующие кнопки:

Load

для загрузки изображения из файла,

Save

для записи изображения в файл,

Clear

для удаления выбранного изображения,

ОК

для записи в компонент выбранного изображения,

Cancel

для отмены введенных изменений.

2.7. Компонент Shape

Иерархия:

TObject <- TPersistent <- TComponent <- TControl

<- TGraphicControl

Страница Палитры Компонентов: Additional.

Экземплярами класса TShape являются компоненты-фигуры - круги, эллипсы, прямо­угольники и т. п. Эти фигуры могут быть использованы для стилизации вашего приложе­ния.

Класс TShape является непосредственным потомком класса TGraphicControl и так же, как и класс TImage, входит в семейство графических элементов управления. Помимо унаследованных, в классе TShape определены следующие свойства:

property Brush: TBrush; определяет кисть для закрашивания поверхности фигуры.

property Pen : TPen; определяет карандаш для рисования контура фигуры.

Type TShapeType = (stRectangle, stSquare, stRoundRect, stRoundSquare,

stEIIipse, stCircle);

property Shape: TShapeType;

Определяет фигуру, выводимую на экран:

stRectangle

прямоугольник,

stSquare

квадрат,

StRoundRect

прямоугольник с закругленными краями,

stRoundSquare

квадрат с закругленными краями,

stEllipse

эллипс,

stCircle

круг.

Событием по умолчанию для компонента Shape является событие OnDragDrop.

2.8. Компонент PaintBox

Иерархия:

TObject <- TPersistent <- TComponent <-TControl<-TGraphicControl

Страница Палитры Компонентов: System.

Компонент PaintBox класса TPaintBox предоставляет возможность рисовать в ограниченной области формы. Для рисования используются все возможности канвы - шрифт, карандаш, кисть, а также методы, позволяющие строить геометрические фигуры на эта­пе выполнения программы.

Класс TPaintBox является потомком класса TGraphicControl и наряду с ранее рассмот­ренными графическими компонентами входит в семейство графических элементов управ­ления.

Среди характеристик, определенных в классе TPaintBox отметим событие OnPaint:

property OnPaint: TNotifyEvent; возникает перед тем, как компонент должен быть

перерисован.

Для компонента PaintBox событием по умолчанию является событие OnClick.

2.9. Компонент Timer

Иерархия:

TObject <- TPersistent <- TComponent <- THandleComponent

Страница Палитры Компонентов: System.

Таймер класса TTimer является невизуальным компонентом, и его можно отнести к разряду вспомогательных компонентов.

Назначение

Таймер предназначен для инициирования какой-либо операции через заданные промежутки времени.

Рассмотрим основные свойства класса TTimer:

property Enabled : Boolean;

если свойство имеет значение True, то таймер реагирует на собственное событие OnTimer.

property Interval : Cardinal;

определяет временной интервал в миллисекундах, после которого появляется собы­тие

OnTimer. По умолчанию равно 1секунда).

Кроме того, в классе TTimer определено событие OnTimer:

property OnTimer : TNotifyEvent;

возникает периодически по истечении интервала времени, определяемого свойством

Interval, которое является событием по умолчанию.

2.10. Примеры использования компонентов Image, Shape, Paint Box и Timer

Пример 2.1

Создать заставку для приложения.

Решение

Заставки имеют многие программы, работающие в операционных системах семейства Windows. Заставка представляет собой графическое изображение, появляющееся на несколько секунд после запуска программы. В ней может содержаться название про­граммного продукта и информация о разработчиках. Графическое изображение, т. е. файл с расширением. bmp, создадим с помощью графического редактора. Перед запуском Delphi создадим папку D:\MyProject\GRAFICA.

1.  Откроем любое из ранее созданных приложений или создадим новое. Графический редактор запустим с помощью команды главного меню Tools|Image Editor.

Работа в графическом редакторе Delphi мало чем отличается от работы в извес­тном графическом редакторе Paint. При создании графического файла вы можете поступить одним из двух способов - либо создать новый файл, либо внести изме­нения в существующий. Выберем первый способ. Выполним команду главного меню File|New|Bitmap File(.bmp). В появившем­ся диалоге Bitmap Properties в поле Width (ширина) установим — 300, а в поле Height (высотаВ группе переключателей Colors выберем переключатель VGA (16 colors) или любой другой, в зависимости от того, сколько цветов вы хотите включить в свой рисунок.

Нажмем ОК.

4. Создадим произвольное изображение. Для того чтобы выбрать цвет символов, следует подвести курсор мыши к окну с требуемым цветом в палитре цветов и нажать левую клавишу. При нажатой правой клавише мыши выбранный цвет будет использоваться в качестве цвета фона. В простейшем случае можно поступить, например, так: набрать черными буквами на белом фоне текст:

Разработчик —

Пример создания

ЗАСТАВКИ

Выберем черный цвет для символов, белый для фона в палитре цветов. Выполним команды EditSSelect All и EditSCut для очистки рисунка. Далее вставим приведен­ный выше текст. Для этого воспользуемся кнопкой T (Text) инструментальной панели. Прежде чем размещать текст, следует задать характеристики шрифта с помощью коман­ды Text|Font.

5. Выполним команду File | Save и сохраним графический файл в папке D:\MyProject\GRAFICA под именем ris. bmp.

Выйдем из графического редактора по команде File | Exit.

Со страницы System поместим на форму Form1 компонент Timer. Он получит имя Timer1. Свойство Interval установим равным 3000.

Со страницы Additional поместим на форму компонент Image (имя - Image1).

Выберем свойство Picture и нажмем кнопку с тремя точками. Появится окно Picture Editor. Нажмем кнопку Load. Войдем в папку D:\MyProject\GRAFICA и вы­берем файл ris. bmp. В Picture Editor нажмем ОК. Для того чтобы рисунок был виден полностью, установим свойство Autosize в True. После этого расположим рисунок так, чтобы он находился в центре формы.

Активизируем компонент Timer1 двойным щелчком и создадим следующий обра­ботчик события OnTimer:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Image1.Free;

Timer1.Free

end;

Это означает, что через 3000 миллисекунд после запуска приложения компонен­ты Image1 и Timer1 будут удалены из памяти компьютера и соответственно - с экрана.

Сохраним проект под именем Project1 (можно под любым другим) и модуль под именем Unit1 в папке D:\MyProject\GRAFICA. Запустим проект на выполнение. На рисунке изображен внешний вид приложения в момент его запуска.

Разработчик –

Пример создания

ЗАСТАВКИ

Полный код сформированного модуля. Текст модуля Unit1.pas

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;

type

TForm1 = class(TForm)

Timer1: TTimer;

Image1: TImage;

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Image1.Free;

Timer1.Free

end;

end.

Если бы нам потребовалось, чтобы заставка «мигала», т. е. периодичес­ки появлялась и исчезала, мы могли бы создать следующий обработчик события OnTimer:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if Image1.Visible = true

then Image1.Hide

else Image1.Show;

end;

Пример 2.2

Создадим приложение, демонстрирующее «вращение Луны вокруг Земли».

Решение

1.  Создадим новое приложение.

2.  Со страницы System поместим на Form1 компонент Timer под именем Timer1. Его свойство Interval установим равным 55. Через каждые 55 миллисекунд будет воз­буждаться событие OnTimer, которое мы будем использовать для перемещения по форме компонента Shape2. Число 55 - это минимальное значение, называемое ти­ком, которое можно установить в качестве значения свойства Interval. В общем случае любое значение свойства Interval будет округлено в большую сторону до числа, кратного 55. Это связано с особенностями аппаратного таймера компьютера.

3.  Со страницы Additional поместим на Form1 компонент Shape под именем Shape1.
Установим следующие значения для его свойств:

Shape - stCircle,

Height - 121,

Width - 121,

Left - 240,

Top - 104.

Выберем свойство Brush и выполним по нему двойной щелчок мышью. В Инс­пекторе Объектов дополнительно появились два свойства: Color и Style. Выберем свойство Color и установим его равным clBlue.

4. Поместим на Form1 компонент Shape под именем Shape2. Установим следующие значения для его свойств:

Shape - stCircle,

Height - 41,

Width - 41,

Left - 400,

Top - 152.

В свойстве Brush установим цвет кисти clYellow.

5. В верхней части Form1 разместим компонент Label под именем Label1. Его свой­ству Caption зададим значение – ‘Вращение Луны вокруг Земли’. Войдем в свой­ство Font и установим:

Шрифт - Courier New,

Начертание - полужирный,

Размер - 16,

Набор символов - кириллица.

Свойство Transparent установим равным True.

6. Активизируем двойным щелчком компонент Timer1. Внесем исправления в текст модуля, начиная с раздела var

Текст модуля Unit2.pas

interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Timer1: TTimer;

Shape1: TShape;

Shape2: TShape;

Label1: TLabel;

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1; x:real;

implementation

{$R *.DFM}

procedure TForm1.Timer1Timer(Sender: TObject);

begin

x := x + 0.1;

Shape2.Left:= 265 + trunc(150 * cos(x));

Shape2.Top := 150 - trunc(150 * sin(x))

end;

initialization

x := 0

end.

Заметим, что обработчик события OnTimer предназначен для увеличения текуще­го значения переменной х и, соответственно, для изменения текущего положения компонента Shape2 на форме. Это означает, что переменная х должна быть гло­бальной по отношению к процедуре TForm1.Timer1Timer и ее следует описать в разделе var секции interface. Начальное значение переменной х может быть зада­но в секции initialization.

7. Выполним команду главного меню File|Save All и сохраним проект под именем Project2, модуль под именем Unit2 в папке D:\MyProject\Flight. Запустим проект на выполнение.

Пример 2.3.

Создадим изображение с помощью компонента PaintBox.

Решение

Компонент PaintBox предоставляет в наше распоряжение окно, в котором мы можем создать произвольное изображение. Программный код, создающий изображение, дол­жен располагаться в обработчике события OnPaint.

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

1.  Создадим новое приложение.

2.  Поместим на Form1 компонент PaintBox под именем PaintBox1. Установим его размеры: Height = 200; Width = 200.

3.  В Инспекторе Объектов перейдем на страницу Events и выполним двойной щел­чок по правому полю в строке, содержащей имя события OnPaint. В модуле Unit3.pas сформируем обработчик события OnPaint.

Текст модуля Unit3.pas

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;

type

TForm1 = class(TForm)

PaintBox1: TPaintBox;

procedure PaintBox1Paint(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1 : TForm1;

implementation

{$R *.DFM}

procedure TForm1.PaintBox1Paint(Sender: TObject);

procedure sector(clr: TColor; angle1, angle2 : real;

msg: string);

var x1, x2, y1, y2 : integer;

begin

PaintBox1.Canvas. Brush. Color := clr;

x1 := trunc(cos(angle1) * PaintBox1.Width/2 + PaintBox1.Width/2);

y1 := PaintBox1.Height - trunc(sin(angle1) * PaintBox1.Height/2 +

PaintBox1.Height/2);

х2 := trunc(cos(angle2) * PaintBox1.Width/2 + PaintBox1.Width/2);

у2 := PaintBox1.Height - trunc(sin(angle2) * PaintBox1.Height/2

+ PaintBox1.Height/2);

PainBox1.Canvas. Pie(0, 0, PaintBox1.Width, PaintBox1.Height, x1,

y1, x2, y2);

PaintBox1.Font. Name := ‘Arial’;

PaintBox1.Font. Size := 8;

PaintBox1.Font. Color := clBlack;

PaintBox1.Font. Style := [fsBold];

PaintBox1.Canvas. TextOut(trunc((x1 + x2)/2)- 20, trunc((y1+y2)/2),

msg);

end;

begin

sector(clLime, 0, pi/3, ‘16,5%’);

sector(clWhite, pi/3, 5 * pi/6, ‘25%’ );

sector(clSkyBlue, 5 * pi/6, 7 * pi/5, ‘28,4%’);

sector(clYellow, 7 * pi/5, 2 * pi, ‘30%’ );

end;

end.

Для рисования сектора круга в обработчике TForm1.PaintBox1Paint определена про­цедура sector:

procedure sector(clr : TColor; angle1, angle2 : real; msg : string);

имеющая следующие параметры:

clr - цвет, которым закрашен сектор;

angle1 - начальный угол, т. е. угол между осью ОХ и правой стороной секто­ра

(задается в радианах);

angle2 - конечный угол, т. е. угол между осью ОХ и левой стороной сектора

(задается в радианах);

msg - текст, используемый для подписи сектора.

4.  Выполним команду главного меню File|Save All и сохраним проект под именем Project3, модуль под именем Unit3 в папке D:\MyProject\Diagram. Запустим про­ект на выполнение. Для сокращения записи при обращении к свойствам и полям объектов можно использовать оператор присоединения with. В качестве примера приведем код обра­ботчика

TForm1.PaintBox1Paint с использованием оператора with:

procedure TForm1.PaintBox1Paint(Sender: TObject);

procedure sector(clr : TColor; angle1, angle2 : real;

msg : string);

var x1, x2, у1, у2 : integer;

begin

with PaintBox1,Canvas do

begin

Brush. Color := clr;

x1 := trunc(cos(angle1) * Width/2 + Width/2);

y1 := Height - trunc(sin(angle1) * Height/2 + Height/2);

x2 := trunc(cos(angle2)* Width/2 + Width/2);

y2 := Height - trunc(sin(angle2)* Height/2 + Height/2);

Pie(0, 0, Width, Height, x1, y1, x2, y2);

Font. Name := ‘Arial’;

Font. Size := 8;

Font. Color := clBlack;

Font. Style := [fsBold];

TextOut(trunc((xl+x2)/2) - 20, trunc((y1 + y2) / 2), msg);

end;

end;

begin

sector(clLime, 0 , pi/3, ‘16,5%’);

sector(clWhite, pi/3, 5 * pi/6, ‘25%’ );

sector(clSkyBlue, 5 * pi/6, 7 * pi/5, ‘28,4%’);

sector(clYellow, 7 * pi/5, 2 * pi, ‘30%’ );

end;