Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TreeView и база данных


ChainikDenis ©   (2012-04-17 11:26:00) 

Затупил по полной, прошу помощи.

Есть база данных. В ней таблица номенклатуры. Одно из полей показывает в какую группу входит номенклатура.
Есть таблица групп. Из трех полей - идентификатор, наименование и идентификатор родительской группы. Т.е. группа может быть подгруппой. Если идентификатор родительской группы равен 0, то значит это группа верхнего уровня.

Делаю запрос к базе, получаю таблицу групп. И пытаюсь построить дерево. В качестве примера пытаюсь использовать http://decoding.narod.ru/practic/treeview/treeview.html

Верхние группы разместил без проблем, но вот дочерние никак не придумаю. Ведь искать дочернюю группу, что бы добавить ее к родительской, нужно по полю в котором индекс родительской, а в TreeView эта информация не хранится. Там только наименование группы. Но группы могут иметь одинаковое название, что конечно абсурд. Где бы мне в TreeView сохранить не только название группы, но и ее ID в базе, что бы легко было по базе шарится используя этот ID.

Эта же проблема потом вылезет при разворачивания списка номенклатуры, которая в эту группу вылезет.

Думаю что велосипед изобретаю, но все-таки помогите плиз.


Ega23   (2012-04-18 11:06:00) [1]


> не желаешь?


Статейку написать?
Так писали же, с Alkid-ом. Уже с Зотовым о рецензировании договорились. А потом - забили болт, показалось мышиной вознёй какой-то. Интерес пропал.


> да, пора Королеве переписать статейку :)


Да, от неё не ожидал.


AV   (2012-04-18 10:59:00) [2]

да, пора Королеве переписать статейку :)


> Ega23 ©   (17.04.12 22:19) [8]

не желаешь?
Включив VirtualTreeView, например, с

> [+] должен быть отрисован только в тех узлах, которые мы
> действительно можем раскрыть. Если у нас лист дерева, то
> никакого плюса быть не должно.


Ega23   (2012-04-17 22:19:00) [3]


> Влад   (17.04.12 19:26) [7]
>
> http://www.delphisources.ru/pages/faq/base/dbtreeview.html


Гораздо правильнее строить отдельные ветки дерева динамически, только в тот момент, когда они наверняка понадобятся.

Это очень, очень и очень спорное утверждение.

For i:=1 To qTreeCompanies.RecordCount Do

За такое надо отстреливать голову, труп сжечь, прах закопать на линии прибоя, чтобы ни Земле, ни Морю не досталось.

// Добавим фиктивную (пустую) дочернюю ветвь только для того,
// чтобы был отрисован [+] на ветке и ее можно было бы раскрыть


Вот только есть проблема: [+] должен быть отрисован только в тех узлах, которые мы действительно можем раскрыть. Если у нас лист дерева, то никакого плюса быть не должно.

if Node.getFirstChild.Data = nil then

А вот фиг. Integer(nil) = 0. А где гарантия, что я не поставлю для корневого узла ID =0, ParentID = null? Кстати, ЕМНИП, далеко не все СУБД позволят вторичный ключ на ParentID наложить, если в корневом узле не null (что, в общем-то правильно).

qTreeAnalytic.Sql.Clear;
    qTreeAnalytic.Sql.Add(Sql);


Бр-р-р-р-р...


Влад   (2012-04-17 19:26:00) [4]

http://www.delphisources.ru/pages/faq/base/dbtreeview.html


Ega23   (2012-04-17 17:04:00) [5]


> Спасибо. Разобрался. Правда повозится с указателями пришлось малость ...


Node.Data := Pointer(ID);
ID := Integer(Node.Data);


sniknik   (2012-04-17 17:00:00) [6]

> Правда повозится с указателями пришлось малость ...
зачем? у тебя же id интеджер, или нет?


ChainikDenis   (2012-04-17 15:51:00) [7]

Спасибо. Разобрался. Правда повозится с указателями пришлось малость ...


Ega23   (2012-04-17 12:55:00) [8]

1. Можно взять готовый компонент, они есть (в DevExpress вроде что-то было).
2. Можно написать самому.
 2.1. Можно написать полноценный TDBTreeView, но нужно будет детально разбираться с TDataSet, TDataSource и TDataLink. Универсализма не достичь, ибо для построения дерева нужен DataSet который фетчит записи до конца.
 2.2. Для решения конкретной задачи можно задействовать стнадартный TTreeView с его TTreeNode.Data. Но лично я бы предпочёл взять TVirtualStringTree от SoftJems.


sniknik   (2012-04-17 11:35:00) [9]

> а в TreeView эта информация не хранится.
кто мешает ее там хранить? у нодов есть data под данные, любые в принципе.


stas   (2012-04-17 11:34:00) [10]

NODE.DATA - сюда можно писать что угодно...


Наверх

Титульная страница Поиск, карта сайта Написать письмо