Меню Новости Программы Статьи Форум Контакты

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Статьи
 

СтатьиПрограммированиеDelphi

 

Компонент TTreeview и динамические структуры

Автор: Blacksus

В данной статье будет рассмотрено хранение данных при помощи динамической структуры и ее наглядное представление при помощи компонента TTreeview. Эта статья может помочь тем, кто собирается использовать в своей программе различные списки, будь то список файлов или что-либо иное.

Во-первых, что такое динамическая структура? Можно сказать, что это набор данных, который формируется по ходу выполнения программы, т.е. в отличие от статических данных, этот набор ограничен только количеством памяти на компьютере, и его размер не нужно задавать заранее. Мы будем рассматривать линейную динамическую структуру, т.к. она наиболее проста в работе и отлично подходит для вывода данных с помощью TTreeview. Эта структура напоминает одномерный массив, но она намного удобнее в работе. И перемещение данных, в ней, не занимает такое количество времени, как в массиве, особенно если данных очень много. При использовании обычного массива, статического или динамического, после удаления любого элемента, не находящегося в конце массива, нужно будет перемещать элементы находящиеся ниже этого элемента, чтобы в нем не было дырок от удаленных элементов. То же самое придется делать и при вставке элемента. При использовании динамической структуры, удаление или вставка элемента в любое место массива занимает столько же процессорного времени, сколько заняла бы эта операция для последнего элемента. Т.е. ничего перемещать не надо.

Для примера возьмем структуру, содержащую записи. Тип этой структуры описывается следующим образом:

Принцип структуры можно наглядно увидеть на рисунке 1.

Рисунок 1 - динамическая структура

Ссылка "Link" всегда указывает на первый элемент структуры. Сама структура состоит из 2-х ячеек. Первая - это ссылка, которая содержит в себе адрес следующего элемента (в нашем примере $0000, $0001, $5945), вторая содержит в себе произвольные данные, в нашем случае это запись (record), которая содержит в себе еще 6 ячеек.

Для примера рассмотрим несколько процедур, которые наглядно покажут взаимодействие динамической структуры и TTreeview.

На рисунке 2 вы можете увидеть внешний вид примера.

Рисунок 2 - внешний вид примера

Глобальные переменные

Для начала, при запуске программы, нужно инициализировать структуру. Эта процедура представлена ниже:

Ниже представлены две функции, которые осуществляют поиск по структуре и определение уровня элемента. Они используются в процедуре добавления элемента.

Ниже вы можете увидеть код процедуры добавления новой записи в структуру:

В этой процедуре edit1-edit5 некоторые поля, в роли этих полей может выступать любое строковое значение. Сheckbox1 - показывает, отмечен ли пункт "Подпункт", это нужно для того, чтобы создавать вложенные записи. Процедура search нужна для поиска текущей записи в структуре, она описана выше. Процедура level узнает, на каком уровне находится элемент, она описана выше. Это нужно для того, что правильно выстроить структуру на экране при чтении из файла.
В самом начале процедура проверяет, есть ли хоть одна запись в структуре, если нет, то производится запись и выход из процедуры.
Если были произведены уже какие-либо записи, то программа проверяет, отмечен ли пункт "Подпункт", если он отмечен, то запись производится как подпункт, т.е. на следующем уровне. Если этот пункт не отмечен, то запись будет добавлена на этом же уровне.
Далее процедура проверяет, есть следующая за ней запись на этом уровне.

Все эти проверки обусловлены тем, что в различных условиях процедура должна по-разному добавлять данные в TTreeview.

Возможно, у Вас возникнет вопрос, как же можно использовать линейную структуру для работы с многоуровневым списком. Дело в том, что компонент TTreeview позволяет использовать сквозную нумерацию элементов. Т.е., если посмотреть на рисунок 2, то на 0 уровне находится 3 объекта, на 1 уровне 3 объекта, и на 2 уровне 2 объекта. Последний элемент находится на 0 уровне и в пределах уровня имеет номер 3, но если использовать сквозную нумерацию, то он будет иметь номер 8. Поэтому в структуре нам не нужно отображать уровни, достаточно линейности.

Следующая процедура служит для удаления выбранного элемента:

Данная процедура находит выделенный объект в структуре и удаляет его. Но простого удаления мало, этой операцией вы как бы удаляете одно звено из цепи, но для нормальной работы нужно скрепить 2 звена, которые держались за удаляемый элемент. Именно этим и занимается данная процедура. Сначала она находит элементы, которые располагаются по краям удаляемого, затем скрепляет их и удаляет выделенный, чтобы цепочка не прерывалась. Наглядное представление работы процедуры можно увидеть на рисунке 3.

Рисунок 3 - удаление элемента из структуры

Следующие 3 процедуры осуществляют перемещение элементов в списке, в пределах своего уровня:

Вышеописанная процедура копирует выделенный элемент и все его вложения на новое место, выше или ниже выделенного.

Вышеописанная процедура перемещает элемент вверх, путем копирования его на новое место и перестановки звений в структуре.

Вышеописанная процедура перемещает элемент вниз и переставляет звенья в структуре. Эта процедура не содержит комментариев, т.к. она делает то же самое, что и предыдущая процедура, но перемещает элемент вниз.

Как видите, тут приведены основные процедуры для работы с многоуровневыми списками на основе динамической структуры. С помощью данного примера можно обрабатывать списки, содержащие огромное количество информации, за минимальное время. Обратите внимание, что перемещение элемента с неограниченно большим количеством вложений, в структуре, все равно займет столько же операций, сколько и добавление элемента в конец структуры, т.е. простое изменение ссылок. В случае с массивом пришлось бы перемещать каждый элемент в отдельности.

Исходный код примера можно скачать тут, а программу тут.

 

Сайт создан в системе uCoz