Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Визуальное программирование Delphi.doc
Скачиваний:
69
Добавлен:
05.06.2015
Размер:
603.65 Кб
Скачать

2. Компонент TreeView(страницаWin32)

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

Основное свойство компонента Itemsэлементы дерева. Каждый из них является объектом типа TTreeNodes и обладает своими свойствами и методами.

Ряд свойств компонента TreeView:

  • ShowButtons определяет показывать или нет кнопку «+»

  • ShowLines показывает линии дерева

  • ShowRoot отвечают за изображение линий связи с корневым элементом.

  • SortType позволяет автоматически сортировать ветви и узлы дерева.

    • stText - узлы автоматически сортируются по алфавиту

    • stData - сортиров­ка по связанным с узлами объектам Data

    • stBoth - сортиров­ка одновременно по тексту и объектам Data

  • Count — число узлов, управляемых данным, т.е. дочерних уз­лов, их дочерних узлов и т.п. Если значение Count узла равно нулю, то он является листом дерева.

  • Indent показывает число раскрываемых потомков.

Создавать узлы дерева можно как программно, так и с помощью редактора узлов дерева. Он вызывается двойным щелчком на компоненте TreeView или на­жатием кнопки с многоточием около свойства Items в окне Инспектора Объектов. Здесь кнопка New Item позволяет добавить в дерево новый узел, New Subltem позволяет добавить в дерево дочерний узел. Если нажать на Delete, можно удалить выделенный узел дерева. Кнопка Load позволяет загрузить струк­туру дерева из файла — обычный текстовый файл. Уровни узлов обозначаются отступами. Например, файл дерева, представленного на рисунке справа имел бы вид:

Компоненты

Standard

MainMenu

Label

Edit Рис 1. Вид дерева объектов

Additional

BitBtn

SpeedBtn MaskEdit

В панели Item Properties редактора узлов можно задать такие свойства, как Text — надпись, появляющаяся в дереве около данного узла, а так же Image Index и Selected Index определяют индекс пиктограммы, отображаемой для узла, который соответ­ственно не выделен и выделен пользователем в данный момент. Индексы начинаются с 0 и соответствуют списку изображений, хранящихся в отдельном компоненте ImageList. Указание на этот компо­нент можно задать в свойстве Images компонента TreeView. Значение по умолчанию равно -1 (пиктограммы изображаться не будут).

Доступ к информации об отдельных узлах осуществляется через свойст­во Item [int Index]. Например, чтобы обратиться к узлу дерева с индексом 0 и определить число дочерних узлов (на рис.1 это узел «Компоненты», число управляемых им узлов – 4), необходимо написать

TreeViewl.Items.Item[0].Count

Свойство Selected указывает узел, который выделен пользователем и доступно только во время выполнения программы. Если ни один узел не выбран, значение Selected равно NULL. При выделении пользователем нового узла происходит событие OnChange, в обработчик которого передает­ся параметр Node : TTreeNode — выделенный узел. В этом обработчике можно предусмотреть действия, которые должны производится при выделении узла. Например:

procedure TForm1.TreeView1Change (Sender : TObject , Node : TTreeNode)

begin

Edit1.Text := Node.Tеxt; //Выводим в Edit1 надпись выделенного узла

end;

С каждым узлом может быть связан некоторый объект и данные о нем. Ссылка на этот объект содержится в свойстве узла Data.

Основные методы:

  • AddChild – добавление дочернего узла

  • Add – добавление узла

  • Insert – вставка узла

  • Clear – очищение дерева

  • SaveToFile – сохранение структуры дерева в файл

Например, чтобы добавить узел «Компоненты», необходимо написать

TreeView1.Items.Add (NULL," Компоненты ");

  • Пример 2. Пусть требуется создать дерево, узлами которого является номера групп, а при выборе соответствующего узла отображать сведения о студентах группы. Пусть пиктограммы, для отображения узла хранятся в компонентах ImageList1 и ImageList2 из примера 1. В основном модуле перед классом формы объявим класс Student и определим экземпляры этого класса:

Type

TStudеnt = Class

public:

Fam : String;

Name : String;

NomZach : integer; // номер зачетной книжки

Chit : integer; //номер читательского билета

construсtor Create (F : String; N : String; NZ : integer; C : integer)

end;

В секции implementation реализуем конструктор:

cоnstructor TStudent.Creаte (F: String; N : String; NZ : integеr; C : integer)

begin

Fam:=F; Name:=N; NomZach:=NZ; Chit:=S;

end;

Опишем переменные класса студент:

Var

Stud1, Stud2, Stud3, Stud4, Stud5 : TStudent;

Инициализируем объекты:

stud1:= TStudent.Create('Митрохина','Ольга’,1496,7015);

stud2:= TStudent.Create(‘Федоров','Алексей',1355,7047);

stud3:= TStudent.Create('Суровикова',’Вера’,3792,6034);

stud4:= TStudent.Create(‘Иванова’,’Ольга’,4550,7532);

stud5:= TStudent.Create(‘Пронин’,’Андрей’,4567,7542);

Добавим на форму компонент TreeView. Пусть дерево отображается при нажатии кнопки Button1 с надписью «Загрузить». Тогда в обработчике события Click необходимо программно заполнить узлы дерева значениями (это также можно сделать, внося изменения в свойство Items… компонента TreeView).

procedure TForm1.Button3Click(Sender : TObject)

var

Nd : TTreeNode; //указатель на объект типа TTreeNodes

begin

TreeView1.Items.Clear;

Nd := TreeView1.Items.Add(NULL,"Группа ПИМ-Д21");

FillViewList (Nd,stud1); //заполнение дочерних узлов

FillViewList (Nd,stud2);

FillViewList (Nd,stud3);

Nd := TreeView1.Items.Add(NULL," ГруппаПИЮ-Д21");

FillViewList (Nd,stud4); //заполнение дочерних узлов

FillViewList (Nd,stud5);

end;

Здесь для каждого дочернего узла вызывается функция FillViewList ( ), которую необходимо заранее определить в секции interface модуля как

private: procedure FillViewList(Nd : TTreeNode, stud : TStudent);

и реализовать в секции implementation:

procedure FillViеwList(Nd : TTreeNode, stud : TStudent);

var

NdChild : TTreeNode;

begin

NdChild :=TreеView1.Items.AddChild (Nd, stud.Fam);

NdChild.Data:=stud; //заполнение узла данными

NdChild.ImageIndex:=1;

NdChild.SelectedIndex:=1;

end;

Теперь прочитать данные, связанные с узлом, например, имя можно так:

Edit1.Text:= TStudent(Nd.Data).Name; //Nd-выделенный узел