Создание правильного xml документа (пакета)
В правом окне DataPacketвызовем командуOpenDataPacketи откроем исходный пакет.
Затем выполним команду SelectAllконтекстного меню.
Далее выполним команду XMLfromDataPacketглавного менюCreate, которая вызовет окно описания структуры пакета, в котором подтверждаем выполнение командной кнопкойCreate. После выполнения данной команды структура пакета отобразится в левом окне утилиты.
Далее удаляем из правого окна исходный документ, выполнив команду Clearконтекстного меню.
При необходимости структуру XMLдокумента можно сохранить выполнив командуSaveменюFile.
Создание XMLпакета изXMLдокумента выполняется в обратной последовательности.
Первым действием выполняем команду SelectALLконтекстного меню.
Далее в окне NodePropertiesопределяет значение атрибутов для каждого узла и поля. Обратите внимание на тот факт, что для узлаLink(в нашем случае) необходимо выбрать значениеNested=true.
После определения значений атрибутов всех полей выполняем команду DataPacketfromXMLменюCreate, которая преобразуетXML документ вXML пакет.
После выполнения команды структура правильного XMLпакета будет представлена в правом окне.
Последним действием является сохранение файла пакета путем выполнения команды SavedataPacketконтекстного меню.
После выполнения указанных действий пакетный файл будет понятен как Интернет экспловеру, так и ClientDataSet.
Домашнее задание 3 Построение b-дерева в компоненте TreeView
Дизайн проекта
Создадим новый проект и сохраните его под именем Unit –> TreeUnit, Project –> B_Tree.
Изменим имя формы на FormTree.
Установим в форму элементы управления и компоненты доступа к данным (рис.1):
ImageList;
TreeView, изменив имя наTVC, свойствоAlign := alLeft, выбрав в свойствахImagesиStateImagesзначениеImageList1;
Splitter, установив свойствоAlign := alLeft;
Panel, установив свойствоAlign := alClient;
DBGrid, установив свойствоAlign := alTop;
MainMenu;
PopupMenu1, который свяжите сTVC(TreeView), выбрав вTVCв свойствеPopupMenuзначениеPopupMenu1;
ClientDataSet, изменив имя наCDSиDataSource1, изменив имя наDS.
Рис. 1 Расположение компонентов в форме |
4. Опишите в редакторе полей CDS(ClientDataSet) следующую структуру полей таблицы:
ID — номер узла, тип поляAutoInc;
ParentID— номер родительского узла, тип поляInteger;
Name — название узла, тип поляString(25).
5. Создадим для CDSдоменную структуру, выполнив команду контекстного менюCreate Data Set.
6. Сохраните бинарный cdsфайл в папке проекта под именемTreeNode.cds.
7. Свяжите CDSфайломTreeNode.cdsпосредством свойстваFileName.
8. Свяжите компоненты DS->CDS, DBGrid1->DS, посредством свойствDataSetиDataSource, соответственно.
9. Выберем в форме ImageList1, выполните двойной щелчок мышью по компоненту и добавьте в него картинки (рис. 2), которые в дальнейшем будут отображать узлы дерева.
10. Сохраним проект и скомпилируйте приложение.
Рис. 2 Картинки узлов дерева |
Разработка методов построения дерева
Создадим собственные методы построения дерева и объявите глобальную переменную доступа к файлу:
ExpandLevel- Раскрытие ветвей дерева (рис. 3);
RebuildTree- Построение дерева (рис. 4).
LocalFile: String; - Путь к локальному файлу TreeNode.cds;
Метод раскрытия ветвей дерева (рис. 5).
Рис. 3 Метод раскрытия ветвей дерева |
Рис. 4 Метод построения дерева |
Рис. 5 Декларирование методов |
В обработчике события формы вызовем метод построения дерева (рис. 6).
Рис. 6 Вызов метода построения дерева при создании формы |
В обработчике события onChangeкомпонентаTVC(TreeView) создадим метод обмена данными при навигации по дереву (рис. 7).
Рис. 7 метод обмена данными при навигации по дереву |
В обработчике события onExpandingкомпонентаTVC(TreeView) создадим метод раскрытия ветви при навигации по дереву (рис. 8).
Рис. 8 Метод раскрытия ветви при навигации по дереву |
В обработчике события onEditedкомпонентаTVC(TreeView) создам метод обмена данными с таблицейCDSпри редактировании названий узлов дерева (рис. 9).
Рис. 9 Метод обмена данными с таблицей CDS при редактировании названий узлов дерева |
Создадим пункт контекстного меню (компонент PopupMenu1)AddRoot– “Добавить корневой элемент” и метод выполнения команды (рис. 10).
Рис. 10 Метод выполнения команды AddRoot – “Добавить корневой элемент” |
Для реализации команды “Добавить дочерний элемент” необходимо создать личный метод FocusLevel– передача фокуса на новый узел (рис. 11), который декларируется в разделеPrivate(рис. 12).
Рис. 11 Метод передачи фокуса на новый узел |
Рис. 12 Декларирование метода |
Создадим пункт контекстного меню (компонент PopupMenu1) AddChild – “Добавить дочерний элемент” и метод выполнения команды (рис. 13).
Рис. 15 Метод выполнения команды AddChild – “Добавить дочерний элемент” |
Создадим пункт контекстного меню (компонент PopupMenu1) DelElement– “Удалить элемент” и метод выполнения команды (рис. 16).
Рис. 16 Метод выполнения команды DelElement – “Удалить элемент” |
Создадим в главном меню пункты File(Файл) иView(Вид). Для пункта меню Файл создадим командуNew(Новый), а для пункта меню Вид разработаум командыCollaps(Свернуть дерево),Expanded (Раскрыть дерево),Collaps(Свернуть дерево) иViewChildNode(Раскрыть дочернюю ветвь).
Для команд Collaps и Expandedнапишите соответствующие методы (рис. 17).
Рис. 17 Методы Collaps и Expan |
Для реализации команды ViewChildNode создадим метод, раскрывающий в Grid'е список дочерних ветвей выбранного узла (рис. 18).
Рис. 18 Методы раскрытия дочерней ветви |
Опишите метод реализации команды создания нового документа Newс выводом диалога предупреждения (рис. 19).
Рис. 19 Метод создания нового документа |
Завершите дизайн приложения, приведя его к виду, показанному на рисунке 20.
Рис. 20 Вид приложения после выполнения команды ” Раскрыть дочернюю ветвь ” |
Создадим новый набор данных (Data Set), выполнив команду Create Data Setконтекстного меню.
Сохраним бинарный cdsфайл в папке проекта под тем же именем (TreeNode.cds).
Добавим в форму компоненты (рис. 21), разместив их на соответствующих владельцах:
Panel2, установив свойствоAlign := alBottom;
DBNavigator1 (владелец Panel2), выбрав в свойствоDataSource := DS, и оставив видимыми только кнопки навигации, редактирования и сохранения;
GroupBox1, установив свойствоAlign := alBottom;
DBImage1 (владелец GroupBox1), установив свойствоAlign := alRight, выбрав в свойствеDataSource := DS, и в свойстве DataField поле Photo.
DBMemo1 (владелец GroupBox1), установив свойствоAlign := alClient, выбрав в свойствеDataSource := DS, и в свойстве DataField поле Info;
OpenPictureDialog1.
Рис. 21 Дополнительно установленные компоненты |
Создадим новый пункт меню Insert(Вставка) и новую командуInsImage(Фотография).
Для команды напишите InsImage метод (рис. 22).
Рис. 22 Метод реализации команды вставка фотографии |
Конечная программа приведена на рисунке 23.
Рис. 23 Результат выполнения |