Текст программы
Следующие за этим оператором инструкции обеспечивают настройку компонента. В том числе, они путем присваивания значения свойству Onclick задают функцию обработки события click. В рассматриваемой программе для обработки события click на всех компонентах RadioButton используется одна и та же функция, которая путем опроса значения свойства checked фиксирует номер выбранного ответа и делает доступной кнопку Дальше (Button 1).
После запуска программы и вывода на экран стартовой формы происходит событие onActivate. Функция обработки этого события проверяет, указан ли в командной строке параметр – имя файла теста. Реализация программы предполагает, что если имя файла теста задано без указания пути доступа к нему, т файл теста и файлы с иллюстрациями находятся в том же каталоге, что и программа тестирования. Если же путь доступа указан, то файлы с иллюстрациями должны находиться в том же каталоге, что и файл теста. Такой подход позволяет сгруппировать все файлы одного теста в одном каталоге.
Если файл теста задан, функция открывает его, читает название теста и вводную информацию и затем выводит их в диалоговое окно, причем название выводится в заголовок, а вводная информация – в поле Label1.
Непосредственное чтение строк из файла выполняет функция Getstring. Значением функции является длина строки. Следует обратить внимание на то, что функция GetString возвращает строку AnsiString.
После того как прочитана общая информация о тесте, программа считывает из файла теста информацию об уровнях оценки и фиксирует ее в массивах level и mes. Критерий достижения уровня (количество правильных ответов) считывает функция Getint.
После вывода информационного сообщения программа ждет, пока пользователь не нажмет кнопку Ok (Button№).
Командная кнопка Button№ используется:
- для завершения работы программы, если в командной строке не указан файл теста;
- для активизации процесса тестирования (после вывода информационного сообщения);
- для перехода к следующему вопросу (после выбора варианта ответа);
- для завершения работы программы (после вывода результата тестирования).
Таким образом, реакция программы на нажатие кнопки Button1 зависит от состояния программы. Состояние программы фиксирует свойство Tag кнопки Button 1.
После вывода информации о тесте значение свойства Tag кнопки Button1 равно нулю. Поэтому в результате щелчка на кнопке Button 1 выполняется та часть программы, которая обеспечивает вывод первого вопроса и замену находящегося на кнопке текста ОК на текст Дальше, и заменяет значение свойства Tag на единицу.
В процессе тестирования значение свойства Tag кнопки Button 1 равно единице. Поэтому функция обработки события click сравнивает номер выбранного ответа (увеличенный на единицу номер компонента RadioButton) с номером правильного ответа, увеличивает на единицу счетчик правильных ответов (в том случае, если выбран правильный ответ) и активизирует процесс чтения следующего вопроса. Если попытка чтения очередного вопроса завершилась неудачно (это значит, что вопросы исчерпаны), функция выводит результаты тестирования, заменяет текст на командной кнопке на ОК и подготавливает операцию завершения работы программы (свойству Tag присваивает значение 2).
Чтение вопроса (вопрос, информация о количестве альтернативных ответов, номер правильного ответа и признак наличия иллюстрации, а также имя файла иллюстрации и альтернативные ответы) из файла теста выполняет функция GetVopros.
Вывод вопроса, иллюстрации и альтернативных ответов выполняет функция showVopros. Сначала функция выводит вопрос – присваивает значение свойству caption компонента Labe l1. Затем, если к вопросу есть иллюстрация, функция вычисляет размер области, которую можно выделить для отображения иллюстрации, и загружает иллюстрацию. Если размер иллюстрации больше размера области, функция устанавливает максимально возможный размер компонента imagei и присваивает значение false свойству AutoSize и true – свойству Proportional, обеспечивая тем самым масштабирование иллюстрации. После этого функция выводит альтернативные ответы. Положение компонентов, обеспечивающих вывод альтернативных ответов, отсчитывается от нижней границы компонента image 1, если к вопросу есть иллюстрация, или компонента Label1, если иллюстрации нет.
Сразу после вывода вопроса кнопка Дальше (Button 1) недоступна. Сделано это для того, чтобы блокировать возможность перехода к следующему вопросу, если не дан ответ на текущий. Доступной кнопку Дальше делает функция обработки события Click на одном из компонентов RadioButton.
Кроме того, функция путем сканирования (проверки значения свойства checked компонентов массива RadioButton) определяет, на каком из компонентов массива испытуемый сделал щелчок и, следовательно, какой из вариантов ответа выбран. Окончательная фиксация номера выбранного ответа и сравнение его с номером правильного ответа происходит в результате нажатия кнопки Дальше.