Бегущая строка (Delphi)
Создадим программу вывода бегущей строки, которая выводится в заголовке формы (рис. 8.1.3.1).
Рис. 8.1.3.1. Вид формы с бегущей строкой
Разместим компоненты: Timer1 (Enabled=False, Interval=100), Edit1 (поле для ввода текста бегущей строки), ScrollBar1 (регулятор скорости вывода строки со свойствами (п. 2.3.6.1): Min=10, Max=1000, Position=10, LargeChange=20, SmallChange=10) и кнопки управления.
Приведем тексты процедур программы.
procedure TForm1.Button1Click(Sender:TObject);//кнопка Начать/Законч.
Begin
if Button1.Caption= 'Начать' then // кнопка «Начать»
begin Button1.Caption:= 'Закончить'; // смена наименования кнопки
Edit1.Enabled:= False; Form1.Caption:= Edit1.Text + ' ';
Timer1.Enabled:= True; end
else // кнопка «Закончить»
begin Button1.Caption:= 'Начать'; // смена наименования кнопки
Edit1.Enabled:=True; Timer1.Enabled:= False;Form1.Caption:=''; end;
end;
procedure TForm1.Button2Click(Sender: TObject); // кнопка «Выход»
begin Close; end;
procedure TForm1.Timer1Timer(Sender: TObject); // таймер
begin Timer1.Interval:= ScrollBar1.Min+ScrollBar1.Max-ScrollBar1.Position;
Form1.Caption:=Copy(Form1.Caption, 2, (Length(Form1.Caption)-1)) +
Copy (Form1.Caption,1,1);
End;
Рисование на экране (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; // завершение работы программы
Дата добавления: 2016-03-22; просмотров: 1658;