Итак продолжу серию статей по созданию тестов на Delphi с помощью файлов. В первой части мы узнали как можно записать наш тест в типизированный файл, напомню, что запись происходит по определенной структуре, то есть «записи«, которую мы описали и Вы сможете увидеть в первой части нашей статьи. Далее во второй части мы узнали как можно считать все вопросы из типизированного файла и отобразить их в
- TCheckListBox
- TEdit
Теперь мы обсудим как определить выбрал ли пользователь правильные ответы. Для этого, если вспомните, я в нашей структуре описал поле pr_ot:string[255], и определяю, если стоял указатель на выбранном ответе, то я в эту переменную записывал номер выбранного правильного ответа пользователя, если ничего не выбрано, то присваивал пустое значение. Далее при считывании из файла, я получал для каждого вопроса номер правильного ответа и если он там был, то формировал переменную с этими всеми правильными ответами вот так
- pr_ot=1 2
То есть получая такую переменную, в которой есть 1 пробел 2, я знаю, что правильные ответы это под номером 1 и под номером 2.
Далее когда вопрос был выгружен, я получал ответы, которые выбрал пользователь и формировал точно такую же переменную, только уже что выбрал пользователь например
- pr_user_ot=2 3
То есть здесь я уже знаю, что пользователь выбрал 2 и 3 вариант ответа и потом я просто сравнивал эти переменные, если равны, то правильный вопрос (ему засчитывается), если нету, то неправильные. Вот код, что я написал на кнопку «Открыть» (имеется ввиду открыть тест) на событие OnClick
procedure TForm1.Button5Click(Sender: TObject);
var
i,j:integer;
begin
try
if OpenDialog1.Execute then
begin
pr_ot:='';
k:=1;
CheckListBox1.Clear;
AssignFile(F,OpenDialog1.FileName);
Reset(F);
Seek(F,count);
if Eof(F)=True then
begin
Edit1.Clear;
CheckListBox1.Clear;
ShowMessage('All test loaded');
CloseFile(F);
exit;
end;
Read(F,Test);
j:=Test.count_otv;
for i:=0 to j-1 do
begin
Seek(F,count);
if Eof(F)=True then
begin
Edit1.Clear;
CheckListBox1.Clear;
ShowMessage('All test loaded');
CLoseFile(F);
exit;
end;
Read(F,Test);
if Test.pr_ot<>'' then
pr_ot:=pr_ot+' '+Test.pr_ot;
CheckListBox1.Items.Add(Test.otv);
Edit1.Text:=Test.Name_v;
inc(count);
end;
end;
except
on e:Exception do
CloseFile(F);
end;
end;
Этот код я уже формировал и показывал Вам. И выше уже все пояснено, что и как я организовывал, далее я написал на кнопку «Далее» (имеется ввиду открыть следующий вопрос) на событие OnClick следующий код
procedure TForm1.Button3Click(Sender: TObject);
var
i,j:integer;
begin
try
for i:=0 to CheckListBox1.Items.Count-1 do
begin
if CheckListBox1.Checked[i] then
pr_ch_ot:=pr_ch_ot+' '+IntToStr(i);
end;
if pr_ot[Length(pr_ot)]=' ' then
pr_ch_ot:=pr_ch_ot+' ';
if pr_ch_ot=pr_ot then
begin
Application.MessageBox('Yes','Test',MB_OK);
end
else
begin
Application.MessageBox('No','Test',MB_OK);
end;
pr_ch_ot:='';
CheckListBox1.Items.Clear;
Edit1.Clear;
Seek(F,count);
if EOF(F)=True then
begin
Application.MessageBox('All Test Loaded','Test',MB_OK);
exit;
end;
Read(F,Test);
j:=Test.count_otv;
pr_ot:='';
for i:=1 to j do
begin
Seek(F,count);
if EOF(F)=True then
begin
Application.MessageBox('All Test Loaded','Test',MB_OK);
exit;
end;
Read(F,Test);
CheckListBox1.Items.Add(Test.otv);
if Test.pr_ot<>'' then
pr_ot:=pr_ot+' '+Test.pr_ot;
Edit1.Text:=Test.Name_v;
inc(count);
end;
except
on e:Exception do
end;
end;
Как видите то, что я Вам и говорил считываю значение, что выбрал юзер и потом сравниваю. Если Вы хотите организовать так, чтобы например если пользователь выбрал не все правильные ответы, а только часть, то можете организовать количество входимости выбранных пользователем в правильные, и в зависимости от количество выводить результат и ставить оценку, засчитывать нужный Вам балл. А организовать это, Вам надо тогда формировать не переменную с выбранными ответами юзера, а сразу с помощью pos искать в правильных ответах и увеличивать переменную, а потом анализировать количество вошедших ответов в правильные. В следующей статье про тесты поговорим, как можно организовать тесты на файлах, использую и картинки и другие типы файлов.