Запускаю цикл, по которому заполняются данные списка for i:=0 to PQuestion(node.Data).ResultCount-1 do with ResultView.Items.Add do

begin
Caption:=PQuestion(node.Data).ResiltText[i];
if PQuestion(node.Data).ResiltValue[i]=true then

begin
SubItems.Add('Да');
ImageIndex:=2;

end
else

begin
SubItems.Add('Нет');
ImageIndex:=1;

end; end; end;

Это событие генерируется каждый раз, когда пользователь выбрал какой-нибудь элемент. По выбору вопроса мы должны заполнить ответы в списке ListView. Но прежде чем заполнять, я очищаю список, потому что он уже мог быть заполненным данными другого вопроса.

В обработчик события нам передаётся параметр Node типа TTreeNode, который указывает на выделенный элемент. Второй строчкой кода я проверяю, если выделенный элемент равен nil (ничего не выбрано), то нужно выходить из процедуры.

Чтобы получить доступ к структуре PQuestion, в которой хранятся данные об ответах выделенного вопроса, мы должны обратиться к свойству Data выделенного элемента Node. Как ты помнишь, в это свойство мы поместили указатель на структуру PQuestion. Но программа не может знать какого типа этот указатель, поэтому мы должны явно указывать это -PQuestion(node.Data).

Далее, я запускаю цикл от 0 до количества вариантов ответов в данном вопросе PQuestion(node.Data).ResultCount минус 1. Внутри цикла я выполняю код ResultView.Items.Add, который создаёт очередной элемент списка. Здесь метод Add также возвращает указатель на созданный элемент, вместе с которым и будет выполняться дальнейший код (об этом говорит оператор with). А внутри кода я выполняю следующее:

1. 1. Заполняю заголовок элемента Caption.

2. 2. Если PQuestion(node.Data).ResiltValue[i] равно true, то есть ответ верный, то я добавляю дочерний элемент (текст этого элемента будет отображаться во второй колонке списка) SubItems.Add('Да') и присваиваю 2-й индекс иконки. Иначе текст дочернего элемента будет равен «Нет» и иконка будет иметь индекс единицы.

 

Таким образом, внутри цикла будет обработаны все варианты ответов, и все они будут добавлены в список. Попробуй сейчас запустить программу и создать пару вопросов с различными вариантами и посмотреть, как всё будет выглядеть. Моё окно программы ты можешь увидеть на рисунке 25.3.8.

Совсем забыл описать код, по которому мы будем отображать окно, показанное мной на рисунке 25.3.8. Для этого нам надо подкорректировать обработчик события OnClick для кнопки создания нового проекта теста:

procedure TTestEditorForm.NewButtonClick(Sender: TObject);

begin NewTestForm.ShowModal; if NewTestForm.ModalResult<>mrOK then exit;