![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 какой-нибудь |