Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование delphi.doc
Скачиваний:
806
Добавлен:
09.02.2015
Размер:
2.97 Mб
Скачать

Индивидуальное задание

Создать демонстрационную программу, используя шаблон в соответствии с номером варианта.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

Итоги

В четвёртой теме были изучены: объявление новых типов данных; генератор случайных чисел; изучение структуры «массив»; алгоритмы операций с массивами.

При создании демонстрационной программы были получены навыки работы со следующими командами: Randomize, Random и визуальными компонентами: элемент фигура StringGrid;

5. Графические примитивы

Цель: знакомство с графическими примитивами; печать изображения; мультипликация; формирование программируемого изображения.

5.1. Теоретические сведения

Графические примитивы. При создании программы может возникнуть ситуация, когда, используя видимые элементы Delphi, не удается сформировать нужное изображение (это могут быть чертежи, иллюстрации, графики и т. п.). В этом случае можно использовать программирование изображения.

Вся поверхность окна представляет собойхолст, на который программа может выводить графику. Этот холст задается свойством Canvas, позволяющим выводить графические примитивы (точки, линии, окружности, прямоугольники и т. п.) и задавать их характеристики: цвет, толщину и стиль линий; цвет и вид заполнения областей; характеристики шрифта при выводе текстовой информации. Холст представляет собой систему координат с началом в верхнем левом углу – таким образом, увеличение координаты X идет слева направо, а координаты Y сверху вниз (рис. 5.1). Холст можно представить как набор пикселей – начало координат имеет координаты (0,0), а правый нижний угол окна – (Client.Width, Client.Height).

Для рисования графических объектов используют карандаш (Pen), а для заполнения замкнутых областей – кисть (Brush). Свойства инструментов Pen и Brush приведены в табл. 5.1.

Таблица 5.1

Свойство

Определение

Карандаш – Pen

Color

Цвет линии

Width

Толщина линии

Style

Стиль линии

Mode

Режим отображения

Кисть Brush

Color

Цвет закрашиваемой области

Style

Стиль заполнения области

В табл. 5.2 представлены все стандартные цвета, которые пользователь может использовать в качестве значений свойства Color.

Если требуются другие цвета, то можно воспользоваться функцией RGB(Red,Green,Blue), в качестве параметров которой передаются значения соответствующего цвета (красного, зеленого, синего) в диапазоне от 0 (значение отсутствует) до 255 (цвет полностью насыщен).

Пример

RGB(255,0,0) – даст чисто красный цвет (clRed);

RGB(100,100,100) – даст оттенок серого;

RGB(255,255,255) – даст чисто белый цвет (clWhite).

Также полезным может оказаться свойство Pen.Width, устанавливающее толщину рисуемой линии в пикселях. Дополнительную справку по остальным свойствам карандаша и кисти можно получить из контекстной справки Delphi.

Таблица 5.2

Константа

Цвет

Константа

Цвет

clAqua

Бирюзовый

clMedGray

Средне-серый (Delphi 6)

clBlack

Чёрный

clManeyGreen

Цвет мяты (Delphi 6)

clBlue

Синий

clNavy

Тёмно-синий

clCream

Кремовый (Delphi 6)

clOlive

Оливковый

clDkGray

Тёмно-серый (clGray)

clPurple

Пурпурный

clFuchsia

Фиолетовый

clRed

Красный

clGray

Серый (clDkGray)

clSilver

Серебристый (clLtDark)

clGreen

Зелёный

clSkyBlue

Лазурный (Delphi 6)

clLime

Салатный

clTeal

Тёмно-голубой

clLtGray

Светло-серый (clSilver)

clWhite

Белый

clMaroon

Тёмно-бордовый

clYellow

Жёлтый

Рассмотрим графические примитивы: TextOut – вывод текста, Pixels вывод точки, LineTo – вывод линии, PolyLine – вывод ломаной, PolyGon – многоугольник, Rectangle – прямоугольник, RoundRec – прямоугольник с закругленными краями, Ellipse эллипс, Arc – дуга и Pie – сектор.

TextOut(X,Y:Integer; const Text: String) – вывод текста Text в прямоугольник, имеющий координаты верхнего левого угла X,Y. Стиль (Style), цвет (Color), название шрифта (Name), размер шрифта (Size) определяются объектом Font.

Пример

Font.Name := ‘Times New Roman’; {Название шрифта Times New Roman}

Font.Size := 14; {Размер шрифта 14}

Font.Color := clBlue; {Цвет шрифта Синий (clBlue)}

Font.Style := [fsBold, fsItalic, fsUnderLine, fsStrikeOut];

{Настройка стиля шрифта указывается в квадратных скобках через запятуюfsBold жирный, fsItalic курсив, fsUnderLine подчеркнутый, fsStrikeOut зачеркнутый}

Для настройки фона выводимого текста необходимо настроить цвет кисти (Brush.Color), например системный цвет clBtnFace позволит выводить фон текста таким же, как у окна.

Pixels[X,Y:Integer] := цвет – вывод точки с координатами X, Y указанным переменной цвет цветом.

Замечание. Все последующие процедуры чертятся цветом, установленным для инструмента «карандаш» – Pen.Color.

LineTo(X,Y:Integer) – рисует линию от текущей точки окна (позиция курсора) до точки с координатами X и Y. Чтобы установить курсор в определенную точку, необходимо использовать процедуру MoveTo[X,Y:Integer], которая перемещает курсор в точку с координатами X и Y.

Пример

MoveTo(0,0);

LineTo(ClientWidth,ClientHeight);

В примере будет проведена линия от левого верхнего угла окна до правого нижнего угла.

PolyLine(array of TPoint) – рисует ломаную кривую по точкам, указанным в массиве точек, соединяя первую со второй, вторую с третьей и т. д. Точки массива могут быть перечислены как непосредственно в процедуре PolyLine, так и описаны ранее. Использование процедуры будет понятно из примеров.

Примеры

  1. Точки описаны в процедуре:

PolyLine([Point(10,20),Point(20,10),Point(30,20)]);

будет построена ломаная с вершинами в точках, указанных в стандартной переменной Point, с координатами (10,20), (20,10), (30,20).

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

var

PArray : array[1..3] of TPoint;

begin

… {Описание программы}

PArray[1].X := 10;

PArray[1].Y := 20;

PArray[2].X := 20;

PArray[2].Y := 10;

PArray[3].X := 30;

PArray[3].Y := 20;

PolyLine(PArray);

Здесь также будет построена ломаная с теми же координатами вершин, что и в предыдущем случае.

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

PolyGon(array of TPoint) – отличается от предыдущей процедуры тем, что соединяет последнюю точку массива с первой, т. е. получаем замкнутую фигуру.

Замечание. Все замкнутые фигуры чертятся цветом, установленным для инструмента «карандаш» – Pen.Color, и заполняются цветом, определенным для инструмента «кисть» – Brush.Color.

Rectangle(X1,Y1,X2,Y2:Integer) – прямоугольник, имеющий левый верхний угол с координатами (X1,Y1) и нижний правый угол с координатами (X2,Y2). Если длина X1Y1 окажется равной X2Y2, то получится квадрат.

RoundRec(X1,Y1,X2,Y2,X3,Y3:Integer) – вычерчивает прямоугольник (X1,Y1,X2,Y2), но со cкругленными углами, размер скругления определяется X3 – диаметром скругления по X и Y3 – диаметром скругления по Y (рис. 5.2).

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

Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – вычерчивает дугу эллипса, вписанного в прямоугольник с вершинами (X1,Y1,X2,Y2); X3,Y3 – определяют точку начала дуги; X4,Y4 – определяют точку конца дуги. Начальная (конечная) точка – это точка пересечения границы эллипса с прямой, проведенной из центра эллипса в точки с координатами (X3,Y3) и (X4,Y4). Дуга вычерчивается против часовой стрелки от начальной точки к конечной.

Pie(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – строит сектор. Строится по тем же правилам, что и дуга, но отличается тем, что сектор – замкнутая фигура, т. е. имеет цвет заполнения. Дуга и сектор изображены на рис 5.3.

Печать изображения. Печать изображения – то же, что и вывод на экран. Принтер, как и форма, имеет свойство Canvas. Здесь действует та же система координат и те же инструменты «карандаш» и «кисть». Отличие состоит лишь в следующем: при печати надо сообщить принтеру, чтобы он начал и закончил печать. Для этого надо поместить в текст программы все графические вызовы, которые должны распечатать изображение между командами принтера: Printer.BeginDoc и Printer.EndDoc. Как только принтер получит команду Printer.EndDoc, он сразу отпечатает изображение.

Для печати необходимо настроить принтер с помощью стандартного окна настройки. Для этого Delphi имеет вкладку наиболее популярных диалогов – Dialogs. На этой вкладке есть и диалоги настройки свойств принтера (значок ) и свойств печати (значок). Для вызова этих диалогов необходимо выполнить командуExecute. Например, команда PrinterDialogSetup1.Execute откроет стандартное окно настройки принтера (считается, что на форму помещён элемент настройки печати с именем PrinterDialog1).

Если при создании программы планируется, что изображение будет печататься, необходимо предусмотреть умножение всех размеров используемых объектов на константу, определяющую различие между размерами окна и размерами бумаги. Для этих целей необходимо использовать свойства принтера Printer.PageWidth и Printer.PageHeight, дающие размеры бумаги – ширину и высоту соответственно. Получить коэффициенты пересчета можно, поделив самые короткие размеры печатаемой страницы на самые короткие размеры отображаемой формы:

.

Таким образом, при печати изображения останется только умножать все размеры на эту константу.

Мультипликация. Под мультипликацией обычно понимают передвижение объекта или изменение его свойств (формы, цвета и т. п.). Сделать движущийся объект очень просто – достаточно вывести изображение, затем через некоторое время стереть его и вывести новое. Подобрав время между выводом изображений, можно добиться плавного изменения изображения.

Для создания задержки в Delphi служит невидимый элемент Timer, вкладка System, значок . «Невидимый компонент» означает, что во время выполнения программы этот элемент виден не будет, поэтому на стадии разработки окна данный значок можно поместить в любое место. Этот элемент имеет всего 3 свойства: имя (Name), интервал (Interval) и запрещение/разрешение работы (Enabled). Таким образом, необходимо настроить интервал перерисовки (значение свойства Interval, заданное в миллисекундах) и разрешить перерисовку (свойство Enabled установить в true). Для запуска событий, которые должны перерисовываться, необходимо обратиться к свойству onTimer. Картинка будет перерисовываться с частотой, заданной свойством Interval.

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

Пример

Пусть необходимо передвигать окружность с координатами (5,5,10,10) по горизонтали. Введём переменную базовой точки по координате X и назовем её dx. Рисование окружности будет осуществляться командой: Ellipse(dx+5,5,dx+10,10);

Затем в нужный момент старое изображение затирается цветом фона, изменяются координаты базовой точки и прорисовывается картинка с новыми координатами.