Практическая работа № 6
Тема: Разработка проекта «ИЗУЧАЕМ АНГЛИЙСКИЙ».
Работа с фигурами, таймером, мультимедийным проигрывателем, двойными кнопками и индикатором состояния. Перетягивание объектов в окне программы
Цель работы. Разработать программу для проверки знаний конкретных английских слов. Пользователь должен за ограниченное время методом перетягивания расположить три (или четыре серии по три) рисунка под соответствующими английскими словами (см. рис. 21). Применить индикатор времени выполнения задачи звуковые эффекты и привести анализы-итоги тестирования
Приобрести навыки работы с такими объектами: геометрическая фигура (Shape), таймер (Timer), мультимедийный проигрыватель (MediaPlayer), двойная кнопка с полем редактирования ), индикаторы состояния (Gauge и ProgressBar).
Теоретические сведения. Рассмотрим назначения и свойства «которых новых объектов. Геометрическая фигура (Shape пиктограмма на закладке Additional) предназначена для изображения элементарных геометрических фигур и имеет, в частности такие свойства:
|
Описание свойства |
Примеры значений |
Brush |
Характеристики цвета (Color) и стиля (Style) заливки |
Brush-Color: clMaroori Brush-Style: bsSolid (сплошной), bsVertical |
Shape |
Форма фигуры |
stRoundRect (прямоугольник с округленными краями), stEllipse, stSquare |
Pen |
Характеристики границы фигуры |
Комплексное свойство |
Таймер (Timer, пиктограмма на закладке System) используют для повторения фрагмента программы с определенной периодичностью. Соответствующий фрагмент располагают в теле процедуры обработка события OnTimer таймера. Периодичность включения таймера в милисекундах задают свойством Interval.
Мультимедийный проигрыватель (MediaPlayer, пиктограмма на закладке System) предназначен для проигрывания видео- и аудиофайлов. Управлять проигрывателем можно как с помощью традиционных кнопок Play, Pause, Stop, Next и т.п. на этапе выполнения программы, так и из программного кода путем выполнения методов этого объекта, например:
Рис 20,21
MediaPlayerl.FileName :=
'полное имя видео- или аудиофайла';
MediaPlayer1 .Open;
MediaPlayerl .Play;
Двойная кнопка с полем редактирования (SpinEdit, пиктограмма на закладке Samples) предназначена для ввода и корректировки целочислового значения некоторой величины во время работы программы. Свойства кнопки:
Свойство |
Описание свойства |
Примеры значений |
EditorEnabled |
Возможность прямого редактирования |
True, False |
Enabled |
Возможность любого редактирования |
True, False |
Increment |
Шаг изменения |
1; 4 (целое число) |
MaxValue |
Максимальное значение |
целое число |
MinValue |
Минимальное значение |
целое число |
Индикатор состояния (Gauge, пиктограмма на закладке Samples, ProgressBar, пиктограмма на закладке Win95) используют для наглядной демонстрации состояния выполнение некоторого процесса. Рассмотрим три свойства индикатора Gauge:
Свойство |
Описание свойства |
Примеры значение |
Kind |
Тип индикатора |
gkHorizontalBar (гориз. строка), gkPie (круговая диаграмма), gkText (процентное отображение) |
Progress |
Отображает состояние индикатора |
Целое число между MaxValue и MinValue |
ShowText |
Дополнительно отображает состояние в процентах |
True, False |
Замечание. Для создания сокращенной версии программы (лишь для одной серии из трёх рисунков и без показа результатов тестирования), выполните пункты хода работы, обозначенные одной звездочкой (*). Чтобы получить полную версию про граммы, выполните пункты с двумя звездочками (**). Пункты хода работы без звездочек выполните в обоих случаях.
Ход работы
1. Загрузите среду визуального программирования Delphi.
2. Поменяйте заголовок (Caption) формы с «Form1» на «Английский язык — тестирование».
3. Откажитесь от всех системных кнопок формы, задав значения False во всех позициях свойства Borderlcons:
biSystemMenu, biMinimize, biMaximize и biHelp.
Работа с программой будет завершаться нажатием на кнопку Выход.
4. Расположите на форме объекты так, как показано на рис. 20. Задайте такие свойства объектов:
Объект |
Свойство |
Значение |
Timerl |
Interval |
500 |
Timer2 |
Interval |
100 |
MediaPlayerl |
Visible |
False |
Gauge 1
|
BackColor |
clInfoBk |
Color |
clBtnFace |
|
Font |
MS Sans Serif, Bold, 14, Yellow |
|
ForeColor |
clGreen |
|
Kind |
gkHorizontalBar |
|
MaxValue |
100 |
|
MinValue |
0 |
|
Progress |
100 |
|
SpinEditl
|
EditorEnabled |
False |
MaxValue |
10 |
|
MinValue |
1 |
|
Value |
5 |
|
BitBtnl
|
Glyph |
C:\ Program Files\ Borland\ Delphi x.O \IMAGES \BUTTONS\ check.bmp |
Caption |
Готово |
|
BitBtn2
|
Glyph |
C:\ Program Files\ Borland\ Delphi x.O \IMAGES \BUTTONS\ dooropen.brap |
Caption |
Выход |
|
Shapel, Shape2, |
Brush-Color |
clInfoBk |
Shape3 |
Shape |
stRoundRect |
Image 1, Image2, Image3 |
Stretch |
True |
Label1 |
Font-Color |
Red |
Font-Size |
10 |
|
Caption |
Обязательно нажмите на кнопку "Готово" после размещения рисунков!! |
|
Label2, label3, label4 |
Font-Color |
Olive |
Font-Size |
16 |
Замечание. Размеры фигур должны быть больше, чем размеры рисунков, поскольку последние следует располагать строго в середине фигур. Если во время наложения рисунка на фигуру рисунок исчезает, переместите его на передний план командой контекстного меню Bring To front.
5. Дважды щелкните на первом таймере и запрограммируйте мигание сообщения «Обязательно нажмите на кнопку «Готово» после размещения рисунков!!» так:
procedure TForml.TimerlTimer(Sender: Tobject);
begin
{Если поле мигает}
if Label1.Visible = True then
Label1.Visible := False {поле гасится,}
else
{иначе — поле засвечивается}
Label1.Visible := True;
end;
6. Введите описание глобальных переменных программы:
var Forml : Tforml
{Эта строка уже есть в заготовке модуля]
shiftX, shiftY : integer;
7. Введите описания глобальных констант и переменных программы:
const k = 4; {Количество обновлений содержания теста}
(Массив рисунков)
a: array [l..k, 1..3] of string =( (‘books.wmf’, ’flover.wmf', 'bomb.wmf'),
('grape.wmf’, 'lemon.wmf’, 'PC.wmf’),
('pie.wmf’, 'pineapple.wmf,
'pumpkin.wmf’),
('sportmens.wmf’, 'telephone.wmf’, 'watermelon.wmf’) );
(Массив слов)
b: array [l..k,
1..3] of string = ( ' books', ' flover ',
'bomb'), (' grape ', ' lemon ', 'PC'),
(' pie ', ' pineapple ', ' pumpkin '), (' sportmens ', ' telephone ', ' watermelon '));
check: array [l..k, 1..3] of integer = (
(2, 1, 3), (Таблица отображения}
(3, 2, 1), (массива рисунков а в }
(3, 1, 2), (массив слов b. Здесь число-}
(1, 3, 2)); (номер рисунка к слову}
var
Forml : TForml; (Эта строка уже есть в заготовке модуля)
i, score : integer;
shiftX, shiftY : integer;
leftl, left2, left3 : integer;
top1, top2, top3 : integer;
8. Запрограммируйте кнопку BitBtn2 как кнопку закрытия окна командой close.
Вставьте рисунки ‘books.wmf’, ’flover.wmf', 'bomb.wmf' из папки z:\12kp1\!ПРАКТИКА!\Картинки\ в объекты Iniagel, Image2 и Image3 соответственно.
Свойствам Caption текстовых полей Label2, Labels и Label4 присвойте значения ' books', ' flover ', 'bomb' соответственно.
9. 3апрограммируйте процедуры: создания формы FormCreate, вставки в неё рисунков SetPicture, вывод информации о результате теста Information и кнопку BitBtn2:
procedure TForml.FormCreate(Sender: TObject);
begin
i := 0; (Номер обновления содержания теста)
score:=0; (Набранные, пользователем баллы)
(Сохраняем начальные координаты]
left1:=Image1.left; (левых верхних углов)
left2:= Image2.left; (трех рисунков в форме)
left3:= Image3.left;
top1 := Image1.Top;
top2 := Image2.Top;
top3 := Image3.Top;
SetPicture; (Процедура i – той вставки рисунков)
procedure Information;
begin
{Останавливаем оба таймера
Прекращаем мигание Labell }
Forml.Timer 1.Enabled := False;
{Останавливаем движение индикатора времени)
Forml.Timer2.Enabled := False;
{Результат теста приводим к 100 баллам}
score := (score * 100) div k;
{Если результат > 90 - считываем файл громкого аплодирования}
if score > 90 then
Forml.MediaPlayerl.FileName := 'applause.wav';
{Если результат между 70 и 90 - считываем файл легкого аплодирования.}
if (score > 70) and (score < 90) then
Forml.MediaPlayerl.FileName := 'clap.wav';
{Иначе файл не считываем и аплодирования не будет}
Forml.MediaPlayerl.Open; {Открываем мульт. плеер}
Forml.MediaPlayerl.Play; {Воссоздаём звук }
{Открываем окно сообщения"Вы набрали ## баллов с 100}
MessageDlg('Bы набрали '+IntToStr(score)+' баллов из 100', mtInformation,[mbOk], 0);
{После щелчка на кнопке "Ok" информационного окна:}
{Закрываем окно программы — заканчиваем работу}
Forml.close;
end;
procedure TForml.BitBtn2Click(Sender: TObject);
begin
Information;
end;
Процедуры Information и SetPicture не являются методами класса Forml. Поэтому изменение свойств любых объектов формы происходит в них путем явного указания имени формы Forml перед именем соответствующего объекта, например, Forml.Timerl.Enabled. Декларации процедур Information и SetPicture вставьте между описанием типа TForml и разделом подсоединенных модулей - uses:
procedure Information;
procedure SetPicture;
10. Обеспечьте перетягивания первого рисунка на форме, запрограммировав обработки таких трех событий для объекта Imagel: OnMouseDown (ЕслиНажатьМышь), OnMouseMove (ЕслиПеретягиватьМышь) и OnMouseUp (ЕслиОтпустить-Мышь). Для заполнения заготовок приведенных процедур воспользуйтесь закладкой Events окна инспектора объектов первого рисунка.
procedure TForml.ImagelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{Временная переменная Tag объекта Imagel =1, если}
{клавиша мыши в этот момент нажата}
Imagel.Tag := 1;
shift := Y; {Запоминаем координату (X; Y) точки}
shift := X; {щелчка мыши в середине рисунка}
end;
procedure TForml.ImagelMouseMove(Sender: TObject; Shift: TshiftState; X,Y: Integer);
begin
if Imagel.Tag = 1 then {Если нажата клавиша мыши}
begin
{Меняем координаты рисунка на величину изменения координаты указателя мыши (X; Y) с учетом его смещений в середине рисунка shiftX, shiftY}
Imagel.Top := Imagel.Top + Y - shiftY;
Imagel.Left := Imagel.Left + X - shiftX;
end;
end;
procedure TForml.ImagelMouseUp(Sender : Tobject;
Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
begin
{Запоминаем, что клавиши мыши отпущены}
Image 1. Tag := 0
end;
Обратите внимание, что программа не проверяет, какую именно клавишу мыши нажал пользователь, поэтому перетягивать картинки можно любой клавишей. Проверить клавиши мыши можно, проанализировав аргумент Button (типа TMouseButton) приведенных процедур: Button = {mbLeft (левая клавиша), mbRight (правая), mbMiddle (средняя)}. Координаты указателя мыши в пикселях передаются в процедуры с помощью аргументов X и Y типа integer.
11. Аналогично запрограммируйте соответствующие
события
для перетягивания двух других
рисунков.
12. Создайте еще один метод формы TForml — функцию ImagelnShape для проверки расположения рисунка (объекта Image) в середине некоторой геометрической фигуры (объекта Shape).
function TForml.ImagelnShape (Image : TImage; Shape : TShape) : Boolean;
begin
if (Image.Left >= Shape.Left) and
(Image.Left + Image.Width <= Shape.Left+Shape.Width) and
( Image.Top >= Shape.top) and
(Image.Top + Image.Height) <=
(Shape. Top + Shape. Height)
then
ImageInShape := True (Рисунок в середине фигуры}
else
ImageInShape := False; {Рисунок вне фигуры}
end;
Функция ImagelnShape является методом класса Forml, поэто му обращение к свойствам любых объектов формы Forml осущг ствляется непосредственно с помощью имени этих объектен, например, Image.Top. Декларацию функции вставьте в раздел описания формы type TForml в раздел деклараций общедоступных процедур после служебного слова public:
function ImageInShape(Image:TImageShape:TShape):Boolean;
13. Запрограммируйте кнопку "Готово", проверяющую правильность расположения рисунков в середине фигур и выводящую информационное окно с сообщением "Правильно!" или "Неправильно!":
procedure TForml.BitBtnlClick(Sender: TObject);
begin
{Останавливаем оба таймера]
Timer1.Enabled := False; {Останавливаем мигания Labell]
{Останавливаем индикатор времени]
Timer2.Enabled := False;
if ImageInShape(Imagel,Shape2) and ImageInShape(Image2,Shape3) and
ImageInShape(Image3 ,Shape1)
then
begin
{Считываем файл громкого аплодирования]
MediaPlayerl.FileName
:= 'applause.wav';
MediaPlayerl.Open;
{Открываем плеер]
MediaPlayerl.Play; {Воссоздаем звук]
{Открываем окно сообщения "Правильно!"}
MessageDlg(‘Правильно!', mtInformation, [mbOk], 0);
end
else
begin
MediaPlayerl.FileName : = 'ding.wav';
MediaPlayerl .Open;
MediaPlayerl.Play; {Подаем звук "ДИНГ"}
MessageDlg('He правильно!', mtlnformation, [mbOk], 0);
{Включаем оба таймера и индикатор времени}
Timer1. Enabled := True;
Timer2.Enabled := True;
Gauge1.Progress := 100;
end;
end;
14. Запрограммируйте кнопку "Готово", проверяющую правильность расположения рисунков в середине фигур:
procedure TForml.BitBtnlClick(Sender : Tobject);
var
check1, check2, checks : integer;
begin
{Где находится первый рисунок?}
{В 1-ой фигуре}
if ImageInShape(Imagel,Shapel) then checkl := 1;
{Во 2-ой фигуре}
if ImagernShape(Imagel,Shape2) then checkl := 2;
{В 3-ей фигуре]
if ImageInShape(Imagel,ShapeS) then checkl := 3;
(Где находится второй рисунок?}
{В 1-ой фигуре]
if ImageInShape(Image2,Shapel) then check2 := 1;
{Во 2-ой фигуре]
if ImageInShape(Image2,Shape2) then check2 := 2;
{В 3-ей фигуре}
if ImageInShape(Image2,ShapeS) then check2 := 3;
{Где находится третий рисунок?}
{В 1-ой фигуре}
if ImageInShape(Image3,Shapel) then check3 := 1;
{Во 2-ой фигуре]
if ImageInShape(Image3,Shape2) then check3 := 2;
{В 3-ей фигуре]
if ImageInShape(Image3,Shape3) then check3 := 3;
{Если рисунки расположены правильно]
if (check[i, 1] = checkl) and (check[i, 2] = check2)
and (check[i, 3] = check3) then
{считаем удачные попытки}
score := score + 1;
SetPicture; {Устанавливаем новые рисунки]
end;
15. Запрограммируйте второй таймер, обеспечивающий индикацию времени выполнения от 100 до 0% со скоростью, обратно пропорциональной числу в SpinEditl.
Если пользователь не успел расположить рисунки в прямо угольниках и нажать на кнопку "Готово" в заданное время, подается звук "ДИНГ" и открывается информационное окно с сообщением "Попробуйте ещё раз!".
procedure TForml.Timer2Timer(Sender: TObject);
begin
{Задаем скорость движения индикатора]
timer2.interval := SpinEditl.value * 100;
{Работает индикатор времени]
Gauge1.progress := Gauge1.progress - 1;
if Gauge1.progress = 0 then {Если время исчерпано}
begin
Timer1.Enabled := False;
Timer2.Enabled := False;
MediaPlayerl.FileName := 'ding.wav';
MediaPlayerl .Open;
MediaPlayerl.Play; {Подаем звук "ДИНГ"}
MessageDlg('Попробуйте еще раз!', mtlnformation, [mbOk], 0);
Timerl.Enabled := True;
Timer2.Enabled := True;
Gaugel.Progress := 100;
end;
end;
16. Запрограммируйте второй таймер, обеспечивающий доступность кнопки "Готово" лишь в случае правильного размещения всех рисунков в отведенных прямоугольниках и показывающий время со скоростью, обратно пропорциональной числу в SpinEditl.
В случае, если пользователь не успел расположить рисунки в прямоугольниках и нажать на кнопку "Готово" за надлежащее время, подается звук "ДИНГ", попытка не засчитывается, и происходит переход к следующей серии рисунков.
procedure TForml.Timer2Timer(Sender: TObject);
begin
{Задаем скорость движения индикатора }
timer2.interval
:= SpinEditl.value * 100;
{Если один из рисунков находится в первом прямоугольнике}
if ( ImageInShape(Imagel,Shape 1)
or
ImageInShape(Image2,Shapel) or
ImageInShape(Image3,Shapel)) and
(и один из рисунков находится во втором прямоугольнике)
( ImageInShape(Imagel,Shape2) or
ImageInShape(Image2,Shape2) or ImageInShape(Image3,Shape2)) and
(и один из рисунков находится
в третьем прямоугольнике}
ImageInShape(Imagel,Shape3) or
ImageInShape(Image2,Shape3) or
ImageInShape(Image3,Shape3))
{то кнопка "Готово" становится доступной:}
then BitBtnl.Enabled := True;
{Работает индикатор времени}
Gauge1.progress := Gauge 1. progress - 1;
if Gauge1.progress = 0 then
{Если время исчерпано}
begin
MediaPlayerl.FileName := 'ding.wav';
MediaPlayerl.Open;
MediaPlayerl.Play; {Подаем звук "ДИНГ"}
SetPicture; {Меняем серию рисунков}
end;
end;
13. Сохраните программу и проект в своей папке.
14. Скопируйте музыкальные файлы ding.wav, applause.wav и
clap.wav в свою папку из папки z:\12kp1\!ПРАКТИКА!\Музыка.
15**.Скопируйте все рисунки в свою папку из папки z:\12kp1\!ПРАКТИКА!\Картинки\.
16. Запустите программу.
Перетягивайте мышью рисунки на
середину соответствующих фигур.
17. Создайте ехе-файл программы и поупражняйтесь с ней.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.