Изучение компонента Delphy — TTreeView
МИНИСТЕРСТВО
ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ОДЕССКАЯ
ГОСУДАРСТВЕННАЯ АКАДЕМИЯ ХОЛОДА
Лабораторная
работа
по
РСАПР
Изучение
компонента Delphy - TTreeView
Одесса,
2011
Задание
Цель: Получение навыков работы с TTreeView.
Задача
.Создать GUI-приложение.
Дерево имеет вид:
Город1
Ул.1
Дом1
Дом2
Ул.2
Ул.3
Город2
Обеспечить заполнение дерева, очистку, анализ,
редакция элементов.
Заполнение:
городов не менее 5, улиц не менее 10 в каждом
городе, домов не менее 3.
Анализ:
. Подсчитать общее количество домов
. Обходя дерево вывести в файл информацию вида:
ГОРОД -Х \ УЛИЦА -Х \ ДОМ -Х
Редакция:
Удаление элементов из PopUp меню с
подтверждением.
Удалять ГОРОДА и УЛИЦЫ можно, если в них нет
вложенных элементов.
Прочее:
Раскрытие и закрытие всех элементов из PopUp
меню.
2. Краткое описание реализации каждого из
пунктов задания и
листинги программ с комментариями и пояснениями
принятых
решений
Данная программа выполняет следующие пункты
задания: заполнение дерева, при этом дерево содержит не менее пяти городов,
десяти улиц, в каждой из которых не менее трех домов, анализ, т.е. подсчет
количества домов и вывод информации при обходе дерева. В программе также
реализовано удаление элементов дерева из PopUp меню с подтверждением, при чем
узел не должен содержать вложенные компоненты. Так же предусмотрена возможность
раскрытия и закрытия всех элементов из PopUp меню.
Для автоматического заполнения дерева
используется следующая процедура procedure TForm1.BitBtn2Click(Sender:TObject),
описанная ниже:
procedure
TForm1.BitBtn2Click(Sender: TObject);
begin
TreeView1.Items.Clear; //очистка
дерева
TreeView1.Items.Add
(nil,'Одесса'); //создание первого родительского узла
TreeView1.Items.AddChild (TreeView1.Items.Item
[0],'Тенистая'); //дочерний узел
TreeView1.Items.AddChild
(TreeView1.Items.Item [1],'дом1');
TreeView1.Items.AddChild
(TreeView1.Items.Item [1],'дом56');
TreeView1.Items.AddChild
(TreeView1.Items.Item [1],'дом4');
TreeView1.Items.AddChild
(TreeView1.Items.Item [0],'Солнечная');
TreeView1.Items.AddChild
(TreeView1.Items.Item [5],'дом9');
TreeView1.Items.AddChild
(TreeView1.Items.Item [5],'дом46');
TreeView1.Items.AddChild
(TreeView1.Items.Item [5],'дом67');
TreeView1.Items.Add
(TreeView1.Items.Item [0],'Киев');
TreeView1.Items.AddChild
(TreeView1.Items.Item [41],'Тенистая');
TreeView1.Items.AddChild
(TreeView1.Items.Item [42],'дом1');
TreeView1.Items.AddChild
(TreeView1.Items.Item [42],'дом56');
TreeView1.Items.AddChild
(TreeView1.Items.Item [42],'дом4');
TreeView1.Items.AddChild
(TreeView1.Items.Item [41],'Солнечная');
TreeView1.Items.AddChild
(TreeView1.Items.Item [46],'дом9');
TreeView1.Items.AddChild
(TreeView1.Items.Item [46],'дом46');
TreeView1.Items.AddChild
(TreeView1.Items.Item [46],'дом67');
TreeView1.Items.AddChild
(TreeView1.Items.Item [41],'Зеленая');
TreeView1.Items.AddChild
(TreeView1.Items.Item [50],'дом94');
TreeView1.Items.AddChild
(TreeView1.Items.Item [50],'дом1');
TreeView1.Items.AddChild
(TreeView1.Items.Item [50],'дом32');
TreeView1.RightClickSelect:=true;;
Анализ дерева реализован в следующих ниже
перечисленных процедурах, которые позволяют подсчитать общее количество домов,
а также вывести информацию при обходе дерева.
procedure
TForm1.Button1Click(Sender: TObject);k,n,g:integer;
Memo1.Lines.Clear; //очистить
мемо
g:=0;
Anode:=TreeView1.Items.GetFirstNode; //выбор
первого
узла
k:=0;
while Anode<>nil do
begin
If (Anode.Level=0) then
for n:=0 to Anode.Count-1
do
k:=k+Anode.Item[n].Count;
//подсчет
домов
end;
Anode:=Anode.getNextSibling; //следующий
узел
g:=g+k;
k:=0;
end;
Memo1.Lines.Add('Общее
количество
домов'+IntToStr(g));
//вывод
в
мемо
end;;
Процедура, позволяющая вывести информацию при
обходе дерева:
procedure
TForm1.BitBtn3Click(Sender: TObject);j:integer;
begin
Memo1.Lines.Clear;
if Treeview1.Items.GetFirstNode =
nil then abort; //дерево пустое
- прервать
процесс
Anode:=Treeview1.Items.GetFirstNode;
//выбор
родительского
узла
Anode1:=Anode.getFirstChild;
//выбор
дочернего
узла
while Anode <> nil do
begin
while Anode1 <> nil do
begin
if (Anode1.Level=1) then
begin
for j:=0 to Anode1.Count-1
do .Lines.Add (Anode1.Parent.Text+'/'+Anode1.text+'/'+Anode1.Item[j].Text);
end;
Anode1:=Anode1.GetNext;
end;
Anode: =Anode.GetNext;
end;
Memo1.Lines.SaveToFile('Отчет.txt');
//сохранение
в
файл
end;
Ниже описаны процедуры, благодаря которым
возможно удаление элементов дерева из PopUp меню с подтверждением об удалении,
раскрытие и сворачивание элементов дерева.
Процедура удаления
элемента:
TForm1.N1Click(Sender: TObject);
begin
if (Application.MessageBox('Вы действительно
хотите удалить запись?',
'Подтвердите удаление записи',
MB_YESNO+MB_ICONQUESTION)<>IDNO)
then
if
TreeView1.Selected.getFirstChild=nil
then TreeView1.Selected.delete
else showmessage('Удаление
невозможно,
узел
содержит
элементы!');
end;
В данной процедуре описан метод, реализующий
развертывание дерева:
procedure TForm1.N3Click(Sender:
TObject);
TreeView1.FullExpand;;
В процедуре
procedure TForm1.N4Click(Sender:TObject); реализуется
свертывание
элементов
дерева:
TForm1.N4Click(Sender: TObject);
begin.FullCollapse;;
Для очистки дерева используется следующая
процедура:
procedure
TForm1.BitBtn6Click(Sender: TObject);.Items.Clear;;
2. Демонстрация работы, исходные данные и
результаты
Для того, чтобы запустить приложение исходной
программы необходимо запустить файл TreeView с расширением exe. После запуска
данного файла перед пользователем появится главная форма программы.На ней
представлено «Дерево» в «свернутом» виде, со всеми записями. ( см Рис1)
Рисунок 1. Главная форма
На форме расположены пять кнопок: «Создать
дерево», «Удалить», «Отобразить элементы дерева» и «Рассчитать количество
домов».
При нажатии на кнопку «Создать дерево»
программным путем создается дерево. Ниже расположенная кнопка «Удалить»
позволяет полностью удалить дерево.
При нажатии на кнопку «Отобразить элементы
дерева» выводится информация о городе, улицах и домах, при этом информация
дополнительно сохраняется в текстовом файле «Отчет». (см. Рис 2.)
Рисунок 2 Отображение элементов дерева
Нажав на кнопку «Рассчитать количество домов»
пользователь рассчитает общее количество домов. (Рис3)
Рисунок 3 Расчет общего количества домов во всем
дереве
Свернуть и развернуть дерево, а также удалить
элементы дерева можно через PopUp меню, вызвав его правым кликом мышки на
дереве (см Рис. 4).
Рисунок 4 Вызов PopUp меню.
Кнопка «Развернуть» и «Свернуть» позволяет
соответственно развернуть или свернуть дерево. Выделив какой-либо узел дерева,
и нажав кнопку «Удалить», пользователь увидит сообщение: «Вы действительно
хотите удалить запись?» с вариантами ответов: «Да» и «Нет». При подтверждении
пользователем удаления записи, данная запись будет удалена из дерева. (Рис4)
Рис. 4
При нажатии на кнопку «Закрыть», пользователь
выходит из приложения.
данные программа дерево
В ходе данной лабораторной работы я ознакомилась
и научилась работать с Компонентом TTreeView, который служит для отображения
иерархических данных в виде дерева, в котором пользователь может выбрать нужный
ему узел или узлы. Он представляет собой окно для отображения иерархических
данных в виде дерева, в котором пользователь может выбрать нужный ему узел или
узлы. Иерархическая информация может быть самой разной: структура некоторого
предприятия, структура документации учреждения, структура отчета и т.п. С
каждым узлом дерева могут быть связаны некоторые данные.
Основным свойством TTreeView, содержащим
информацию об узлах дерева, является индексированный список узлов Items. Каждый
узел является объектом типа TTreeNodes, обладающим своими свойствами и
методами.
Так же я узнала, что множество методов объектов
типа TTreeNodes позволяет перестраивать дерево во время выполнения приложения.
А свойство узла - StateIndex позволяет добавить вторую пиктограмму в данный
узел, не зависящую от состояния узла. Подобная пиктограмма может просто служить
дополнительной характеристикой узла. Индекс, указываемый как StateIndex,
соответствует списку изображений, хранящихся в отдельном компоненте TImageList,
указанном в свойстве StateImages компонента TTreeView.