Как сделать тест делфи
Глава 13
Разработать программу для тестирования знаний в разных областях. Пользователь должен ответить на несколько вопросов, которые случайным образом выбираются из общей базы вопросов. После того как пользователь ответил на все вопросы, программа должна высчитать и выдать результат прохождения теста — процент правильных ответов. Также необходимо дать возможность пользователю подключать внешние файлы, содержащие вопросы и варианты ответов к ним. Для того чтобы пользователь не смог прочитать правильные ответы, следует зашифровать файл с вопросами и ответами.
Перед тем как разработать сам тест, разберем содержимое файла, в котором будут храниться вопросы и варианты ответов к ним. Это будет ini-файл следующей структуры:
0=Неправильный вариант к первому вопросу
1= Неправильный вариант ко второму вопросу
0=Неправильный вариант к первому вопросу
1= Неправильный вариант ко второму вопросу
0=Неправильный вариант к первому вопросу
1=Неправильный вариант ко второму вопросу
В этом ini-файле шесть разделов: num, Q, A, W1, W2 и W3. Как вы понимаете, если кто-то заглянет в этот файл, то уже через несколько минут он будет знать правильные ответы на все вопросы. А если он этот файл подкорректирует, то и вовсе будет получать только правильные варианты ответов. Для того чтобы этого не случилось, мы будем шифровать нашу базу вопросов. Это можно сделать с помощью программы Блокнот-шифровальщик, рассмотренной в главе 7. Для шифрования выберем небольшое смещение, например, 101. После того как вы создали все вопросы и варианты ответов к ним, не забудьте указать количество вопросов в разделе num. После этого зашифруйте базу, используя смещение 101.
⊚ Пример зашифрованной базы вопросов/ответов можно найти на прилагаемом к книге компакт-диске в файле Chapter_13\comp.ini.
Разработка формы
Создайте новый проект Delphi. Присвойте свойству Caption формы значение Tester, а свойству BorderStyle — bsNone. У верхнего края формы разместите компонент Label категории Standard, присвоив его свойству Caption значение Первый вопрос:.
Ниже разместите компонент Memo категории Standard, с помощью которого мы будем отображать текущий вопрос. Присвойте свойству Memo1.Readonly значение True, чтобы пользователь не мог изменить текст вопроса.
Под вопросом будут расположены варианты ответов. Разместите под компонентом Memo1 компонент RadioGroup (группа переключателей) категории Standard и присвойте его свойству Caption значение Варианты ответов:. Разместите на компоненте RadioGroup1 четыре компонента RadioButton (переключатели) категории Standard. Очистите для каждого из них свойство Caption, а свойству Name присвойте значения an1, an2, an3 и an4 соответственно.
В любом месте формы разместите компонент Label, который изначально будет невидимым. Он будет служить для отображения результатов и в последствии будет растянут на всю форму. Установите для него свойства согласно табл. 13.1.
Таблица 13.1. Свойства компонента Label, отображающего результат теста
Свойство | Значение | Пояснение |
---|---|---|
Alignment | taCenter | Выравнивание текста — по центру |
Color | clBlack | Цвет фона — черный |
Font.Color | clRed | Цвет текста — красный |
Font.Name | Arial | Название шрифта |
Font.Size | 26 | Размер шрифта |
Font.Style | [fsBold] | Начертание шрифта — полужирное |
Visible | False | При запуске программы метка невидима |
Осуществлять переход к следующему вопросу мы будем с помощью панелей. Разместите под вариантами ответов пять компонентов Panel категории Standard. Для каждой из них присвойте свойству Caption значение Следующий вопрос>>>>>, свойству Color — значение clMaroon, а свойству Font.Color — значение clWhite. Присвойте им имена (свойство Name) p1, р2, p3, р4 и р5. Для того чтобы убрать выпуклость и привести панель к виду стильной кнопки, изменим значение свойства BevelInner на bvRaised, а свойства BevelOuter — на bvLowered. Для всех панелей, кроме p1, присвойте свойству Visible значение False (изначально будет видна только первая панель).
Поскольку в программе будет предусмотрена возможность динамической загрузки базы вопросов/ответов, нам понадобится диалоговое окно открытия файла. Для этого разместим на форме компонент OpenDialog категории Dialogs и присвоим ему имя Open1 (свойство Name). Кроме того, определите в свойстве Filter следующий фильтр: ini-файлы|*.ini|Все файлы|*.*.
Теперь разработаем меню программы. Для этого разместите на форме компонент MainMenu категории Standard и создайте меню в соответствии с рис. 13.1.
⇖ Разработка меню рассматривается в главе 6, «Программа просмотра рисунков».
Рис. 13.1. Меню для программы-теста
Полученная форма должна примерно соответствовать рис. 13.2.
Рис. 13.2. Форма программы-теста
Разработка программного кода
Для начала, объявим все глобальные переменные:
Создание тестирующих программ в среде программирования Delphi
Предлагаемые методические рекомендации отображают проектирование, оформление и разработку тестирующих программ в среде программирования Delphi.
Рекомендуются учителям информатики, учителям школьных предметов, учащимся старших классов общеобразовательных средних школ с углубленным изучением информатики.
Введение
Ощутимые шаги в раскрытии глубинных закономерностей человеческого обучения, сделанные мировой дидактикой, а также бурный прогресс в области развития персональных компьютеров выводят педагогов на необходимость создания электронных тестирующих программ для самоконтроля и самопроверки знаний обучающихся.
Основная цель данных методических рекомендаций состоит в том, чтобы дать знания о технологии создания тестирующих программ в среде программирования Delphi.
В результате использования этих рекомендаций могут быть сформированы умения и навыки проектирования тестирующих программ в среде программирования Delphi.
Создание тестирующей программы с использованием компонентов
TLabel, TButton, TRadioGroup
Создание интерфейса приложения
2. Задайте объектам следующие свойства
Объект | Свойство | Значение |
Форма | Name | Form1 |
Caption | Тест самопроверки | |
Color | cllnfoBk | |
RadioGroup | Name | RadioGroup1, :, RadioGroup5 |
Caption | — | |
Items | :(варианты ответов) | |
ItemIndex | 0,1,2,3 (индекс выбранного переключателя) | |
Font | Times New Roman, обычный, размер 14, цвет тёмно-синий | |
Label | ||
(метка) | Name | Label1. Label5 |
Caption | :(текст выбранного вопроса) | |
Font | Times New Roman, полужирный, размер 14, цвет тёмно-синий | |
Label | ||
(метка) | Name | Label4 |
Caption | — | |
Font | Times New Roman, полужирный, размер 14, цвет красный | |
Label | ||
(метка) | Name | Label5 |
Caption | — | |
Font | Times New Roman, полужирный, размер 14, цвет красный | |
Button | ||
(кнопка) | Name | Button1 |
Caption | Число правильных ответов | |
Button | ||
(кнопка) | Name | Button2 |
Caption | Выход |
Написание кода
1. Напишите программу теста в окне кода.
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin m:=0; if RadioGroup1.ItemIndex=1 then m:=m+1 else m:=m; end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin n:=0; if RadioGroup2.ItemIndex=0 then n:=n+1 else n:=n; end;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin k:=0; if RadioGroup3.ItemIndex=0 then k:=k+1 else k:=k; end;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin w:=0; if RadioGroup4.ItemIndex=0 then w:=w+1 else w:=w; end;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin v:=0; if RadioGroup5.ItemIndex=2 then v:=v+1 else v:=v; end;
procedure TForm1.Button1Click(Sender: TObject);
begin l:=m+n+k+w+v; if l=5 then
begin Label4.Caption:=IntToStr(l); Label5.Caption:=’Отлично!’; end else if l=4 then
Написание кода
1. Запрограммируйте метку Label2 («Следующий вопрос») так, чтобы в метке Label1 выводился следующий вопрос, варианты ответа на него, и при достижении последнего вопроса метка Label2 становилась недоступной.
3.Напишите программу теста в окне кода.
a,b,c,d,f,g,j,l,m,n,k,p:integer; implementation uses Unit2;
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin a:=0; if RadioGroup1.ItemIndex=0 then a:=a+1 else a:=a; RadioGroup1.Visible:=False; end;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin b:=0; if RadioGroup2.ItemIndex=1 then b:=b+1 else b:=b; RadioGroup2.Visible:=False; end;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin d:=0; if RadioGroup3.ItemIndex=1 then d:=d+1 else d:=d; RadioGroup3.Visible:=False; end;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin c:=0; if RadioGroup4.ItemIndex=0 then c:=c+1 else c:=c; RadioGroup4.Visible:=False; end;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin f:=0; if RadioGroup5.ItemIndex=3 then f:=f+1 else f:=f; RadioGroup5.Visible:=False; end;
procedure TForm1.RadioGroup6Click(Sender: TObject);
begin g:=0; if RadioGroup6.ItemIndex=2 then g:=g+1 else g:=g; RadioGroup6.Visible:=False; end;
procedure TForm1.RadioGroup7Click(Sender: TObject);
begin j:=0; if RadioGroup7.ItemIndex=1 then j:=j+1 else j:=j; RadioGroup7.Visible:=False; end;
procedure TForm1.RadioGroup8Click(Sender: TObject);
begin l:=0; if RadioGroup8.ItemIndex=1 then l:=l+1 else l:=l; RadioGroup8.Visible:=False; end;
procedure TForm1.RadioGroup9Click(Sender: TObject);
begin m:=0; if RadioGroup9.ItemIndex=3 then m:=m+1 else m:=m; RadioGroup9.Visible:=False; end;
procedure TForm1.RadioGroup10Click(Sender: TObject);
begin n:=0; if RadioGroup10.ItemIndex=2 then n:=n+1 else n:=n; RadioGroup10.Visible:=False; end;
procedure TForm1.Label2Click(Sender: TObject);
1: begin Label1.Caption:=’2 вопрос. Массовое производство компьютеров началось в:’;
2: begin Label1.Caption:=’3 вопрос. Элементной базой процессоров ЭВМ 2-ого поколения являлись:’; RadioGroup3.Visible:=True; end;
3:begin Label1.Caption:=’4 вопрос. Какое устройство не предназначено для обработки информации?’; RadioGroup4.Visible:=True; end;
4:begin Label1.Caption:=’5 вопрос. За минимальную единицу измерения количества информации принят:’; RadioGroup5.Visible:=True; end;
5:begin Label1.Caption:=’6 вопрос. Сколько байтов занимает в памяти ПК слово ПОБЕДА?:’;
6:begin Label1.Caption:=’7 вопрос. Производительность работы компьютера зависит от:’;
7:begin Label1.Caption:=’8 вопрос. Какое устройство может оказывать вредное воздействие на здоровье человека?’; RadioGroup8.Visible:=True; end;
8:begin Label1.Caption:=’9 вопрос. При выключении компьютера вся информация стирается:’;
9:begin Label1.Caption:=’10 вопрос. В целях сохранения информации дискеты необходимо оберегать от:’; RadioGroup10.Visible:=True; Button2.Visible:=True;Label2.Visible:=False; end; end;
procedure TForm1.Button2Click(Sender: TObject);
begin p:= a+b+c+d+f+g+j+l+m+n; if p=10 then
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Отлично!’; end
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Хорошо!’; end
begin Label1.Caption:=IntToStr(p)+’ правильных ответов из 10 вопросов.’+’ Удовлетворительно.’;
end else if p
Объект | Свойство | Значение |
Форма | Name | Form1 |
Caption | Тестирующая программа по информатике | |
Color | clSkyBlue | |
MainMenu | Name | MainMenu1 |
Label | ||
(метка) | Name | Label1 |
Caption | — | |
Font | MS Sans Serif, полужирный курсив, размер 14, цвет красный | |
Label | ||
(метка) | Name | Label2. Label7 |
Caption | :(текст вопроса) | |
Font | MS Sans Serif, полужирный курсив, размер 12, цвет тёмно-синий | |
Button | ||
(кнопка) | Name | Button1 |
Caption | Выход | |
Font | MS Sans Serif, полужирный курсив, размер 14, цвет чёрный | |
Image | Name | Image1 |
Visible | True | |
Stretch | True | |
Picture | указать путь к рисунку | |
Panel | Name | Panel1. Panel6 |
Caption | 1,:6 | |
PageControl | Name | PageControl1 |
Active Pages | TabSheet1 | |
Visible | True | |
TabSheet1. TabSheet6 | Name | TabSheet1. TabSheet6 |
Caption | вопрос1. вопрос6 | |
RadioGroup | Name | RadioGroup1, :, RadioGroup6 |
Caption | — | |
Items | :(варианты ответов) | |
ItemIndex | 0,1,2,3 (индекс выбранного переключателя) |
Написание кода
2. Напишите программу теста в окне кода.
m,n,k,w,l,s,z:integer; implementation uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin n:=0; if RadioGroup1.ItemIndex=0 then begin n:=n+1; Panel1.Visible:=False; end else n:=n;
procedure TForm1.RadioGroup2Click(Sender: TObject);
begin m:=0; if RadioGroup2.ItemIndex=2 then begin m:=m+1;Panel2.Visible:=False; end else m:=m;
procedure TForm1.RadioGroup3Click(Sender: TObject);
begin k:=0; if RadioGroup3.ItemIndex=0 then begin k:=k+1; Panel4.Visible:=False; end else k:=k;
procedure TForm1.RadioGroup4Click(Sender: TObject);
begin w:=0; if RadioGroup4.ItemIndex=0 then begin w:=w+1; Panel3.Visible:=False; end else w:=w;
procedure TForm1.RadioGroup5Click(Sender: TObject);
begin s:=0; if RadioGroup5.ItemIndex=1 then begin s:=s+1; Panel5.Visible:=False; end else s:=s;
procedure TForm1.RadioGroup6Click(Sender: TObject);
begin z:=0; if RadioGroup6.ItemIndex=1 then begin z:=z+1; Panel6.Visible:=False; end else z:=z;
procedure TForm1.N3Click(Sender: TObject);
begin l:=m+n+k+w+s+z; Label1.Caption:=IntToStr(l)+’ правильных ответов из 6 вопросов’; end;
procedure TForm1.N4Click(Sender: TObject);
procedure TForm1.N7Click(Sender: TObject);
begin AboutBox.show; end;
procedure TForm1.N6Click(Sender: TObject);
begin MessageDlgPos(‘Будьте внимательны при выборе варианта ответа!
Повторный выбор ответа на вопрос недоступен!’,mtInformation,[mbOK],0,300,200); end; end.
3.Сохраните форму и проект в своей папке.
Литература
Создание файла (txt) теста через Delphi
Вложения
проект 2.0.1.rar (187.4 Кб, 16 просмотров) |
Создание програмы-теста на DELPHI
Помогите создать тест на Делфи про Строковый тип данных Паскаля=))
Чтение с txt файла и запись в StringGrid Delphi 7
Так как только учусь не могу понять как записать правильно. Читать оно читает, а данные не знаю как.
Создание и сохранение txt файла.
У меня не получается с объектом TFileStream. Помогите, чтобы записалось в файл(допустим.
Поиск и удаление текста в *.txt Delphi, перезапись файла
Здравствуйте, подскажите пожалуйста! Вопрос пустяковый если честно но разобраться не могу :cry.
Добавлено через 1 минуту
И убери эти вторые begin..end из указаной процедуры.
Так, ну в целом, для интересующихся, имеем вот такую функцию записи в файл:
По делу: лучше не использовать просто название файла, если мне память не изменяет (а она может изменять),то седьмая делфи отсылает в таком случае в папку system32:
Это будет однозначное указание на файл в той же директории, что и исполняемый файл. Хотя, конечно, мне могут сказать, что и первый вариант правильный и я спорить не буду.
Итого, я бы рекомендовал сделать так, это может дать результат:
Небольшая оптимизация: все, что имеет в комментариях слово «формирование» лучше перенести в обработчик OnResize формы. Изменение положения элементов логичнее обрабатывать там.
Проверить все это не могу, выбивает исключение при нажатии кнопки «следующий», а вылавливать его сейчас нет времени.
Препод сказал сделать с TXT форматом, чтобы типа любой «неуч» мог изменить его структуру
Добавлено через 1 минуту
Внёс данные коррективы, но успеха 0, к сожалению(
Вложения
проект 2.0.2.rar (188.8 Кб, 19 просмотров) |
Разберем процедуру Button2Click поэтапно:
Ок, тут вопросов нет. Хорошая проверка корректности.
В этом куске кода каждая вторая строчка вызывает вопросы. Переменная STEP не выполняет своей функции вообще.
В этом куске у нас полная солянка из значений. Вообще непонятно, какому тесту и что мы присваиваем.
Тут понятно и без лишних слов.
Вердикт: процедура непонятно что делает. Даже автор не знает, что там происходит, такое ощущение, что это попытка с помощью урагана на тракторном заводе собрать танк Т-90.
Внимание! В результате выполнения данного кода неквалифицированным персоналом есть вероятность случайного зарождения кибернетической жизни с угрозой дальнейшего захвата человечества. Рекомендуется удалить весь код процедуры без возможности восстановления и попробовать написать все заново, используя основы алгоритмики. За возможность появления в вашей квартире Джона Коннора, Сары Коннор и терминатора с целью устранения процедуры автор поста ответственности не несет.