Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Дерево и связанные с ним данные.   Найти похожие ветки 

 
LordOfRock ©   (2005-12-10 21:23) [0]

Привет мастера!
У меня к вам такая трабла:

Есть у меня массив безразмерный (точнее это не массив а TList со скинутыми туда переменными типа record. Обзывается он udtCD и выглядит вот так

type
 udtCD = record
    Name : String;
    Note : String;
    ......... //Что то ещё, но это уже не важно


)
Это всё можно отобразить в TListView (уже реализованно). Ещё я разместил рядом TTreeView. Получилось что-то по типу проводника.

Вот я хочу предоставить пользователю возможность добавлять в TTreeView папки (причём что бы получалось дерево любой сложности). И что бы определённые элементы типа udtCD могли принадлежать опеределённой папке. Я понимаю, что надо добавить ещё одно поле в udtCD, в котором бы содержался бы идентификатор папки. Но, я не знаю что нужно взять за идентификатор (у элемента TTreeNode)
1) Index - при изменении структуры он будет меняться. А это значит, что при этом надо у всех udtCD делать пересчёт, что связано с большими трудностями
2) AbsoluteIndex - то же самое, что и с пунктом 1
3) FullPath - он тоже может меняться
4) ItemID - так и не понял по какому принципу он назначается элементу.

Пробовал делать так:
Задаём глобальную переменную (ну, что нить типа CurrentMaxID). И при добавлении папки (по сути, добавления TTreeNode), писать в свойтсво DATA элемента tTreeNode вот эту переменную (CurrentMaxID), и делать её приращение. Но тут вылезает одно но: допустим мы добавляем, добавляем... Допустим у нас CurrentMaxID уже стал равен 10 (к примеру). Потом решили удалить папку с ID=5. Получается, что ID=5 уже освободился, а мы так и увеличиваем CurrentMaxID. Так и за границы типа недолго вылезти.

Вообем общий смысл вышенаписанного такой, что вот создали мы дерево, раскидали по ветвям элементы udtCD, и когда мы папку удаляем (или перемещаем, или в середину дерева новую добавляем) что бы это никоим образом не повлияло на расположение остальных дисков и папок.

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

Да и ещё. Потом всё это надо будет как-то сохранить в файл, но это уже другая песня.

Ну, вобщем надеюсь вы поняли мою писанину :)


 
PAVIA ©   (2005-12-10 22:47) [1]

Возьми за индификатр сам TTreeNode;
FTreeNode:TTreeNode


 
LordOfRock ©   (2005-12-10 23:09) [2]

PAVIA ©   (10.12.05 22:47) [1]

Не выйдет. Потом же мне надо сохранить в файл все переменные типа udtCD.


 
atruhin ©   (2005-12-10 23:37) [3]

Набери в яндексе "Деревья в базах данных" найдешь массу статей по организации структур данных, а отображай их как хочешь. А то ты структуру данных и их ВИЗУАЛЬНОЕ представление свлил в одну кучу, отсюда и проблемы.


 
PAVIA ©   (2005-12-10 23:46) [4]

По-любому, либы перерасчитывать.  Либы CurrentMaxID Только возьми по больше int64.
Можно и обу сразу. Пока работаешь возьми CurrentMaxID. А при сохронении или открытии перерасчитывать.

У тебя все равно отоброжение TList в TTreeNode так и используй в качестве индификатора TList.
А при сохранении.
Mylist.pack;
Mylist.IndexOf(List)


 
LordOfRock ©   (2005-12-10 23:56) [5]

atruhin ©   (10.12.05 23:37) [3]
Набери в яндексе "Деревья в базах данных" найдешь массу статей по организации структур данных, а отображай их как хочешь. А то ты структуру данных и их ВИЗУАЛЬНОЕ представление свлил в одну кучу, отсюда и проблемы.


Там будут кучи статесь с использованием всяких Парадоксов и т.д. и т.п. Не хочу стандартные базы юзать, зхочу хоть жалкое подобие базы, но СВОИМИ РУКАМИ. Насчёт визуального представления: какая разница, где базу вов время работы хранить? TTreeView отлично под это подходит, так зачем же ещё и массивы заводить?

PAVIA ©   (10.12.05 23:46) [4]

Не совсем понял как в качестве идентификатора можно юзать TList. Он же ОДИН! В нём раняться указатели на переменные типа udtCD. Вот насчёт пересчитывания подумаю. А что если как вариант юзать текущую время-дату? Очень уникальный идентификатор получится. И тип данных для делфи стандартный. Можно будет без проблем согнать в типизированный файл.


 
TStas ©   (2005-12-11 00:05) [6]

А не проще не мучиться с Датой-Временем зачем-то, а сделать глобальный счетчик, и мена давать, ИМя1, Имя2 и т. д.
Писал в свое время дерево решиный какое-то. Так там объеты на дереве висели, да еще и размножались и вешали на него новые. С имена именно так и поступил.


 
LordOfRock ©   (2005-12-11 00:06) [7]

TStas ©   (11.12.05 0:05) [6]

Не совсем понял. Поподробней не можешь?


 
Набережных С. ©   (2005-12-11 08:34) [8]


> LordOfRock ©  

Имхо, нужно иметь не один список, а по одному для каждого узла дерева. И хранить его соответственно в ноде. А при выборе узла пользователем выводить привязанный к нему список в ListView, лучше в виртуальном режиме (см. в ListView OwnerData и OnData). Сохранять можно сначала дерево стандартными средствами ( например, WriteComponent ), а потом все списки рекурсией по дереву.

В D7 (в D6 - не в курсе) удобно написать своего потомка TTreeNode с нужной функциональностью и подсовывать его в событии TTreeView.OnCreateNodeClass. В ранних версиях можно написать своего потомка TTreeView, перекрыв у него метод CreateNode. Имхо, это удобней и безопасней, чем использовать нетипизированный указатель на список.


 
LordOfRock ©   (2005-12-11 10:48) [9]

Набережных С. ©   (11.12.05 8:34) [8]

Благодарствую. Будем пробовать.


 
TStas ©   (2005-12-11 14:20) [10]

>LordOfRock
Голобальная переменная есть. При создании новых данных им присваивается имя BaseName+IntToStr(N) //Точно уникальные имена.
Может, просто я Вашу задачу не так понял?



Страницы: 1 вся ветка

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.056 c
4-1131409177
Volf_555
2005-11-08 03:19
2006.01.15
Как в своей программе отловить выключение компьютера?


1-1134030174
kull
2005-12-08 11:22
2006.01.15
TMultiReadExclusiveWriteSynchronizer? Есть ли с ним проблемы?


14-1135173301
Fl@sh
2005-12-21 16:55
2006.01.15
Пролог и выход с цикла


3-1131546332
Mitrofan
2005-11-09 17:25
2006.01.15
Записать объект в поле Blob (Firebird)


1-1133937125
ищущий ответ
2005-12-07 09:32
2006.01.15
Format