Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Рисование на экране (Delphi)




Составить программу для рисования мышкой при нажатой ле­вой кнопке мышки (рис. 8.1.4.1) (автор программы Е. Виноградова).

Рис. 8.1.4.1. Форма для рисования

 

Стирание линии рисунка произво­дит­ся рисованием линии цветом фона формы при нажатой правой кнопке мыши. Для формы установим свойство WindowState=wsMaximized (форма занимает весь экран). Размес­тим на форме три кнопки и панель Panel1, на которой разместим все осталь­ные объекты. Цвет карандаша или экрана устанавливается щел­ч­ком мыш­ки по текстовому полю Edit1, которое правее текста «Цвет». Зависимые пе­ре­ключатели RadioButton1 и RadioButton2 (п. 2.3.4.5) устанавливают режим наст­ройки цвета ка­ран­даша или формы соот­ветственно. Настройка цвета уста­нав­ливается интен­сивностью по трем его компонентам: синего (поле Edit2), зеленого (Edit3) и красного (Edit4) цве­тов. Ин­тен­сивность задается чис­лом от 0 до 255. Интенсивность крас­но­го цвета может задаваться гори­зон­тальной полосой прокрутки ScrollBar1 (п.2.3.6.1) со свой­ствами: Min=0, Max=255, LargeChange=20, Small­Change=4. Интенсивность зе­­леного цвета может задаваться ползунком TrackBar1 (п.2.3.6.2.] со свой­ствами: Min=0, Max=255, PageSize=2 (большое смещение), Orientation=trHorizontal (го­ризонтальная ориентация), TickMarks=tmBottomRight (шка­ла под ползунком), Frequency=10 (размер одного деления шкалы). Интенсивность синего цвета задается кнопкой-счет­чиком UpDown1 (п. 2.3.6.3) со свойствами: Min=0, Max=255, Increment=4.

Ширина выводимой линии задается значением поля с комбинирован­ным списком ComboBox1 (п. 2.3.3.2) со свойством Items (значения 1-20). Внизу формы расположим строку статуса StatusBar1 (п.2.3.1.3) для вывода коор­динат указателя мышки со свойством SimplePanel=True.

Для формы установим свойство WindowState=wsMaximized (вывод формы на весь экран), cвойства для остальных объектов очевидны.

Кнопкой NewForm создадим новую форму Form2 с полем Memo1 (п.2.3.2.3) (текст инструкции по использованию программы) и с кнопкой Выход. Командой File/UseUnit добавим модуль Unit2 к модулю Unit1.

Приведем тексты процедур обработки событий.

procedure TForm1.Button1Click(Sender: TObject); // кнопка «Очистить»

begin form1.color:=clwhite; // очистка экрана

form1.color:=clBtnFace; // установка цвета фона формы

scrollbar1.position:=0; trackbar1.position:=0; updown1.position:=0;

edit2.text:=inttostr(updown1.position); radiobutton2.checked:=false;

end;

procedure TForm1.Button2Click(Sender: TObject); // кнопка «Справка»

begin form2.show; end;

procedure TForm1.Button3Click(Sender: TObject); // кнопка «Выход»

begin close; end;

procedure TForm1.UpDown1Changing(Sender: TObject;

var AllowChange: Boolean); // изменение счетчика UpDown1

begin {присвоение текстовому полю номера счетчика}

edit2.text:=inttostr(updown1.position); {формирование цвета из значений интенсивностей красного, зеленого и синего составляющих цветов}

edit1.color:=rgb(scrollbar1.position,trackbar1.position,strtoint(edit2.text));

end;

procedure TForm1.ScrollBar1Change(Sender:TObject);// измен. ScrollBar1

begin edit4.text:=inttostr(scrollbar1.position);

edit1.color:=rgb(scrollbar1.position,trackbar1.position,strtoint(edit2.text));

end;

procedure TForm1.TrackBar1Change(Sender: TObject); // измен. TrackBar1

begin edit3.text:=inttostr(trackbar1.position);

edit1.color:=rgb(scrollbar1.position,trackbar1.position,strtoint(edit2.text));

end;

procedure TForm1.FormActivate(Sender: TObject); // активизация формы

begin edit2.text:=’0’; edit3.text:=’0’; edit4.text:=’0’; // обнуление

edit1.color:=rgb(scrollbar1.position,trackbar1.position,strtoint(edit2.text));

combobox1.text:=inttostr(1); Radiobutton1.checked:=true;

end;

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

Y: Integer); // перемещение указателя мышки и вывод линии

Begin {отображение текущих координат курсора на строке статуса}

StatusBar1.SimpleText:='X='+IntToStr(X)+ ',Y='+IntToStr(Y);

{установка ширины пера из выбранного значения списка}

Form1.Canvas.Pen.Width:=strtoint(ComboBox1.text);

if ssLeft in Shift then // нажата левая кнопка мыши

begin Form1.Canvas.Pen.Color:=Edit1.Color; // установка цвета пера

form1.canvas.lineto(x,y); {рисование линии } end;

if ssright in Shift then // нажата правая кнопка мыши

begin form1.canvas.pen.color:=form1.color; // цвет пера=цвету формы

form1.canvas.lineto(x,y);{рисование линии текущим цветом формы} end;

end;

procedure TForm1.Edit2Change(Sender: TObject); // изменение поля Edit2

begin edit1.color:=rgb(scrollbar1.position,trackbar1.position,strtoint(edit2.text));

end;

procedure TForm1.Edit1Click(Sender: TObject); // выбор цвета

begin if RadioButton1.Checked then Form1.Color:=Edit1.Color // цвет формы

else Canvas.Pen.Color:=Edit1.Color; { цвет пера } end;

procedureTForm1.FormMouseDown(Sender:TObject;Button: TMouseButton;Shift:TShiftState;X,Y: Integer); // нажатие кнопки мышки

begin {перевод курсора в текущие координаты мыши}

Form1.Canvas.MoveTo(X,Y); end;

procedure TForm2.Button1Click(Sender: TObject);//кнопка «Выход» Form2

begin form2.close; end;

8.1.5. Тестирование по арифметике (Delphi)

 
 

Составимпрограмму теcтирования знаний ученика по арифметике (рис. 8.1.5.1).

Рис. 8.1.5.1. Форма тестирования

Кнопкой Тест запускается процедура очистки полей ввода и меток; запускается счетчик времени; формируются случайные числа, которые выводятся в качестве операндов в виде меток Label1-Label8. В метке Label14 находится число секунд, оставшихся до окончания тестирования.

Кнопкой Проверить запускается процедура проверки правильности введенных ответов, и, если ответ ошибочен, оценка снижается на балл и выводится правильный ответ в виде метки (Label9-Label12). Счетчик времени останавливается, выводится оценка (Label13). Кноп­кой Выход завершается работа программы.

Приведем тексты процедур обработки событий.

Var // раздел переменных модуля Unit1

H: array [1..4,1..2] of integer; // объявление массива значений операндов

procedure TForm1.FormActivate(Sender: TObject); // активизация формы

begin //очистка меток и полей ввода

Label1.Caption:= ''; Label2.Caption:= ''; Label3.Caption:= '';

Label4.Caption:= ''; Label5.Caption:= ''; Label6.Caption:= '';

Label7.Caption:= ''; Label8.Caption:= ''; Label9.Caption:= '';

Label10.Caption:= ''; Label11.Caption:= ''; Label12.Caption:= '';

Label13.Caption:= ''; Label14.Caption:= '';

Edit1.Text:= '0'; Edit2.Text:= '0'; Edit3.Text:= '0'; Edit4.Text:= '0';

button2.Enabled:=False; //блокировка кнопки «Проверить»

Edit1.Enabled:=False; Editt2.Enabled:=False; Edit3.Enabled:=False; Edit4.Enabled:=False; Timer1.Interval:=0;

end;

procedure TForm1.Button1Click(Sender: TObject); // кнопка «Тест»

var R:integer; // объявление переменной «R»

begin Randomize; // включение счетчика случайных чисел

Timer1.Interval:= 1000; // включение таймера с интервалом в одну секунду

H[1, 1]:= Random(99) + 1; // первое слагаемое в интервале 1-100

H[1, 2]:= Random(99) + 1; // второе слагаемое в интервале 1-100

H[2, 1]:= Random(99) + 1; // уменьшаемое в интервале 1-100

H[2, 2]:= Random(99) + 1; // вычитаемое в интервале 1-100

If H[2, 2] > H[2, 1] Then // вычитаемое строго больше уменьшаемого

Begin R:= H[2, 1]; H[2, 1]:= H[2, 2]; H[2, 2]:= R; End; // обмен

H[3, 1]:= Random(9) + 1; // первый множитель в интервале 1-10

H[3, 2]:= Random(9) + 1; // второй множитель в интервале 1-10

H[4, 2]:= Random(9) + 1; // делитель в интервале 1-10

H[4, 1]:= round((Int(Random(9)) + 1) * H[4,2]); //делимое в интервале 1-100

Label1.Caption:= IntToStr(H[1, 1]); // вывод первого слагаемого в Label1

Label2.Caption:= IntToStr(H[2, 1]); // вывод уменьшаемого в Label2

Label3.Caption:= IntToStr(H[3, 1]); // вывод первого множителя в Label3

Label4.Caption:= IntToStr(H[4, 1]); // вывод делимого в метку Label4

Label5.Caption:= IntToStr(H[1, 2]); // вывод второго слагаемого в Label5

Label6.Caption:= IntToStr(H[2, 2]); // вывод вычитаемого в метку Label6

Label7.Caption:= IntToStr(H[3, 2]); // вывод второго множителя в Label7

Label8.Caption:= IntToStr(H[4, 2]); // вывод делителя в метку Label8

//очистка полей с ответами школьника и меток с правильными ответами

Edit1.Text:= '0'; Edit2.Text:= '0'; Edit3.Text:= '0'; Edit4.Text:= '0';

Label9.Caption:= ''; Label10.Caption:= '';

Label11.Caption:=''; Label12.Caption:= '';

Label13.Caption:= ''; // очистка метки с оценкой

Label14.Caption:='60'; // на ответ дается 60 секунд

button1.Enabled:=False; // блокировка кнопки «Тест»

button2.Enabled:=True; // разблокировка кнопки «Проверить»

Edit1.Enabled:=True; Edit2.Enabled:=True; Edit3.Enabled:=True; Edit4.Enabled:=True; Edit1.SetFocus; // установка фокуса на поле Edit1

end;

procedure TForm1.Button2Click(Sender: TObject); // кнопка «Проверить»

var b:byte; v,e:integer; // V‑значение ответа, E‑номер нецифрового символа

begin b:= 5; // начальное значение балловой оценки

Val(Edit1.Text,v,e); // перевод ответа из строки в числовую переменную V

If (e<>0) or ((H[1, 1] + H[1, 2]) <> v) then // введенная сумма ошибочная

begin b:= b - 1; // оценка уменьшается на один балл

Label9.Caption:=IntToStr(H[1, 1] + H[1, 2]); // вывод правильной суммы

end;

Val(Edit2.Text,v,e);

If (e<>0) or ((H[2, 1] - H[2, 2]) <> v) Then // введенная разность ошибочная

begin b:= b - 1; Label10.Caption:=IntToStr(H[2,1]-H[2, 2]); end;

Val(Edit3.Text,v,e);

If (e<>0) or ((H[3, 1] * H[3, 2]) <> v) Then // произведение ошибочно

begin b:= b - 1; Label11.Caption:=IntToStr(H[3,1]*H[3,2]); end;

Val(Edit4.Text,v,e);

If (e<>0) or ((H[4, 1] / H[4, 2]) <> v) Then // частное от деления ошибочно

begin b:= b - 1; Label12.Caption:=IntToStr(round(H[4,1]/H[4,2])); end;

Label13.Caption:= IntToStr(b); // вывод оценки в метку Label13

Timer1.Interval:= 0; // отключение счетчика времени

button1.Enabled:=True; // разблокировка кнопки «Тест»

button2.Enabled:=False; // блокировка кнопки «Проверить»

Edit1.Enabled:=False; Edit2.Enabled:=False; Edit3.Enabled:=False; Edit4.Enabled:=False; // блокировка полей ввода ответов

end;

procedure TForm1.Button3Click(Sender: TObject); // кнопка «Выход»

begin form1.Close; end;

procedure TForm1.Timer1Timer(Sender: TObject); // таймер

Begin // уменьшение на одну секунду, оставшегося на ответ времени

Label14.Caption:=IntToStr(StrToInt(Label14.Caption)-1); //если время на //ответ закончилось, то вызов процедуры обработки кнопки «Проверить»

If Label14.Caption = '0' Then Button2Click(Button2); end; // конец процедуры

8.1.6. Игра «Морской бой» (Delphi)

В форме размещена таблица размером 7 7; ей соответствует массив MK(7,7), в котором случайным образом помечены элементы со значением 1. Эти элементы задают местоположение кораблей в таблице, которые иг­рок должен потопить, щелкая мышкой по соответствующим ячейкам. Иг­рок должен задать число всех кораблей перед началом игры в поле SpinEdit1 («Число кораблей»).

Разместим компоненты: StringGrid1 (п. 2.3.2.4) (со свойствами: Enab­led=Fal­se, ColCount=7, RowCount=7, FixedRows=0, FixedCols=0), поля Edit1 (число потопленных кораблей), Edit2 (число выстрелов, Text=0, ReadOnly=True), счетчик SpinEdit1 (п. 2.3.6.4) (число кораблей, MinValue=1, MaxValue=49) и две командные кнопки.

 
 

Рис. 8.1.6.1. Вид формы игры «Морской бой»

 

Приведем тексты процедур обработки событий.

Var // раздел переменных модуля Unit1

mk:Array [0..6,0..6] of byte; // массив с признаками расположения кораблей

procedure TForm1.Button1Click(Sender: TObject); // кнопка «Начало»

var i,j,k:integer; // обьявление переменных циклов

begin edit1.text:='0'; edit2.text:='0'; // обнуление значений полей edit1, edit2

k:=1; randomize; // включение счетчика случайных чисел

for i:=0 to 6 do // очистка массива (цикл по строкам)

for j:=0 to 6 do // цикл по колонкам

begin mk[i,j]:=0;StringGrid1.cells[i,j]:=''; end; // очистка текущей ячейки

while k<=SpinEdit1.Value do // цикл формирования положения кораблей

begin i:=random(7);j:=random(7); // формирование координат корабля

if mk[i,j]=0 then begin mk[i,j]:=1; k:=k+1;end; // пометка ячейки с кораблем

end; // конец цикла

StringGrid1.enabled:=true; // разрешение на использование таблицы

end;

procedure TForm1.StringGrid1Click(Sender:TObject);// щелчок по таблице

begin edit2.text:=inttostr(strtoint(edit2.text)+1); // число выстрелов +1

if length(StringGrid1.cells[stringgrid1.Col,stringgrid1.row])=0 then

if mk[stringgrid1.col,stringgrid1.row]=1 then // попадание

begin StringGrid1.cells[stringgrid1.Col,stringgrid1.row]:='Потоплен';

edit1.text:=inttostr(strtoint(edit1.text)+1);// число потопленных кораблей+1

if SpinEdit1.Value=strtoint(edit1.text) then // все корабли потоплены

begin beep; Application.MessageBox('Победа!','Морской бой',MB_OK);

StringGrid1.enabled:=false; // блокировка таблицы

end;

end

else begin StringGrid1.cells[stringgrid1.col,stringgrid1.row]:='X';end;// промах

end;

procedure TForm1.Button2Click(Sender: TObject); // кнопка «Выход»

begin Close; end; // завершение работы программы




Поделиться с друзьями:


Дата добавления: 2014-12-08; Просмотров: 1640; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.065 сек.