Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.09.2012, 14:38
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию Хранение структуры дерева

Нужно организовать промежуточную ступень между accses и деревом,чтобы там хранить структуру бд. Как лучше это сделать??? Может как-то можно записывать структуру в reccord а потом по ней строить дерево????
Ответить с цитированием
  #2  
Старый 22.09.2012, 14:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от thxu2
Нужно организовать промежуточную ступень между accses и деревом,чтобы там хранить структуру бд. Как лучше это сделать??? Может как-то можно записывать структуру в reccord а потом по ней строить дерево????
Под деревом подразумевается TTreeView? Если так, то у узлов есть свойство TTreeNode.Data в котором можно хранить свои данные, например уникальное поле записи (ID) таблицы.
И ещё можешь посмотреть уже готовые реализации DBTreeView здесь.
Ответить с цитированием
  #3  
Старый 22.09.2012, 15:17
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию

Я знаю Как сделать дерево по бд .Нужно сделать чтобы структура была отдельно от дерева и хранилась где-то,заполняясь из бд при запуске проги,а потом по ней строилось дерево .
Ответить с цитированием
  #4  
Старый 22.09.2012, 15:33
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от thxu2
Я знаю Как сделать дерево по бд .Нужно сделать чтобы структура была отдельно от дерева и хранилась где-то,заполняясь из бд при запуске проги,а потом по ней строилось дерево .
Тогда делай на record'ах, что-то типа такого:
Код:
type
  PMyNode = ^TMyNode;
  TMyNode = record
    Parent: PMyNode;
    PrevSibling: PMyNode;
    NextSibling: PMyNode;
    FirstChild: PMyNode;
    LastChild: PMyNode;
    Data: ...
  end;
И при чтении из бд заполняй эту структуру вместо TTreeView.
Или же сделай с помощью классов - обычно с ними удобнее работать чем с record'ами.
Ответить с цитированием
  #5  
Старый 22.09.2012, 15:47
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию

А примерчика у тебя нет никакого??????
Ответить с цитированием
  #6  
Старый 22.09.2012, 16:41
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию

Хотя бы поподробнее как с record ом работать.Вот допустим я в него записал всё что нужно,как потом к этим записям обратиться?????
Ответить с цитированием
  #7  
Старый 22.09.2012, 19:44
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию

Код:
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  
Старый 23.09.2012, 15:36
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от thxu2
Я знаю Как сделать дерево по бд .Нужно сделать чтобы структура была отдельно от дерева и хранилась где-то,заполняясь из бд при запуске проги,а потом по ней строилось дерево .

если речь о бд то я такие структуры строю так таблица с деревом где есть 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  
Старый 23.09.2012, 16:09
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от thxu2
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.



Допустим я так записал в рекорд данные. Они где-то хранятся ???как мне пройтись по ним чтобы построить дерево???????
Данные хранятся в памяти, но пройтись по ним не получится, так как ты потерял все ссылки на них. Ссылки (указатели) на эти данные нужно куда-то сохранять, например в массив, в TList, в TStringList и т.п.

Пример с использованием 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  
Старый 23.09.2012, 18:01
thxu2 thxu2 вне форума
Прохожий
 
Регистрация: 22.09.2012
Сообщения: 6
Репутация: 10
По умолчанию

Спасибо!!!Буду думать .
Ответить с цитированием
  #11  
Старый 24.09.2012, 06:28
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Так-то не очень удобно хранить дерево в таблице а связанные данные ещё где-то
__________________
Код сырец
Ответить с цитированием
  #12  
Старый 24.09.2012, 07:00
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Код:
      NodeDetails^.Id :=       ADOQuery1.FieldByName('Id').AsInteger;
      NodeDetails^.ParentId := ADOQuery1.FieldByName('id_parent').AsInteger;
      NodeDetails^.Name :=     ADOQuery1.FieldByName('Class_name').AsString;

если идея хранить данные отдельно – потому что они разные, то можно для каждого 'Class_name' создать свою таблицу с таким именем и нужными полями.
или можно в той же таблице текстовое поле data, а там хранить json какой-нибудь
__________________
>woweook<
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter