Итак, в последней части про создание тестов на Delphi, с помощью типизированных файлах, я рассказал как подготовить наш тест для редактирования, то есть открыть этот тест и вывести все результаты с отмеченными правильными ответами. Сейчас расскажу как я реализовал. Тут все просто, я запоминаю при считывании одного вопроса на какой позиции (указатель) у нас стоит в файле, затем я получаю количество ответов для этого вопроса, а раз мы знаем количество ответов и на какой позиции (компоненте) стоит указатель в файле, то спокойно можем заменить старую информацию на новую, обычной запись данных в типизированный файл. То есть я считал например первый вопрос, у нас в нем например 2 ответа в итоге указатель будет на 2, а количество ответов тоже 2, значит когда я записываю исправленные варианты ответа я устанавливаю указатель в файле на позицию равную:
- на какой позиции сейчас стоит указатель минус количество ответов для этого вопроса в итоге мы не ошибемся и заменим информацию с нужной нам позиции.
Ну что я добавил нового это
- TForm
- TButton
Я добавил новую форму, в которой по нажатию двойным щелчком по TChecklistBox в данной форме, а точнее на ней установлен TEdit будет отображаться выбранный ответ, который в дальнейшем может быть отредактирован. На кнопку TButton на новой форме я написал код, который будет редактирование данные в самом TCheckListBox
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.CheckListBox1.Items[Form1.CheckListBox1.ItemIndex]:=Edit1.Text;
Form2.Close;
end;
Далее я на главной форме установил также еще один TButton, который будет уже отвечать за непосредственное редактирование данных в файле, код выглядит следующим обрзом
procedure TForm1.Button9Click(Sender: TObject);
var
i,seeks,otvc:integer;
begin
seeks:=cc;
AssignFile(F,OpenDialog1.FileName);
Reset(F);
Test.Name_v:=Edit1.Text;
Test.count_otv:=CheckListBox1.Items.Count;
otvc:=Test.count_otv;
for i:=0 to edit_index-1 do
begin
if CheckListBox1.Checked[i]=True then
Test.pr_ot:=IntToStr(i)
else
Test.pr_ot:='';
Test.otv:=CheckListBox1.Items[i];
Test.count_v:=3;
Seek(F,seeks-edit_index);
Write(F,Test);
inc(seeks);
end;
CloseFile(F);
end;
Все, что писал выше все тут и есть, то есть устанавливаю указатель в файле на ту компоненту, на которой стоит указатель минус количество ответов для данного вопроса и тогда у нас все будет нормально получаться при редактировании. Исходники прилаживаю полного проекта, в следующих статьях рассмотрим как можно удалять данные теста.
Исходники статьи качаем тут