Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.019 c
6-1127909392
irq
2005-09-28 16:09
2006.01.15
FTP + Indy 10


14-1135264894
Lexer
2005-12-22 18:21
2006.01.15
Нужен сценарий или песня к Новому году


3-1132123711
Карелин Артем
2005-11-16 09:48
2006.01.15
Получение всех FK в базе MS SQL 2000.


14-1134734721
Германн
2005-12-16 15:05
2006.01.15
Первый в мире компетентный программист


10-1111064667
kblc
2005-03-17 16:04
2006.01.15
Word.Application





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский