Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛПЗ поОАиП.doc
Скачиваний:
55
Добавлен:
18.05.2015
Размер:
3.08 Mб
Скачать

Лабораторная работа №14

Тема: Использование компонентов отображения.

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

  1. После запуска программы в окне изображается рисунок.

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

Описание плана разработки программы

  1. Открыть новый проект.

  2. Разместить на форме экземпляры компонентов: панель Panel, рисунок Image, диалоговое окно OpenDialog.

  3. Выполнить следующие действия:

Таблица 6. Свойства проекта 7

Выделенный объект

Вкладка окна

Object Inspector

Имя свойства/

имя события

Действие

Form1

Properties

Caption

Установка имени формы «Альбом»

Panel1 (Вкладка Standard)

Properties

Caption

Очистите значение свойства Caption

BevelOuter

Выбрать в раскрывающемся списке значение bvLowered

BevelInner

Выбрать в раскрывающемся списке значение bvNone

BewelWidth

Присвоить значение 2

Width

Присвоить значение 241

Height

Присвоить значение 185

Image1 (Вкладка Additional)

Properties

Left

Присвоить значение 2

Top

Присвоить значение 2

Width

Присвоить значение 237

Height

Присвоить значение 181

Stretch

Включить свойство True

Picture

С помощью кнопки-построителя открыть диалоговое окно Picture Editor (Редактор изображений). Щелкнуть на кнопке Load (Загрузить) – откроется диалоговое окно Load Picture (Загрузка рисунка). Открыть папку C:\Windows и выбрать файл Лес.bmp, щелкнуть на кнопке Открыть. Вернуться в окно Редактора изображений, щелкнуть на кнопке OK.

Image1.Picture.LoadFromFile (OpenDialog1.FileName);

Events

OnClick

OpenDialog1.Execute;

OpenDialog1 (Вкладка Dialogs)

Properties

Title

Ввести текст: «Выбор изображения»

FileName

Ввести полный путь доступа к файлу: C:\Windows\Лес.bmp

Filter

Ввести текст: Растровое изображение (*.bmp)|*.bmp

DefaultExt

Присвоить свойству значение: .bmp

Options

Подсвойству ofFileMustExit (Файл должен существовать) присвоить значение True (Да)

  1. Сохраните проект, запустите и протестируйте его.

Листинг подпрограммы

procedure TForm1.Image1Click (Sender: TObject);

begin

OpenDialog1.Execute;

Image1.Picture.LoadFromFile (OpenDialog1.FileName);

end;

Лабораторная работа №15.

Тема: Использование компонентов редактирования.

Цель работы -

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

  1. После запуска программы в окне изображается строка меню (Файл, Выход).

  2. При выборе пункта меню Файл появляются пункты меню (Рисунки, Выход).

  3. При выборе пункта меню Рисунки появляется вложенное меню, состоящее из двух пунктов (Облака, Лес).

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

  2. Выбрать по пункту другой рисунок

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

  4. Если выбрать любой из пунктов Выход, работа программы завершается.

Описание плана разработки программы

  1. Открыть новый проект.

  2. Разместить на форме экземпляры компонентов: панель Panel, рисунок Image, диалоговое окно OpenDialog.

  3. Выполнить следующие действия:

Таблица 7. Свойства проекта 8

Выделенный объект

Вкладка окна

Object Inspector

Имя свойства/

имя события

Действие

Form1

Properties

Caption

Установка имени формы «Мое меню»

Events

OnMouseDown

var p:TPoint;

begin

p.X :=X;

p.Y :=Y;

p := ClientToScreen (p);

PopupMenu1.Popup (p.X, p.Y);

end;

Запустить редактор меню (дважды щелкнуть на значке меню на форме)

Form1.MainMenu1

Properties

(в окне Object Inspector не выбран никакой объект)

Caption

Ввести текст пункта меню – Файл, и нажать Enter. Система присвоит ему имя N1

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

Form1.MainMenu1

Properties

Caption

Ввести текст пункта меню – Выход, и нажать Enter. Система присвоит ему имя N2.

Events (щелкнуть на пункте Выход в строке меню)

N2Click

Close;

Щелкните на пункте Файл. Редактор меню создал еще одну заготовку под этим пунктом. Это заготовка для меню, которое откроется при выборе пункта Файл в работающей программе. Используя заготовки, создайте в этом меню два пункта: Рисунки (система присвоит ему имя N3) и Выход (N4). Выберите в редакторе меню пункт Рисунки и нажмите комбинацию клавиш Ctrl + Вправо.

N4: TMenuItem

Events

OnClick

Выберем из раскрывающегося списка уже существующую процедуру-обработчик N2Click

Form1.MainMenu1

Properties

Caption

Ввести текст пункта меню – Облака, и нажать Enter. Система присвоит ему имя N5.

N5: TMenuItem

Events (выбрать в строке меню на форме пункт Облака)

OnClick

Image1.Picture.LoadFromFile (‘C:\Windows\Облака.bmp’);

Form1.MainMenu1

Properties

Caption

Ввести текст пункта меню – Лес, и нажать Enter. Система присвоит ему имя N6.

N6: TMenuItem

Events (выбрать в строке меню на форме пункт Лес)

OnClick

Image1.Picture.LoadFromFile (‘C:\Windows\Лес.bmp’);

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

Продолжение таблицы 7.

Выделенный объект

Вкладка окна

Object Inspector

Имя свойства/

имя события

Действие

PopupMenu (Вкладка Standard)

Properties

Caption

Ввести текст пункта меню – Облака, и нажать Enter. Система присвоит ему имя N7.

Caption

Ввести текст пункта меню – Лес, и нажать Enter. Система присвоит ему имя N8.

N7

Events

OnClick

Выберем из раскрывающегося списка уже существующую процедуру-обработчик N5Click

N8

Events

OnClick

Выберем из раскрывающегося списка уже существующую процедуру-обработчик N6Click

Image

(Вкладка Additional)

Properties

Stretch

Присвоить значение True

  1. Сохраните проект, запустите и протестируйте его.

Листинг подпрограммы

procedure TForm1.N2Click (Sender: TObject);

begin

Close;

end;

procedure TForm1.N5Click (Sender: TObject);

begin

Image1.Picture.LoadFromFile (‘C:\Windows\Облака.bmp’);

end;

procedure TForm1.N6Click (Sender: TObject);

begin

Image1.Picture.LoadFromFile (‘C:\Windows\Лес.bmp’);

end;

procedure TForm1.FormMouseDown

(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X. Y: Integer);

var p:TPoint;

begin

p.X :=X;

p.Y :=Y;

p := ClientToScreen (p);

PopupMenu1.Popup (p.X, p.Y);

end;

Лабораторная работа №16.

Тема: Использование компонентов многострочного редактора для обработки строковых данных.

var

x,y: integer; // координаты корабля (базовой точки)

// вычерчивает на поверхности формы кораблик

// или стирает его

procedure Parohod(x,y: integer; mode: boolean);

// x,y - координаты базовой точки кораблика

// mode: True - нарисовать, False - стереть

const

{ Базовые точки кораблика находятся в узлах сетки,

шаг которой определяет размер кораблика. }

dx = 5; // шаг сетки по X

dy = 5; // шаг сетки по Y

var

// корпус и надстройку будем рисовать

// при помощи метода Polygon

p1: array[1..7]of TPoint; // координаты точек корпуса

p2: array[1..8]of TPoint; // координаты точек надстройки

pc,bc: TColor; // текущий цвет карандаша и кисти

begin

if not mode then

begin

// стереть

Form1.Canvas.Brush.Color := clNavy;

Form1.Canvas.Pen.Color := clNavy;

Form1.Canvas.Rectangle(x,y+1,x+17*dx,y-10*dy);

Form1.Canvas.Brush.Color := clNavy;

// небо

if y-10*dy < 80 then

begin

// конец мачты на фоне неба

Form1.Canvas.Pen.Color := clSkyBlue;

Form1.Canvas.Brush.Color := clSkyBlue;

Form1.Canvas.Rectangle(x,y-10*dy,x+17*dx,80);

end;

exit;

end;

// рисуем

with Form1.Canvas do

begin

pc :=Pen.Color; // сохраним текущий цвет карандаша

bc := Brush.Color; // и кисти

Pen.Color:=clBlack; // установим нужный цвет

Brush.Color := clWhite;

// рисуем ...

// корпус

p1[1].X := x; p1[1].y := y;

p1[2].X := x; p1[2].Y := y-2*dy;

p1[3].X :=x+10*dx; p1[3].Y := y-2*dy;

p1[4].X :=x+11*dx; p1[4].Y := y-3*dy;

p1[5].X :=x+17*dx; p1[5].Y :=y-3*dy;

p1[6].X :=x+14*dx; p1[6].Y :=y;

p1[7].X :=x; p1[7].Y :=y;

Polygon(p1);

// надстройка

p2[1].X := x+3*dx; p2[1].Y := y-2*dy;

p2[2].X := x+4*dx; p2[2].Y := y-3*dy;

p2[3].X := x+4*dx; p2[3].Y := y-4*dy;

p2[4].X := x+13*dx; p2[4].Y := y-4*dy;

p2[5].X := x+13*dx; p2[5].Y := y-3*dy;

p2[6].X := x+11*dx; p2[6].Y := y-3*dy;

p2[7].X := x+10*dx; p2[7].Y := y-2*dy;

p2[8].X := x+3*dx; p2[8].Y := y-2*dy;

Polygon(p2);

MoveTo(x+5*dx,y-3*dy);

LineTo(x+9*dx,y-3*dy);

// капитанский мостик

Rectangle(x+8*dx,y-4*dy,x+11*dx,y-5*dy);

// труба

Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);

// иллюминаторы

Ellipse(x+11*dx,y-2*dy,x+12*dx,y-1*dy);

Ellipse(x+13*dx,y-2*dy,x+14*dx,y-1*dy);

// мачта

MoveTo(x+10*dx,y-5*dy);

LineTo(x+10*dx,y-10*dy);

// оснастка

Pen.Color := clWhite;

MoveTo(x+17*dx,y-3*dy);

LineTo(x+10*dx,y-10*dy);

LineTo(x,y-2*dy);

Pen.Color:=pc; // восстановим старый цвет карандаша

end;

end;

// обработка сигнала таймера

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Parohod(x,y, False); // стереть рисунок

if x < Form1.ClientWidth

then x := x+2

else begin // новый рейс

x := 0;

y := Random(50) + 100;

end;

Parohod(x,y,True); // нарисовать в новой точке

end;

procedure TForm1.FormPaint(Sender: TObject);

begin

// небо

Canvas.Brush.Color := clSkyBlue;

Canvas.Pen.Color := clSkyBlue;

Canvas.Rectangle(0,0,ClientWidth,80);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

x:=0; y:=80; // исходное положение парохода

Form1.Color:=clNavy; // цвет моря

Timer1.Interval := 50; // сигнал таймера каждые 50 мСек

end;

end.

Лабораторная работа №17.

Тема Использование компонентов многострочного редактора для одномерных массивов.

StringGrid

ColCount

2

Color

clWindow

FixedColor

clWindow

FixedCols

0

FixedRows

1

Height

129

Options

goFixedVertical

true

goFixedHorizontal

true

goEditing

true

RowCount

5

TabOrder

0

Top

24

Width

177

const

NR= 4; // кол-во строк в таблице

var

n: array[1..NR] of real; p: array[1..NR] of real; h: array[1..NR] of integer;

BarColor: array[1..4] of TColor = (clRed,clGreen,clBlue,clYellow);

// если исх. данные введены, то Obr=TRUE

function Obr : boolean;

var

sum: real;

m:integer;

i:integer;

begin

obr:=FALSE; // пусть исх. данные не введены

// скопируем содержимое второго столбца

// в массив исходных данных

fori:=1toNRdo

// здесь возможно исключение (ошибка) преобразования

// если пользователь не ввел данные

begin

try

n[i] := StrToFloat(Form1.StringGrid1.Cells[1,i]);

except

on EConvertError do

begin

ShowMessage('Надо ввести данные во все' + #13 +

'ячейки второй колонки.');

exit;

end;

end;

end;

sum := 0;

for i:=1 to NR do

sum:=sum+n[i];

// вычислим процент каждой категории

for i:=1 to NR do

p[i] := n[i] / sum;

// определим категорию с максимальным значением

m:= 1;

for i := 2 to NR do

if n[i] > n[m] then m:=i;

// столбик высотой в Image1.Height-20 пикселей

for i :=1 to NR do

h[i] := Round((Form1.Image1.Height - 20) * n[i]/n[m]);

obr := TRUE;

end;

// диаграмма

procedure diagr;

const

WR= 25; // ширина столбика

DR= 10; // расстояние между столбиками

Varx,y:integer; // левый нижний угол столбика

i: integer;

begin

with Form1.Image1 do

begin

x:=10;

y:=Height;

Canvas.Brush.Color := clWindow;

Canvas.Rectangle(0,0,Width,Height);

// *** рисуем столбики ***

for i:=1 to 4 do

begin

Canvas.Brush.Color := BarColor[i]; // цвет столбика

Canvas.Rectangle(x,y,x+WR,y-h[i]); // столбик

Canvas.Brush.Color:=clWindow; // чтобы область за текстом

// не была окрашена

// подпись данных (над столбиком)

Canvas.TextOut(x,y-h[i]-15,

FloatToStrF(p[i]*100,ffGeneral,3,2)+'%');

x := x + WR + DR;

end;

x := x + 20;

y:=20; // 20 пикселей от верхнего краяImage1

for i:=1 to 4 do

begin

Canvas.Brush.Color := BarColor[i];// цвет прямоугольника легенды

Canvas.Rectangle(x,y,x+25,y+14); // прямоугольник легенды

Canvas.Brush.Color := clWindow;

Canvas.TextOut(x+WR+10,y,

Form1.StringGrid1.Cells[0,i]);

y := y + 20;

end;

end; // with Form1.Image1

end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);

begin

if Key = #13 then

begin

// нажата клавиша <Enter>

if StringGrid1.Col < StringGrid1.ColCount - 1

then

// ячейка не в последнем столбце

StringGrid1.Col := StringGrid1.Col + 1 // к след столбцу

else

// ячейка в последнем столбце

if ( StringGrid1.Row < StringGrid1.RowCount - 1 ) then

begin

StringGrid1.Col :=0;

StringGrid1.Row := StringGrid1.Row +1;

end

else Button1.SetFocus;

exit;

end;

if StringGrid1.Col = 1 then

case Key of

'0'..'9',#8: ;

'.',',':

begin

Key := DecimalSeparator;

if Pos(DecimalSeparator,

StringGrid1.Cells[StringGrid1.Row,

StringGrid1.Col]) <> 0

then Key := Char(0);

end;

else Key := Char(0);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if Obr then diagr;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

StringGrid1.Cells[0,0] := 'Категория';

StringGrid1.Cells[1,0] := 'Кол-во';

StringGrid1.Width :=

StringGrid1.ColWidths[0] + StringGrid1.ColWidths[1]+5;

end;

end.

Лабораторная работа №18.

Тема Использование компонентов списков и выпадающих списков

var

Form1: TForm1;

implementation

{$R *.dfm}

// Функция, график которой надо построить

Function f(x:real):real;

begin

f:=2*cos(x)*exp(x/5);

end;

// строит график функции

procedure GrOfFunc;

var

x1,x2:real; // границы изменения аргумента функции

y1,y2:real; // границы изменения значения функции

x:real; // аргумент функции

y:real; // значение функции в точке x

dx:real; // приращение аргумента

l,b:integer; // левый нижний угол области вывода графика

w,h:integer; // ширина и высота области вывода графика

mx,my:real; // масштаб по осям X и Y

x0,y0:integer; // точка - начало координат

begin

// область вывода графика

l:=10; // X - координата левого верхнего угла

b:=Form1.ClientHeight-20; // Y - координата левого верхнего угла

h:=Form1.ClientHeight-40; // высота

w:=Form1.Width-40; // ширина

x1:=0; // нижняя граница диапазона аргумента

x2:=25; // верхняя граница диапазона аргумента

dx:=0.01; // шаг аргумента

// найдем максимальное и минимальное значения

// функции на отрезке [x1,x2]

y1:=f(x1); // минимум

y2:=f(x1); // максимум

x:=x1;

repeat

y := f(x);

if y < y1 then y1:=y;

if y > y2 then y2:=y;

x:=x+dx;

until (x>=x2);

// вычислим масштаб

my:=h/abs(y2-y1); // масштаб по оси Y

mx:=w/abs(x2-x1); // масштаб по оси X

// оси

x0:=l;

y0:=b-Abs(Round(y1*my));

with form1.Canvas do

begin

// оси

MoveTo(l,b);LineTo(l,b-h);

MoveTo(x0,y0);LineTo(x0+w,y0);

TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));

TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));

// построение графика

x:=x1;

repeat

y:=f(x);

Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;

x:=x+dx;

until (x>=x2);

end;

end;

procedure TForm1.FormPaint(Sender: TObject);

begin

GrOfFunc;

end;

// изменился размер окна программы

procedure TForm1.FormResize(Sender: TObject);

begin

// очистить форму

form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));

// построить график

GrOfFunc;

end;

end.

Лабораторная работа №19.

Тема Использование компонентов таблиц для работы с двумерным массивом.

2)

var

Form1: TForm1;

implementation

{$R *.dfm}

var

p: integer = 5; // порядок кривой

u: integer = 7; // длина штриха

{ Кривая Гильберта состоит из четырех соединенных

прямыми элементов: a,b,cиd.

Каждый элемент строит соответствующая процедура. }

procedure a(i:integer; canvas: TCanvas); forward;

procedure b(i:integer; canvas: TCanvas); forward;

procedure c(i:integer; canvas: TCanvas); forward;

procedure d(i:integer; canvas: TCanvas); forward;

// Элементы кривой

procedure a(i: integer; canvas: TCanvas);

begin

if i > 0 then begin

d(i-1, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y);

a(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u);

a(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);

c(i-1, canvas);

end;

end;

procedure b(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

c(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);

b(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);

b(i-1, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y);

d(i-1, canvas);

end;

end;

procedure c(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

b(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);

c(i-1, canvas); canvas.LineTo(canvas.PenPos.X-u,canvas.PenPos.Y);

c(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u);

a(i-1, canvas);

end;

end;

procedure d(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

a(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y+u);

d(i-1, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y);

d(i-1, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u);

b(i-1, canvas);

end;

end;

procedure TForm1.FormPaint(Sender: TObject);

begin

Form1.Canvas.MoveTo(u,u);

a(5,Form1.Canvas); // вычертить кривую Гильберта

end;

end.

Лабораторная работа №20.

Тема Использование компонентов кнопок обычных, графических и с фиксацией.

Практическая работа «Светофор»

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

Описание плана разработки программы

  1. Открыть новый проект.

  2. Разместить на форме экземпляры компонентов: фигура Shape.

  3. Выполнить следующие действия:

Таблица 14. Свойства проекта 14

Выделенный объект

Вкладка окна

ObjectInspector

Имя свойства/

имя события

Действие

Form1

Properties

Caption

Установка имени формы «Светофор»

Height

Присвоить значение 300

Width

Присвоить значение 120

BorderIcons

(Служебные кнопки)

Выбрать для подсвойства biMinimize(Сворачивание) иbiMaximize(Разворачивание) значениеFalse

Color

Задать стандартный серый цвет

BorderStyle

(Стиль рамки)

Выбрать значение bsSingle

Events

OnMouseMove

В процедуру передаются дополнительные параметры: Shift– указывает, не была ли при перемещении нажата клавишаSHIFT,CTRLилиALT;X- горизонтальная координата указателя мыши;Y- вертикальная координата указателя.

Продолжение таблицы 14.

Выделенный объект

Вкладка окна

Object Inspector

Имя свойства/

имя события

Действие

Shape1

(Вкладка Additional)

Properties

Height

Присвоить значение 61

Width

Присвоить значение 61

Shape (Форма)

Выбрать значение stCircle (Круг)

Pen (Контур)

Выбрать для подсвойства Color(Цвет) значениеclRed(красный цвет)

Brush (Кисть)

Выбрать для подсвойства Style(стиль) значениеbsClear(прозрачный)

Enabled (Включен)

Выбрать значение False (Нет)

Shape2

(Вкладка Additional)

Properties

Height

Присвоить значение 61

Width

Присвоить значение 61

Shape

Выбрать значение stCircle (Круг)

Pen

Выбрать для подсвойства Color(Цвет) значениеclYellow(желтый цвет)

Brush

Выбрать для подсвойства StyleзначениеbsClear

Enabled (Включен)

Выбрать значение False (Нет)

Shape3

(Вкладка Additional)

Properties

Height

Присвоить значение 61

Width

Присвоить значение 61

Shape

Выбрать значение stCircle (Круг)

Pen

Выбрать для подсвойства Color(Цвет) значениеclLime(ярко-зеленый цвет)

Brush

Выбрать для подсвойства StyleзначениеbsClear

Enabled (Включен)

Выбрать значение False (Нет)

  1. Написать функцию OnShape, которая вызывается из процедурыFormMouseMove.

  2. Работа функции определяет следующие события:

Если указатель мыши не наведен на лампочку, то ее цвет будет прозрачным.

Если указатель мыши наведен на лампочку, то ее цвет будет соответствовать цветам светофора.

r:=sh.Widthdiv2; {r- радиус фигуры}

cx:=sh.Left+r; {cx,cy– координаты центра фигуры}

cy:=sh.Top+r;

d2 := (X–cx) * (X–cx) + (Y–cy) * (Y–cy); {d2 – квадрат расстояния от центра}

OnShape:=bsClear; {указатель мыши не наведен на лампочку, т.е. находиться за пределами фигуры}

ifd2 >r*rthenObShape:=bsSolid; {указатель мыши наведен на лампочку, т.е. находиться внутри фигуры}

  1. Выравнивание элементов:

    1. Выделить все три фигуры.

    2. Выбрать команду Edit→Align(Правка → Выровнить).

    3. Откроется диалоговое окно Alignment(Выравнивание).

    4. Установить слева переключатель CenterinWindow(Центрировать в окне).

    5. Установить справа переключатель SpaceEqually(С равными промежутками).

    6. Щелкнуть на кнопке OK.

  2. Сохраните проект, запустите и протестируйте его.

Листинг подпрограммы

Function OnShape (sh: TShape; X, Y: Integer): TBrushStyle;

var r, cx, cy, d2: Integer;

begin

r := sh.Width div 2;

cx := sh.Left + r;

cy := sh.Top + r;

d2 := (X - cx) * (X - cx) + (Y - cy) * (Y - cy);

OnShape := bsClear;

if d2 > r*r then OnShape:= bsSolid;

end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

Shape1.Brush.Color := clRed;

Shape1.Brush.Style := OnShape (Shape1, X, Y);

Shape2.Brush.Color := clYellow;

Shape2.Brush.Style := OnShape (Shape2, X, Y);

Shape3.Brush.Color := clLime;

Shape3.Brush.Style := OnShape (Shape3, X, Y);

end;

end.

Лабораторная работа №21.

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

Практическая работа «Узоры»

Описание плана разработки программы

  1. Открыть новый проект.

  2. Разместить на форме экземпляры компонентов: область рисования PaintBox, таймерTimer.

  3. Область рисования представить в виде клеток (точек или пикселов). Каждая клетка покрашена в свой цвет. В ходе программы цвета меняются.

  4. Описать предварительно константы в окне кода пред ключевым словом:

Const size = 40;

csize = 12;

Colors: array [1..16] of TColor =

(clRed, clGreen, clYellow, clBlue, clWhite, clGray, clFuchsia, clTeal,

clNavy, clMaroon, clLime, clOlive, clPurple, clSilver, clAqua, clBlack);

Константа sizeзадает число клеточек по каждому направлению, константаcsize– число используемых цветов. МассивColors(константа) определяет цвета.

В разделе описаний после ключевого слова varописывается массив клеток

Points: array[1..size, 1..size] of Integer;

  1. Выполнить следующие действия:

Таблица 25. Свойства проекта 28

Выделенный объект

Вкладка окна

ObjectInspector

Имя свойства/

имя события

Действие

Form1

Properties

Caption

Установка имени формы «Узор»

Events

OnCreate

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

PaintBox1

(Вкладка System)

Properties

Height

Задать значение 320

Width

Задать значение 320

Продолжение таблицы 25

Выделенный объект

Вкладка окна

ObjectInspector

Имя свойства/

имя события

Действие

Canvas

Свойства и методы этого свойства обеспечивают рисование.

Метод Rectangleрисует прямоугольник с заданными вершинами. Цвет контура задается свойствомPen.Color, а цвет закраски – свойствомBrush.Color.

Timer1

(Вкладка System)

Properties

Interval

Задать значение 100 (одна десятая секунды)

Events

OnTimer

В созданной процедуре-заготовке Timer1Timerописать переменныеc(color),up(up),d(down),l(left),r(right). Новые значения цветов записываются в отдельном массивеNewPoints. Написать правила, по которым будут меняться цвета.

Листинг подпрограммы

procedure TForm1.FormCreate (Sender: TObject);

vari, j : Integer;

begin

Randomize;

for i := 1 to size do {инициализация массива пикселов}

for i := 1 to size do

Points[i,j] := 1 +Random(csize); {Минимально возможное значение элемента массива равно 1}

end;

procedureTForm1.Timer1Timer (Sender: TObject);

vari, j : Integer;

c, l, r, u, d : Integer;

newPoints: array [1..size, 1..size] of Integer;

begin

{Вычислить, какого цвета будет клетка на следующем шаге}

for i := 1 to size do

for j := 1 to size do

begin

c:=Points[i,j] + 1;{Вычисляется «следующий цвет» и запоминается в переменной с}

ifc>csizethenc:= 1; {После последнего цвета идет первый}

{Вычисляются индексы для клеток, примыкающих к данной сверху, снизу, слева и справа. Края узора как бы «склеены» друг с другом}

u:=i– 1;

if u = 0 then u := size;

d := i + 1;

if d > size then d := 1;

l := j – 1;

if l = 0 then l := size;

r := j + 1;

if r > size then r := 1;

newPoints[i,j] :=Points[i,j]; {Если среди «соседей» цвет отсутствует, то клетка остается без изменений}

{Если хотя бы один из «соседей» имеет такой цвет, клетка перекрашивается}

if (Points [u, j] = c) or (Points [d, j] = c) or (Points [i, l] = c) or (Points [i, r] = c)

thennewPoints [i, j] := c;

end;

c:= 320divsize; {Выбирается размер клетки так, чтобы узор занимал, по возможности, всю область рисования}

{Обновляется узор на экране}

for i := 1 to size do

for j := 1 to size do

begin

Points [i, j] := newPoints [i, j];

{Настроить цвет контура прямоугольника и цвет закраски}

PaintBox1.Canvas.Pen.Color := Colors[Points[i, j]];

PaintBox1.Canvas.Brush.Color := Colors[Points[i, j]];

{Выполнить рисование}

PaintBox1.Canvas.Rectangle (c*(i - 1), c*(j - 1), c*i – 1, c*j – 1);

{Параметры метода Rectangleподобраны так, чтобы между клетками оставался небольшой зазор. Чтобы клетки располагались вплотную друг к другу, заменить (c*(i- 1),c*(j- 1),c*i– 1,c*j– 1) на (c*(i- 1),c*(j- 1),c*i,c*j}

end;end;

Лабораторная работа №22.

Тема Использование компонентов зависимых и не зависимых переключателей.

Практическая работа Графика

Для рисования статичных рисунков используется компонент PaintBox (панель System). Этот компонент размещается на форме в виде прозрачного пунктирного квадрата, и в его пределах можно рисовать.

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

  1. Разместить на форме компонент PaintBox.

  2. Заполнить доступную канву 300 красными точками в случайных позициях по нажатиям на некоторую кнопку.

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

  4. Записать код в обработчике нажатия.

procedure TForm1.Button1Click(Sender: TObject);   var i,x,y: Integer;   begin

randomize;   for i := 1 to 300 do     begin     x := random(100);     y := random(100);     PaintBox1.Canvas.Pixels[x,y] := RGB(255,0,0);     end   end;

  1. Изменить RGB(255,0,0) на RGB(random(255),random(255),random(255) ).

  1. Заполнить фон черным цветом перед началом выполнения программы с помощью метода канвы FillRect. Метод вызывается с указанием прямоугольной области заливки цветом: FillRect(Rect(0, 0, 100, 100)) // координаты верхнего левого и правого нижнего углов

Вложенное слово Rect формирует данное типа "прямоугольник". Перед вызовом FillRect надо указать цвет заливки: PaintBox1.Canvas.Brush.Color:=RGB(0,0,0);

procedure TForm1.Button1Click(Sender: TObject);   var i,x,y: Integer;   begin

PaintBox1.Canvas.Brush.Color := RGB(0,0,0); 

PaintBox1.Canvas.FillRect(Rect(0,0,100,100));

  for i := 1 to 300 do      begin     x := random(100);     y := random(100);     PaintBox1.Canvas.Pixels[x,y] := RGB(random(255),random(255),random(255));

    end  end;

  1. Заполнить канву случайными разноцветными линиями разной толщины. Линия рисуется с помощью методов (сначала задается начальная точка, потом конечная):

PaintBox1.Canvas.MoveTo(10,10);

PaintBox1.Canvas.LineTo(50,50);

Цвет линии и толщина задаются свойством канвы Pen (карандаш). Pen.Color - цвет карандаша), Pen.Width - толщина линии в пикселах (по умолчанию - 1).

for i := 1 to 300 do

 begin

   PaintBox1.Canvas.Pen.Color := RGB(random(255),random(255),random(255));

   PaintBox1.Canvas.Pen.Width := random(3)+1;

   x := random(100);

   y := random(100);

   PaintBox1.Canvas.MoveTo(x,y);

   x := random(100);

   y := random(100);

   PaintBox1.Canvas.LineTo(x,y);    end

  1. Заполнить канву эллипсами случайным образом (круги, окружности - частный случай эллипса). Эллипсы рисуются методом Ellipse() с четырьмя параметрами - координатами верхнего левого и правого нижнего углов прямоугольника, в который эллипс вписывается. Кайма эллипса рисуется в соответствии с параметрами свойства Pen канвы, а заливается эллипс внутри цветом кисти Brush канвы.

for i:= 1to 300do    begin    // цвет и ширина каймы будущего эллипса   PaintBox1.Canvas.Pen.Color:=RGB(random(255),random(255),random(255)) ;   PaintBox1.Canvas.Pen.Width:=random(3)+1;

    // цвет заливки внутренности эллипса    PaintBox1.Canvas.Brush.Color:=rgb(random(255),random(255),random(255)) ;

    // координаты углов прямоугольника, в который вписывается эллипс     x := random(150);     y := random(150);     x2 := random(150);     y2 := random(150);

  // вписываем эллипс   PaintBox1.Canvas.Ellipse(x,y,x2,y2); end;

  1. Создать графический образ так называемого множества Жюлиа.

  procedure TForm1.Button1Click(Sender: TObject);     var RE,IM,RE1,IM1: REAL ;     V,X,Y : INTEGER;

// вывод точки заданного цвета     procedure PUTPIXEL(x,y,c:Integer);     var cc: TColor;     begin

case c mod 8 of   0:cc:=clBlack;   1:cc:=clRed; 2:cc:=clLime;   3:cc:=clYellow;   4:cc:=clBlue;   5:cc:=clFuchsia;   6:cc:=clAqua;   7:cc:=clWhite;      end;

    PaintBox1.Canvas.Pixels[x,y] := cc;     end;

    procedure QWA ;     begin     RE1:=RE*RE-IM*IM;

IM1:=2*RE*IM;

RE:=RE1;

IM:=IM1;     end;     procedure KUB;

begin

RE1:=RE*(RE*RE-3*IM*IM);   IM1:=IM*(3*RE*RE-IM*IM);

RE:=RE1;

IM:=IM1;

end ;    Begin     PaintBox1.Canvas.Brush.Color := rgb(0,0,0);     PaintBox1.Canvas.FillRect(Rect(0,0,640,480));

    X:=-320 ;     REPEAT Y:=-240 ;     REPEAT V:=0 ; RE:=-1.+0.001*X ; IM:=0+0.001*Y ;     REPEAT KUB; RE:=RE+1.00003 ; IM:=IM+1.01828201638 ;     if RE*RE > 50 then break;     if IM*IM > 50 then break;     V:=V+1 ;     UNTIL V>40 ;     if ( ABS(RE) > 10 ) or ( ABS(IM) > 1000)

then

begin     PUTPIXEL((X+320),(Y+240),TRUNC(V)) ;

end     else PUTPIXEL((X+320),(Y+240),0);     Y:=Y+1 ;     UNTIL Y > 241 ;     X:=X+1 ;     UNTIL X>320 ;     End;

Лабораторная работа №23.

Тема Использование диалоговых окон.

Практическая работа Графика

Для рисования статичных рисунков используется компонент Image(панельAdditional),Button(Standard). Этот компонент размещается на форме в виде прозрачного пунктирного квадрата, и в его пределах можно рисовать.

procedure TForm1.Button1Click(Sender: TObject);

begin

with Form1.Canvas do begin

Pen.Color:=clBlack;

Pen.Width:=3;

Brush.Style:=bsSolid;

Brush.Color:=clMaroon;

polygon([Point(250,150),Point(110,250),Point(390,250)]);

pen.Color:=clBlack;

Brush.Style:=bsSolid;

Brush.Color:=clyellow;

rectangle(110,250,390,420); {рисует дом }

brush.color:=clWhite;

rectangle(150,280,250,350); {рисует окно }

moveto(200,280);

lineTo(200,350); {рисует линию вертикально }

moveto(150,315);

lineTo(250,315); {рисует линию горизонтально }

Brush.Color:=clWhite;

rectangle(300,300,360,410); {рисует дверь }

moveto(350,350);

lineTo(350,360); {рисует ручку двери }

end;

end;

end.

Задание1.

Лабораторная работа №24.

Тема Использование операторов обработки исключений.

Практическая работа Построение графика

Описание плана разработки программы

  1. Открыть новый проект.

  2. Разместить на форме экземпляры компонентов: кнопка Button, область рисованияPaintBox.

  3. Выполнить следующие действия:

Выделенный объект

Вкладка окна

ObjectInspector

Имя свойства/

имя события

Действие

Form1

Properties

Caption

Установка имени формы «График функции»

Button1

Properties

Caption

Введите название «График»

Events

Onclick

Написать процедуру, рисующую график по точкам

PaintBox1

Properties

Canvas

Соединение линиями получаемых точек

Button2

Properties

Caption

Введите название «Выход»

Events

Onclick

Close;

  1. Сохраните проект, запустите и протестируйте его.

Листинг программы

procedureTForm1.Button1Click(Sender: Tobject);

functionf(x:integer):integer;

varc:integer;

begin

c:=round(10*sin(0.1*x));

f:=c;

end;

varx:integer;

begin

PaintBox1.Canvas.LineTo(0,150);

PaintBox1.Canvas.LineTo(410,150);

x:=0;

for x:=0 to 350 do

begin

PaintBox1.Canvas.LineTo(x, f(x)+150);

end;

end;

procedureTform1.Button2Click(Sender: Tobject);

begin

Close;

end;

end.

Лабораторная работа №25.

Тема Создание главного и контекстного меню.

Практическая работа «Градусник»

  1. Поместите на форму два поля ввода Edit и четыре кнопки.

  1. Ввести число в левое поле. По нажатию на кнопку «по Фаренгейту» в правом поле выводится преобразованное число. По нажатию кнопки «Очистить» очищаются поля ввода.

  2. Ограничьте вводимые температуры диапазоном от 0°C до 100°C (если введено значение, превышающее 100°C или 212°F, то при нажатии кнопки в полях ввода должно отобразиться 100 и 212 соответственно).

  3. Отобразить столбик термометра графически. Добавьте компоненты Image.

  4. Сделать видимой только ту кнопку, которая необходима для преобразования.

Листинг программы

procedure TForm1.FormCreate(Sender: TObject);

begin

Edit1.Text := '';

Edit2.Text := '';

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clWhite;

Image1.Canvas.Rectangle(10,1,23,360);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clWhite;

Image2.Canvas.Rectangle(10,1,23,360);

end;

procedureTForm1.Button2Click(Sender: TObject);

vara, b, c : real;

begin

a := StrToFloat(Edit1.Text);

if (a > 0) or (a < 100) then b := 1.8 * a + 32;

if a > 100 then b := 212;

if a < 0 then b := 32;

Edit2.Text := FloatToStr(b);

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clWhite;

Image1.Canvas.Rectangle(10,1,23,360);

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clRed;

Image1.Canvas.Rectangle(10,round(360-a),23,360);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clWhite;

Image2.Canvas.Rectangle(10,1,23,360);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clBlue;

Image2.Canvas.Rectangle(10,round(360-b),23,360);

end;

procedureTForm1.Button1Click(Sender: TObject);

vara, c, d : real;

begin

c := StrToFloat(Edit2.Text);

if (c > 32) or (c < 212) then d := ( c - 32)/1.8;

if c < 32 then d := 0;

if c > 212 then d := 100;

Edit1.Text := FloatToStr(d);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clWhite;

Image2.Canvas.Rectangle(10,1,23,360);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clBlue;

Image2.Canvas.Rectangle(10,round(360-c),23,360);

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clWhite;

Image1.Canvas.Rectangle(10,1,23,360);

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clRed;

Image1.Canvas.Rectangle(10,round(360-d),23,360);

end;

procedureTForm1.Button3Click(Sender: TObject);

begin

Edit1.Text := '';

Edit2.Text := '';

Image1.Canvas.Pen.Color := clRed;

Image1.Canvas.Brush.Color := clWhite;

Image1.Canvas.Rectangle(10,1,23,360);

Image2.Canvas.Pen.Color := clBlue;

Image2.Canvas.Brush.Color := clWhite;

Image2.Canvas.Rectangle(10,1,23,360);

end;

procedureTForm1.Button4Click(Sender: TObject);

begin

Close;

end;

procedure TForm1.Edit1Enter(Sender: TObject);

begin

Button2.Visible := true;

Button1.Visible := False;

end;

procedureTForm1.Edit2Enter(Sender: TObject);

begin

Button1.Visible := True;

Button2.Visible := False;

end;

end.

Лабораторная работа №26.

Тема Создание текстового файла, ввод и вывод данных.

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

Начало игры осуществляется по нажатию на кнопку Ok.

Свойство WordWrapкомпонентаLabel– признак того, что слова, которые не помещаются в текущей строке, автоматически переносятся на следующую строку (значение свойстваAutoSizeдолжно бытьFalse).

Листинг программы:

var

Form1:TForm1;

fx,fy:integer; { координаты рожицы}

n: integer; { количество щелчков кнопкой мыши}

p: integer; { количество попаданий}