Форум: "Основная";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизДерево и связанные с ним данные. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c