- •Общие замечания
- •6. Написать программу, которая вычисляет скорость (км/час), с'которой бегун пробежал дистанцию. Рекомендуемый вид формы приведен на рис. 1.3. Количество минут задается целым числом, секунд — дробным.
- •17. Напишите программу "Электронные часы", на поверхности формы которой отображается текущее время (рис. 1.14).
- •18. Напишите программу "Электронные часы", в окне которой отображается текущее время и дата (рис. 1.15).
- •Графика
- •23. Напишите программу, которая на поверхности формы рису ет олимпийский флаг (рис. 1.19).
- •24. Напишите программу, которая на поверхности формы рисует флаг Российской Федерации. .
- •25. Напишите профамму, в диалоговом окне которой, в точке щелчка кнопкой мыши, вычерчивается контур пятиконечной звезды (рис. 1.20).
- •29. Напишите программу, которая на поверхности формы вычерчивает график функции, например 2 sin(X) e*/5. Вид окна во время работы профаммы приведен на рис. 1.25.
- •33. Напишите программу, по поверхности окна которой перемещается графический объект, например кораблик (рис. 1.30). Вид окна программы приведен на рис. 1.31.
- •34. Напишите программу, которая на поверхность формы выво дит изображение идущих часов с часовой, минутной и секунд ной стрелками. Окно и форма приложения приведены на рис. 1.32.
- •35. Напишите программу, которая в диалоговом окне выводит изображение идущих часов с часовой, минутной и секундной стрелками (рис. 1.33).
- •36. Напишите программу, по поверхности формы которой дви жется изображение (рис. 1.34). Изображение перемещающегося объекта и фоновый рисунок (рис. 1.35) должны загружаться из файла.
- •40. Напишите программу, используя которую можно просмот реть иллюстрации, находящиеся в одном из каталогов компью тера. Вид окна программы приведен на рис. 1.40.
- •Мультимедиа
- •45. Напишите программу, используя которую можно прослу шать звуковые файлы Windows. Рекомендуемый вид диалогового окна программы приведен на рис. 1.46.
- •Игры и полезные программы
- •55. Напишите программу "Собери картинку" — аналог игры "15", в которой игрок будет перемещать не цифры, а фрагменты кар тинки (рис. 1.59).
- •62. Напишите программу тестирования, в которой выбор пра вильного ответа осуществляется при помощи переключателя (рис. 1.69).
- •Базы данных
- •68. Напишите программу, используя которую можно подгото вить и распечатать накладную. Рекомендуемый вид формы про граммы приведен на рис. 1.77.
Графика
Приступая к решению задач этого раздела, необходимо вспомнить:
Программа может выводить графику на поверхность объекта (формы или компонента image), которой соответствует свой ство Canvas.
Для того чтобы на поверхности объекта появился графиче ский элемент (линия, окружность, прямоугольник и т. д.) или картинка, необходимо применить к свойству Canvas этого объекта соответствующий метод.
Цвет, стиль и толщину линий, вычерчиваемых методами Line, Ellipse, Rectangle И Т. Д., определяет СВОЙСТВО Реп объекта Canvas.
Цвет закраски внутренних областей геометрических фигур, вычерчиваемых методами Line, Ellipse, Rectangle И Т. Д., определяет свойство Brush объекта canvas.
Характеристики шрифта текста, выводимого методом Textout, определяет свойство Font объекта canvas.
Основную работу по выводу графики на поверхность формы должна выполнять функция обработки события onPaint.
23. Напишите программу, которая на поверхности формы рису ет олимпийский флаг (рис. 1.19).
Рис. 1.19. Олимпийский флаг
// рисует олимпийский флаг procedure TForml.FormPaint(Sender: TObj ect); begin with Canvas do begin // полотнище Canvas.Pen.Width := 1; Canvas.Pen.Color := clBlack; Canvas.Brush.Color := clCream; Rectangle(30,30,150,115); // кольца Pen.Width := 2; Brush.Style := bsClear; // область внутри круга // не закрашивать Pen.Color : = clBlue; Ellipse(40,40,80,80); Pen.Color := clBlack; Ellipse(70,40,110,80); Pen.Color := clRed; Ellipse(100,40,140,80); Pen.Color : = clYellow; Ellipse(55,65,95,105); Pen.Color := clGreen; Ellipse(85,65,125,105); end; end;
24. Напишите программу, которая на поверхности формы рисует флаг Российской Федерации. .
// обработка события OnPaint // процедура рисует флаг Российской Федерации procedure TForml.FormPaint(Sender: TObject); const L = 200; // ширина флага (полосы) H = 40; // высота полосы var х,у: integer; // левый верхний угол begin х := 30; у := 50; with Canvas do begin // Чтобы у прямоугольников не было // границы, цвет границы должен // совпадать с цветом закраски Brush.Color := clWhite; // цвет закраски Pen.Color := clWhite; // цвет границы Rectangle(х,у,x+L,y+H); Brush.Color := clBlue; Pen.Color := clBlue; Rectangle(x,y+H,x+L,y+2*H); Brush.Color := clRed; Pen.Color := clRed; Rectangle(x,y+2*H,x+L,y+3*H) ; // контур Pen.Color : = clBlack; Brush.Style := bsClear; // "прозрачная" кисть Rectangle(x,y,x+l,y+h*3); Font.Size := 24; Font.Name := 'Times New Roman'; Font.Color := clWhite; TextOut(50,200,'P о с с и я'); Font.Color := clBlack; TextOut(51,201,'? о с с и я1); end; end;end.
25. Напишите профамму, в диалоговом окне которой, в точке щелчка кнопкой мыши, вычерчивается контур пятиконечной звезды (рис. 1.20).
Рис. 1.20. Звезда
unit Stars_;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtris;type TFontil class (TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations I procedure StarLine(xO,yO,r: integer); // рисует звезду end;var Forml: TForml;implementation{$R *.dfm}// рисует звезду procedure TForml.StarLine(xO,yO, r: integer); // xO,yO — координаты центра звезды //г — радиус звезды var р : array[1..11] of TPoint; // массив координат лучей и впадин a: integer; // угол между осью ОХ и прямой, соединяющей // центр звезды и конец луча или впадину i: integer; begin а := 18; // строим от правого гор. луча for i:=l to 10 do begin if (i mod 2=0) then begin // впадина p[i].x := xO+Round(r/3*cos(a*2*pi/360)) ; p[i].y:=yO-Round(r/3*sin(a*2*pi/360) ) ; end else begin // луч i].x:=xO+Round(r*cos(a*2*pi/360) ) ; i].y:=yO-Round(r*sin(a*2*pi/360)) ; end; a := a+36; end; p[ll].X := p[l].X; // чтобы замкнуть контур звезды р[11].Y := р[1].Y; Canvas.Polyline(p); // начертить контур звезды end;// нажатие кнопки мыши procedure TForml.FonnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft // нажата левая кнопка? then Canvas.Pen.Color := clBlack else Canvas.Pen.Color := clRed; StarLine(x, y, 30); end;end. 26. Напишите программу, по поверхности окна которой пере- мещается случайным образом (прыгает) изображение веселой рожицы, на котором пользователь может сделать щелчок кноп- кой мыши. Программа должна завершить работу после того, как пользователь сделает 10 щелчков кнопкой мыши. Рекомендуе- мый вид окна в начале работы программы приведен на рис. 1.21. unit tir_; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; Рис. 1.21. Окно программы Тир
type TForml class(TForm) Timer: TTimer; Label1: TLabel; Buttonl: TButton; procedure TimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ForrnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ButtonlClick(Sender: TObject); private I Private declarations j public / Public declarations } объявление процедур помещено сюда, чтобы процедуры имели прямой доступ к форме, на которой они рисуют ****************************** , procedure PaintFace(x,у: integer); // рисует рожицу procedure EraseFace(x,у: integer); // стирает рожицу end;var Forml: TForml; fx,fy: integer; // координаты рожицы n: integer; // количество щелчков кнопкой мыши р: integer; // количество попаданий implementation// рисует рожицу procedure TForml.PaintFace(x,y: integer); begin Canvas.Pen.Color := clBlack; // цвет линий Canvas.Brush.Color := clYellow; // цвет закраски // рисуем рожицу Canvas.Ellipse(х,у,x+30,Y+30); // лицо Canvas.Ellipse(x+9,y+10,x+11,y+13); // левый глаз Canvas.Ellipse(x+19,y+10,x+21,y+13); // правый глаз Canvas.Arc(x+4,y+4,x+26,y+26,x,y+20,x+30,y+20); // улыбка end;// стирает рожицу procedure TForml.EraseFace(x,у: integer); begin // зададим цвет границы и цвет закраски, // совпадающий с цветом формы. По умолчанию // цвет формы - clBtnFace (см. в Object Inspector) Canvas.Pen.Color := clBtnFace; // цвет окружности Canvas.Brush.Color := clBtnFace; // цвет закраски Canvas.Ellipse(x,y,x+30, y+30) ; end;{$R *.dfm)procedure TForml.TimerTimer(Sender: TObject); begin EraseFace(fx,fy); // новое положение рожицы fx:= Random(ClientWidth-30); // 30 - это диаметр рожицы fy:= Random(ClientHeight-30) ; PaintFace(fx,fy); end;procedure TForml.FormCreate(Sender: TObject); begin // исходное положение рожицы fx:=100; fy:=100; Randomize; // инициализация генератора // случайных чисел end; // нажатие клавиши мыши procedure TForml.ForroMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inc(n); // кол-во щелчков if (x > fx) and (x < fx+30) and (y > fy) and (y < fy+30) then begin // щелчок по рожице inc(p); end; if n = 10 then begin // игра закончена Timer.Enabled := False; // остановить таймер ShowMessage('Выстрелов: 10. Попаданий: ' + IntToStr(p)+'.'); EraseFace(fx,fy); • Label1.Visible := True; Buttonl.Visible := True; // теперь кнопка и сообщение снова видны end; end;
// щелчок на кнопке Ok procedure TForml.ButtonlClick(Sender: TObject); begin Labell.Visible := False; // скрыть сообщение Buttonl.Visible := False; // скрыть кнопку Timer.Enabled := True; // пуск таймера end;end.
27. Напишите программу, которая на поверхности формы вы черчивает кривую Гильберта (рис. 1.22). Пример кривой Гиль берта пятого порядка приведен на рис. 1.23.
Рис. 1.22. Кривые Гильберта
Рис. 1.23. Кривая Гильберта пятого порядка
var р: integer = 5; // порядок кривой u: integer =7; // длина штриха{ Кривая Гильберта состоит из четырех соединенных прямыми элементов: а, Ъ, с и б. Каждый элемент строит соответствующая процедура. } 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-l, 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); с(i-1, canvas); end; end;procedure b(i: integer; canvas: TCanvas); begin if i > 0 then begin с (i-1, canvas); canvas.LineTo(canvas.PenPos.X-u, canvas.PenPos.Y); b(i-l, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u); b(i-l, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y); d(i-l, canvas); end; end;procedure c(i: integer; canvas: TCanvas); begin if i > 0 then begin b(i-l, canvas); canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y-u); с(i-1, canvas) ; canvas.LineTo(canvas.PenPos.X-u, canvas.PenPos.Y); с(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-l, canvas); canvas.LineTo(canvas.PenPos.X+u,canvas.PenPos.Y); d(i-l, canvas); canvas.LineTo(canvas.PenPos.X,canvas.PenPos.Y-u); b(i-l, canvas); end; end;// обработка события OnPaint procedure TForml.FormPaint(Sender: TObject); begin Forml.Canvas.MoveTo(u,u); a(5,Forml.Canvas); // вычертить кривую Гильберта and;
28. Напишите профамму, которая на поверхность формы выво дит изображение оцифрованной координатной сетки (рис. 1.24).
Рис. 1.24. Координатная сетка
/ обработка события OnPaint procedure TForml.FormPaint(Sender: TObject); var xO,yO:integer; // координаты начала координатных осей dx,dy:integer; // шаг координатной сетки (в пикселах) h,w:integer; // высота и ширина области вывода координатной // сетки х,у:integer; lx,ly:real; // метки (оцифровка) линий сетки по X и Y dlx,dly:real; // шаг меток (оцифровки) линий сетки по X и Y cross:integer; // счетчик не оцифрованных линий сетки dcross:integer; // количество не оцифрованных линий // между оцифрованными begin х0:=30; у0:=220; // оси начинаются в точке (40,250) dx:=40; dy:=4O; // шаг координатной сетки 40 пикселов dcross:=1; // помечать линии сетки X: 1 — каждую; // 2 — через одну; // 3 ~ через две; dlx:=0.5; // шаг меток qch X dly:=1.0; // шаг меток оси У, метками будут: 1,2,3 // и т. д. h:=200; w:=300; with forml.Canvas do begin cross:=dcross ; MoveTo(xO,yO); LineTofxO,yO-h); // ось X MoveTo(xO,yO); LineTo(xO+w,yO); // ось Y // засечки, сетка и оцифровка по оси X x:=xO+dx; lx:=dlx; repeat MoveTo(x,yO-3);LineTo(x,yO+3) ; // засечка cross:=cross-l; if cross = 0 then //оцифровка begin TextOut(x-8,yO+5,FloatToStr(lx)) ; cross:=dcross; end; Pen.Style:=psDot; MoveTo(x,yO-3);LineTo(x,yO-h); // линия сетки Pen.Style:=psSolid; lx:=lx+dlx; x:=x+dx; until (x>xO+w); // засечки, сетка и оцифровка по оси Y y:=yO-dy; ly:=dly; repeat MoveTo(xO-3, у);LineTo(xO+3,y) ; // засечка TextOut(xO-20,y,FloatToStr(ly)) // оцифровка Pen.Style:=psDot ; MoveTo(xO+3,y); LineTo(xO+w,y); // линия сетки Pen.Style:=psSolid; y:=y-dy; ly:=ly+dly; until (y<yO-h); end; end;
