Профессиональное использование компонента TreeView в Delphi

  • При записи в файл писать и размер каждой строковой переменной. В этом слу­чае запись и чтение будут сложнее, но мы сэкономим файловое пространство.
  • Жестко объявить размер строк, как это сделано в нашей структуре. Здесь уже строка будет писаться с определенным размером и чтение/запись упрощается. Так мы сможем писать в файл всю структуру за один заход, как мы это уже делали. Теперь напишем обработчики событий для наших кнопок. Для кнопки Создать

нужно написать содержимое листинга 11.16. В этом обработчике будет создаваться новый элемент и инициализироваться начальные данные.

 

 

procedure TMainForm.NewBtnClick(Sender: TObj ect); var

NodeName: String ; Nodedata:PNodeOptions; NewNode:TTreeNode; begin

if not InputQuery('Новый элемент', 'Введите имя нового элемента1, NodeName) then exit;

 

NewNode: =TreeView. I terns. AddChild (TreeView. Selected, NodeName) ;

// Инициализация начальных данных структуры Nodedata:=new (PNodeOptions); NodeData. Name: =' '; NodeData.Surname:='';

NodeData.Address:=''; NodeData.EMail:=1';

NewNode.data:=NodeData; end;

 

В самом начале приведенного выше кода мы запрашиваем у пользователя имя нового элемента с помощью функции inputQuery. Далее новый элемент добавляет­ся в дерево. В качестве корневого элемента используется выделенный в настоящий момент элемент.

 

Теперь нужно проинициализировать переменную NodeData, которая имеет тип структуры PNodeOptions. Мы создаем ее с. помощью функции New и каждому эле­менту присваиваем значение по умолчанию. В данном случае всем присваивается пустая строка, чтобы в каком-то из элементов случайно не оказался "мусор".

 

В самой последней строке происходит сохранение переменной NodeData в свой­стве Data нового элемента. Вот тут нужно сделать несколько пояснений:

  • Переменная NodeData — это указатель на структуру, поэтому мы сохраняем ад­рес структуры в памяти.
  • Переменная NodeData объявлена локальной и, по идее, она должна уничтожать­ся. Это первая ошибка начинающих программистов. Уничтожаются простые пе­ременные, которые хранятся в стеке, а выделенная память не может освобож­даться автоматически, потому что она выделяется в динамической памяти. Именно поэтому указатель на структуру, который мы сохранили в свойстве Data, будет действителен даже после выхода из процедуры.

 

С созданием элементов разобрались. По нажатии кнопки Сохранить мы будем сохранять введенные в компоненты TEdit данные в структуру данных выделенно­го элемента. Для этого создайте обработчик события onclick и напишите в нем содержимое листинга:

 

procedure TMainForm.SaveBtnClick(Sender: TObj ect); begin

if TreeView.Selected=nil then exit;

PNodeOptions (TreeView. Selected. Data) .Name: =NameEdit. Text ; PNodeOptions (TreeView. Selected.Data) . Surname: =SurnameEdit. Text ; PNodeOptions(TreeView.Selected.Data).Address:=AddressEdit.Text; PNodeOptions(TreeView.Selected.Data).EMail:=EMailEdit.Text; end;

 

Прежде чем сохранять, надо убедиться, что в дереве есть выделенный элемент. Если такого не будет, то при попытке сохранения произойдет ошибка, потому что TreeView.Selected будет нулевым указателем. Свойство имеет ТИП TTreeNode, т. е. это объект, хранящий в себе выделенный элемент. Если ничего не выделено, значит, объекта нет, и мы увидим nil.

Структура для выделенного элемента находится в свойстве Data выделенного эле­мента, т. е. в TreeView.selected.Data. Так как это свойство — простой указатель, не имеющий представления о данных, которые хранятся по его адресу, мы должны ука­зать ТИП самостоятельно. Для ЭТОГО используем PnodeOptions (TreeView. Selected.Data). Остальное вам должно быть понятно из кода.

По нажатии кнопки Удалить нужно написать всего две строки кода:

 

if TreeView.Selected=nil then exit;

TreeView.Selected.Delete;

 

В первой строке проверяется, равен ли нулю выделенный элемент. Если да, то нужно выйти из процедуры, потому что ничего не выделено. Если нет, то можно удалять. Для этого используется метод Delete. Если не сделать проверку, то в TreeView. selected будет отсутствовать объект и при обращении к методу Delete произойдет ошибка.

Теперь программа умеет создавать элемент, сохранять в структуре данные и удалять элементы. Осталось только научить ее отображать введенные ранее дан­ные. Для этого давайте создадим обработчик события onchanging для компонента TreeView. Он будет вызываться каждый раз, когда пользователь выбирает новый элемент в дереве. В этот момент мы должны вывести в компоненты TEdit инфор­мацию из структуры нового выделенного элемента. В обработчике onchanging нужно написать содержимое листинга:

 

procedure TMainForm.TreeViewChanging(Sender: TObject; Node: TTreeNode;

var AllowChange: Boolean); begin

if Node=nil then exit;

NameEdit.Text:=PNodeOptions(Node.Data).Name;

SurnameEdit.Text:=PNodeOptions(Node.Data).Surname;

AddressEdit.Text:=PNodeOptions(Node.Data).Address;

EMailEdit.Text:=PNodeOptions(Node.Data).EMail; end;

 

Попробуйте запустить программу и создать несколько элементов. Измените у нескольких из них значения и попытайтесь понять, как работает сохранение и отображение данных из структуры.

Теперь у вас есть хорошая заготовка для работы со сложными данными с помощью TreeView. Вы можете сохранять нужные данные в файле и потом загружать их. На дан­ном этапе не станем описывать сохранение и загрузку, потому что это не совсем про­сто. Дело усложняется тем, что данные хранятся в виде дерева и нужно сохранять не только структуры, но и позицию в дереве, чтобы потом ее можно было восстановить.

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: