Классы и компоненты Delphi, предназначенные для создания

advertisement
2. Классы и компоненты Delphi,
предназначенные для создания изображений.
Компонент Timer — таймер
Общая характеристика
В Delphi имеется несколько классов общего назначения, позволяющих выводить
графические изображения на поверхность компонентов. К ним относятся классы: TFont
(шрифт), ТРеn (карандаш), TBrush (кисть) и TCanvas (канва). В составе многих компонентов Delphi имеются свойства Font, Pen, Brush и Canvas соответствующего
типа, при помощи которых создаются изображения любых рисунков и текстов. Предком
классов TFont, TPen и TBrush является класс TGraphicsObject, происходящий
непосредственно от класса TPersistent. Предком класса TCanvas является класс
TPersistent.
В классе TGraphicsObject отметим событие (свойство) OnChange:
2.1.
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
DEFAULT_CHARSET
Значение
0
1
Описание
Символы ANSI.
Задается по умолчанию.
Шрифт выбирается
только по его имени
Name и
размеру Size.
Если описанный шрифт
SYMBOL_CHARSET
2
MAC_CHARSET
77
GREEK_CHARSET
161
RUSSIAN_CHARSET
204
OEM_CHARSET
255
property Color: TColor;
property Height: Integer;
пикселях.
type TFontName = type string;
property Name: TFontName;
недоступен в системе,
то Windows заменит его
другим шрифтом.
Стандартный набор
символов.
Символы Macintosh.
Недоступны для NT
3.51.
Греческие символы.
Недоступны для NT
3.51.
Символы кириллицы.
Недоступны для NT 3.51
Определяется кодовой
таблицей операционной
системы.
определяет цвет символов.
устанавливает высоту шрифта в
задает имя шрифта.
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
pmMerge
комбинация цветов, общих у цвета экрана и инверсного цвета
Color;
комбинация цветов экрана и Color;
pmNotMerge
цвет, инверсный комбинации цветов экрана и Color;
pmMask
комбинация цветов, общих у экрана и Color;
pmNotMask
цвет инверсный комбинации цветов, общих у экрана и Color;
pmXor
комбинация цветов, присутствующих у цвета экрана или Color,
но не одновременно у обоих;
цвет, инверсный комбинации цветов, присутствующих у цвета
экрана или Color, но не одновременно у обоих.
pmNotXor
По умолчанию цвет линии определяется свойством 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
property
property
property
Brush :
Font :
Pen
:
PenPos:
TBrush;
TFont;
TPen;
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;
Определяет фигуру, выводимую на экран:
прямоугольник,
квадрат,
прямоугольник с закругленными краями,
квадрат с закругленными краями,
эллипс,
круг.
Событием по умолчанию для компонента Shape является событие OnDragDrop.
stRectangle
stSquare
StRoundRect
stRoundSquare
stEllipse
stCircle
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. По умолчанию равно 1000 (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 (высота) - 200. В группе
переключателей 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
Height
Width
Left
Top
-
stCircle,
121,
121,
240,
104.
Выберем свойство Brush и выполним по нему двойной щелчок мышью. В Инспекторе
Объектов дополнительно появились два свойства: Color и Style. Выберем свойство
Color и установим его равным clBlue.
4. Поместим на Form1 компонент Shape под именем Shape2. Установим следующие
значения для его свойств:
Shape
Height
Width
Left
Top
-
stCircle,
41,
41,
400,
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;
Download