|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Хранение структуры дерева
Нужно организовать промежуточную ступень между accses и деревом,чтобы там хранить структуру бд. Как лучше это сделать??? Может как-то можно записывать структуру в reccord а потом по ней строить дерево????
|
#2
|
||||
|
||||
Цитата:
И ещё можешь посмотреть уже готовые реализации DBTreeView здесь. |
#3
|
|||
|
|||
Я знаю Как сделать дерево по бд .Нужно сделать чтобы структура была отдельно от дерева и хранилась где-то,заполняясь из бд при запуске проги,а потом по ней строилось дерево .
|
#4
|
||||
|
||||
Цитата:
Код:
type PMyNode = ^TMyNode; TMyNode = record Parent: PMyNode; PrevSibling: PMyNode; NextSibling: PMyNode; FirstChild: PMyNode; LastChild: PMyNode; Data: ... end; Или же сделай с помощью классов - обычно с ними удобнее работать чем с record'ами. |
#5
|
|||
|
|||
А примерчика у тебя нет никакого??????
|
#6
|
|||
|
|||
Хотя бы поподробнее как с record ом работать.Вот допустим я в него записал всё что нужно,как потом к этим записям обратиться?????
|
#7
|
|||
|
|||
Код:
procedure TForm1.FormActivate(Sender: TObject); var NodeDetails: PNodeDetails; TreeViewIndex: LongInt; begin adoquery1.Open; while not adoquery1.Eof do begin New(NodeDetails); NodeDetails^.Id:= adoquery1.FieldByName('Id').AsInteger; NodeDetails^.ParentId:= adoquery1.FieldByName('id_parent').AsInteger; NodeDetails^.Name:= adoquery1.FieldByName('Class_name').AsString; adoquery1.Next; end; adoquery1.Close; end; end. Допустим я так записал в рекорд данные. Они где-то хранятся ???как мне пройтись по ним чтобы построить дерево??????? Последний раз редактировалось Admin, 23.09.2012 в 18:15. |
#8
|
||||
|
||||
Цитата:
если речь о бд то я такие структуры строю так таблица с деревом где есть ID,ParentID,NodeID где NodeID это ID из другой таблицы со всеми необходимыми данными узла, тогда с помощью простого запроса типа select Tree.*, Nodes.* from Tree Left Join Nodes on Nodes.ID=Tree.NodeID получаю все необходимые данные отображение идёт через Query-->TDataSetDriverEh(EhLib)-->TMemTableEh(EhLib)-->TDataSource-->TDBGridEh(EhLib) Эта связка дерево строит автоматом Код сырец |
#9
|
||||
|
||||
Цитата:
Пример с использованием TList: Код:
var NodeDetails: PNodeDetails; TreeViewIndex: LongInt; List: TList; i: Integer; begin List := TList.Create; try ADOQuery1.Open; ADOQuery1.First; while not ADOQuery1.Eof do begin New(NodeDetails); List.Add(NodeDetails); // Добавляем в список новую запись NodeDetails^.Id := ADOQuery1.FieldByName('Id').AsInteger; NodeDetails^.ParentId := ADOQuery1.FieldByName('id_parent').AsInteger; NodeDetails^.Name := ADOQuery1.FieldByName('Class_name').AsString; ADOQuery1.Next; end; ADOQuery1.Close; // Теперь можно пройтись по всем сохранённым записям и что-то с ними сделать for i := 0 to List.Count - 1 do begin NodeDetails := List[i]; // Что-то делаем с очередной записью end; finally // В конце главное не забыть освободить память занятую под данные: for i := 0 to List.Count - 1 do Dispose(PNodeDetails(List[i])); List.Free; // И освободить сам список end; end; |
#10
|
|||
|
|||
Спасибо!!!Буду думать .
|
#11
|
||||
|
||||
Так-то не очень удобно хранить дерево в таблице а связанные данные ещё где-то
Код сырец |
#12
|
|||
|
|||
Цитата:
если идея хранить данные отдельно – потому что они разные, то можно для каждого 'Class_name' создать свою таблицу с таким именем и нужными полями. или можно в той же таблице текстовое поле data, а там хранить json какой-нибудь >woweook< |