Рис. 1.69. Окно программы

Тест — последовательность вопросов и альтернативных ответов, должен находиться в файле. Количество вопросов теста не огра ничено. Программа тестирования должна получать имя файла теста из командной строки.
Ниже приведен пример файла теста. Первая строка — это заго ловок теста. Потом следует описание 4-х уровней оценок. Для каждого уровня задается сообщение и количество правильных ответов, необходимых для достижения уровня. Далее следуют вопросы и варианты ответов. После каждого альтернативного ответа стоит 1 или 0. Единица показывает, что данный вариант ответа — правильный. Следует обратить внимание, что каждое сообщение, каждый вопрос и ответ в файле теста представлены одной строкой.

Экономика
Вы прекрасно справились с вопросами. Оценка — ОТЛИЧНО!
6
На один или несколько вопросов Вы ответили неправильно. Оценка — ХОРОШО.
5
На некоторые вопросы Вы ответили неправильно. Оценка —
УДОВЛЕТВОРИТЕЛЬНО.
4
Вы плохо подготовились к испытанию. Оценка — ПЛОХО!
3
Карл Маркс написал книгу:
"Материализм и эмпириокритицизм"
О
"Как нам бороться с инфляцией"
О
"Капитал"
1
Что означает выражение "Делать бизнес"?
обманывать и хитрить
О
учиться в школе бизнесменов
О
заниматься конкретным делом, приносящим доход
1
Когда впервые появились бартерные сделки?
при первобытнообщинном строе
1
в период общественного разделения труда
О
в наше время
О
Слово "бухгалтер" переводится с немецкого как:
человек, держащий книгу
1
человек, считающий на счетах
О
человек, работающий с большой кипой бумаг
О
Как переводится с английского "ноу-хау" и что оно обозначает?
секрет
О
новое предприятие
О
новая идея (знаю, как)
1
Конкуренция в переводе с латинского:
столкновение
1
соревнование
О
конкурс
О

implementation
($R *.dfm}
var
f: TextFile; // файл теста (вопросы и варианты ответов)
nq: integer; // количество вопросов в тесте
right: integer; // количество правильны;< ответов
level: array[1..4] of integer; // критерии оценок
mes: array[1..4] of string; // комментарии
buf: string;
// читает вопрос из файла и выводит его
// в поля формы
function NextQw : boolean;
begin
if not EOF(f) then
begin
// прочитать и вывести вопрос
Readln(f,buf);
Forml.Labell.Caption := buf;
// прочитать и вывести варианты ответов
// 1-й вариант
Readln(f,buf) ; // прочитать 1-й вариант ответа
Forml.Label2.Caption : = buf;
Readlnff,buf); // оценка за выбор этого ответа:
// 1 — правильно, 0 — нет
Forml.RadioButtonl.Tag := StrToInt(buf);
// 2-й вариант
Readln(f,buf);
Forml.Label3.Caption := buf;
Readln(f,buf) ;
Forml.RadioButton2.Tag := StrToInt(buf);
// 3-й вариант
Readln(f,buf) ;
Forml.Label4.Caption := buf;
Readln(f,buf) ;
Forml.RadioButton3.Tag := StrToInt(buf);
// счетчик общего количества вопросов
nq: = nq + 1;
// кнопка Дальше недоступна,
// пока не выбран один из вариантов ответа
Forml.Buttonl.Enabled := False;
// ни один из переключателей не выбран
Forml.RadioButtonl.Checked := False;
Forml.RadioButton2.Checked := False;
Forml.RadioButton3.Checked := False;
NextQw := TRUE;
end
else NextQw := FALSE;
end;
// событие FormCreate возникает в момент
// создания формы
procedure TForml.FormCreate(Sender: TObject);
var
i: integer;
fname : string;
begin
( Если программа запускается из Delphi,
то шля файла теста надо ввести в
поле Parameters диалогового окна
Run Parameters, которое становится
доступным в результате выбора в меню
Run команды Parameters. )
fname := ParamStr(l); // взять имя файла теста
// из командной строки
if fname = '' then
begin
ShowMessage('В командной строке запуска программы' +#13+
'надо указать имя файла теста.');
Application.Terminate; //' завершить программу
end;
AssignFile(f,fname);
// а процессе открытия файла возможны
// ошибки, поэтому ...
try
Reset(f); // эта инструкция может вызвать ошибку
except
on EInOutError do
begin
ShowMessage('Ошибка обращения к файлу теста: ' +
fname);
Application.Terminate; // завершить программу
end;
end;
// здесь файл теста успешно открыт
// прочитать название теста — первая строка файла
Readln(f,buf) ;
Forml.Caption := buf;
// прочитать оценки и комментарии
for i: =1 to 4 do
begin
Readln(f,buf);
mes [i] := buf;
Readln(f,buf) ;
level[i] := StrToInt(buf);
end;
right := 0; // правильных ответов
nq := 0; // всего вопросов
NextQW; // прочитать и вывести первый вопрос
end;
// щелчок на кнопке Дальше
procedure TForml.ButtonlClick(Sender: TObject);
var
buf: string;
i: integer;
begin
if Buttonl.Caption = 'Завершить' then Close;
// добавим оценку за выбранный вариант ответа
// оценка находится в свойстве Button.Tag
// Button.Tag = 1 — ответ правильный, 0 — нет
if RadioButtonl.Checked then
right := right + RadioButtonl.Tag;
if RadioButton2.Checked then
right := right + RadioButton2.Tag;
if RadioButton3.Checked then
right := right + RadioButton3.Tag;
// вывести следующий вопрос
// NextQW читает и выводит вопрос
// NextQW = FALSE, если в файле теста
// вопросов больше нет
if not NextQW then
begin
// здесь значение NextQW = FALSE
Buttonl.Caption := 'Завершить1;
// скрыть переключатели и поля меток
RadioButtonl.Visible := False;
RadioButton2.Visible := False;
RadioButton3.Visible := False;
Label2.Visible := False;
Label3.Visible := False;
Label4.Visible := False;
buf := 'Тестирование завершено.1 + #13 +
'Правильных ответов: ' + IntToStr(right) +
' из ' + IntToStr(nq) + '.' + #13;
// выставить оценку
// right — кол-во правильных ответов
i:=1; // номер уровня
while (right < level[i]) and (i < 4) do
inc(i);
buf := buf + mes[i];
Labell.AutoSize := TRUE;
Labell.Caption := buf;
end;
end;
// щелчок на переключателе выбора первого варианта ответа
procedure TForml.RadioButtonlClick(Sender: TObject);
begin
Buttonl.Enabled := True; // кнопка Дальше теперь доступна
end;
procedure TForml.RadioButton2Click(Sender: TObject);
begin
Buttonl.Enabled := True;
end;
procedure TForml.RadioButton3Click(Sender: TObject);
begin
Buttonl.Enabled := True;
end;
end.