Добавляю новый элемент в дерево вопросов with QuestionTreeView.Items.Add(nil, NewQuest.Name) do

begin
ImageIndex:=0;
Data:=NewQuest;

end; end;

В самом начале я очищаю элементы управления окна EditQuestionForm. Потом я отображаю это окно, и если пользователь ввёл название вопроса и нажал ОК, то нужно обработать введённую информацию. Для начала выделяется память под переменную NewQuest. Эта переменная объявлена как PQuestion, а это указатель на структуру ТQuestion. Как ты знаешь, любые указатели создаются пустыми и чтобы они на что-то указывали, им надо выделять память. Я выделяю память с помощью функции New. Этой функции нужно передать в качестве параметра подо что нужно выделять память. Я указываю наш указатель PQuestion, по которому функция определит, сколько памяти надо выделить. Результат выполнения функции – указатель на выделенную память, который я сохраняю в переменной NewQuest.

Если нужно уничтожить выделенную память, то мы должны вызвать процедуру Dispose и передать ей переменную, которую нужно уничтожить, например Dispose(NewQuest). Но мне не надо уничтожать эту переменную, потому что она потом будет использоваться и я её добавляю в список QuestionList типа TList.

После того, как я выделил память для структуры NewQuest, я заполняю её поля в зависимости от введённой пользователем информации. Как только всё заполнено, я добавляю структуру в список:

QuestionList.Add(NewQuest);

После этого происходит самое интересное. Я должен создать новый элемент в дереве вопросов. Для этого выполняется следующий код:

with QuestionTreeView.Items.Add(nil, NewQuest.Name) do begin ImageIndex:=0; Data:=NewQuest; end;

Давай разберём этот код по частям. В первой строке я добавляю в дерево новый элемент с помощью вызова QuestionTreeView.Items.Add. В качестве параметров методу Add нужно передать указатель на родительский элемент в дереве и текст элемента. В качестве родительского элемента я передаю nilпотому что я буду создавать дерево без вложенных элементов. В качестве текста элемента я передаю текст вопроса.

Выполненный метод Add возвращает указатель на созданный элемент. И тут у меня стоит оператор with, который заставляет выполнять следующие действия с указанным объектом. Получается, что следующие действия между beginи endбудут выполняться с созданным элементом дерева вопросов. А у меня тут выполняется два действия:

ImageIndex:=0 – индексу иконки присваивается значение 0. Я бросил на форму список картинок ImageList, загрузил туда несколько картинок и указал этот список в свойстве Images нашего дерева. В этом коде я назначаю элементу первую картинку из созданного списка.

Data:=NewQuest – Свойство Data элемента дерева – это такое же свойство, как Tag у всех компонентов. Оно так же не влияет на работу компонента и его элементов и может использоваться в наших собственных целях. Это свойство имеет значение указателя, и мы можем в него вносить любые указатели. Я указываю здесь указатель на структуру NewQuest, которая связана с созданным элементом.

Теперь создадим обработчик события OnChange для нашего дерева:

procedure TQuestionResultForm.QuestionTreeViewChange(Sender: TObject; Node: TTreeNode); var i:Integer;

begin //Очищаю список ResultView.Items.Clear;


 

//Если не выделен элемент, то выход
if Node=nil then exit;