КАТЕГОРИИ: Архитектура-(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, SmallChange=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) (со свойствами: Enabled=False, 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; Просмотров: 1717; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |