Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2009, 20:56   #1
sisofcase
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 22
Вопрос Treeview и бд

Добрый вечер.

Долго искал решение своей проблемы: заполнение дерева из бд, нашел ответ в delphiworld
Код:
http://delphiworld.narod.ru/base/fill_ttreeview_db.html
сделал все как там написано:


Код:
procedure FillTree(Tree: TTreeView; Query: TDataSet; idNode, idParent,
  cNodeName: string);
var
  i: integer;
begin
  // Корневой узел, должен быть первым в выборке Query
  form1.Query.First;
  form1.Tree.Items.Clear;
  form1.Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString,
    Pointer(form1.Query.FieldByName(idNode).asInteger));
  form1.Query.Next;
  while not  form1.Query.Eof do
  begin
    i := 0;
    while i < form1.Tree.Items.Count do
      if form1.Tree.Items.Item[i].Data = Pointer(form1.Query.FieldByName(idParent).asInteger)
        then
      begin
        form1.Tree.Items.AddChildObject(Tree.Items.Item[i],
          form1.Query.FieldByName(cNodeName).AsString,
          Pointer(form1.Query.FieldByName(idNode).asInteger));
        break;
      end
      else
        Inc(i);
    form1.Query.Next;
  end;
end;
пример использования:

Код:
FillTree(Tree, Query, 'Name', 'ParentID', 'CompanyID');

структура бд:

CompanyID - AUTO INC
ParentID - INTEGER
Name - CHAR

В базе 3 записи, но в дереве только одна запись:

---1

Подскажите в чем может быть причина?

Хотелось бы видеть такую структуру в дереве:
Пример:

---1
----один
----два
----три
---2
----один
----два
----три
и т.д

Спасибо.

Последний раз редактировалось sisofcase; 23.10.2009 в 21:32.
sisofcase вне форума Ответить с цитированием
Старый 24.10.2009, 00:00   #2
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Скачай с инета dbtreeview и не мучайся, там как раз для этого компонента.
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 24.10.2009, 00:03   #3
sisofcase
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Шульц Посмотреть сообщение
Скачай с инета dbtreeview и не мучайся, там как раз для этого компонента.
я это сделал три дня назад, компонент не работает с базой ABSabsolute
sisofcase вне форума Ответить с цитированием
Старый 24.10.2009, 12:01   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

чота мне кажется что ты перепутал поля в этом объявлении
Код:
FillTree(Tree, Query, 'Name', 'ParentID', 'CompanyID');
красное с салатовым нужно поменять местами

а еще можно накосячить в построении дерева в самих данных, например, один и тот же элемент смотрит сам на себя
soleil@mmc вне форума Ответить с цитированием
Старый 24.10.2009, 14:35   #5
sisofcase
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
чота мне кажется что ты перепутал поля в этом объявлении
Код:
FillTree(Tree, Query, 'Name', 'ParentID', 'CompanyID');
красное с салатовым нужно поменять местами
Я пробывал менять местами, результат тот же, мне еще не понятен этот участок кода:

Код:
 form1.Query.First;
  form1.Tree.Items.Clear;
  form1.Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString,
    Pointer(form1.Query.FieldByName(idNode).asInteger));
  form1.Query.Next;
1) Ставим на первую запись
2) Оно понятно
3) Оно понятно
4) Следующая запись

А какая следующая запись? если цикла нет? зачем она нужна?
если сделать так:


Код:
 while not  form1.Query.Eof do
  begin
form1.Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString,
    Pointer(form1.Query.FieldByName(idNode).asInteger));
  form1.Query.Next;
end;
тогда в дереве все вырисовывает но без вложения..

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
а еще можно накосячить в построении дерева в самих данных, например, один и тот же элемент смотрит сам на себя
а как тогда заполнить таблицу?

Спасибо.
sisofcase вне форума Ответить с цитированием
Старый 24.10.2009, 15:20   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

сначала у тебя отрисовывается корневой элемент, а дальше идет цикл по остальным записям
но здесь важно знать в каком виде у тебя данные в запросе
приведи здесь хотя бы первые 10 строк из твоего запроса form1.Query

З.Ы.: и эттааа... некузяво как-то юзать чужой код и не разобраться что он делает (пусть даже и в режиме отладчика)
soleil@mmc вне форума Ответить с цитированием
Старый 24.10.2009, 15:37   #7
sisofcase
Пользователь
 
Регистрация: 13.07.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
сначала у тебя отрисовывается корневой элемент, а дальше идет цикл по остальным записям
это я понял.


Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
но здесь важно знать в каком виде у тебя данные в запросе
приведи здесь хотя бы первые 10 строк из твоего запроса form1.Query
делал выборку всего: SELECT * FROM NEW

Во-общем я немного разобрался, вот что получилось: (см. вложение)

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
З.Ы.: и эттааа... некузяво как-то юзать чужой код и не разобраться что он делает (пусть даже и в режиме отладчика)
для того я и здесь)
Изображения
Тип файла: jpg 1.jpg (6.5 Кб, 121 просмотров)
Тип файла: jpg 2.jpg (13.3 Кб, 139 просмотров)
sisofcase вне форума Ответить с цитированием
Старый 25.10.2009, 21:29   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

понятно
ты сам себя запутал:
1) перепутал имена колонок в самой таблице - надо поменять местами Name и ParentID
и, по-хорошему, неплохо бы еще и CompanyID переименовать в ID
2) у корневого элемента в уже правильно обозванной колонке ParentID должен стоять NULL
а так у тебя дерево в этом месте циклится само на себя
soleil@mmc вне форума Ответить с цитированием
Старый 03.04.2012, 17:32   #9
Norick
 
Регистрация: 10.01.2008
Сообщений: 6
По умолчанию

Не рабочая процедура какая то.
Norick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView Claster Помощь студентам 0 20.10.2009 15:41
treeview cheef Компоненты Delphi 3 15.04.2009 15:18
TreeView _SERGEYX_ Общие вопросы Delphi 1 01.09.2008 17:29
Treeview forzi Помощь студентам 4 04.05.2008 23:50