![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Господа, как можно "привязать" к TTreeNode номер записи
mmms © (2005-07-11 08:52:00)Т.е. предположим есть ветка в TTreeView "Продукты", от нее дочерние ноды "Колбаса", "Хлеб" и т.п. Нужно, чтобы юзер кликнул на "Хлеб", узнать, какой ID записи у "Хлеб", TTreeView заполняю записями из БД. Можно ли TTreeNode заполнить кроме Значениямиещё и скрытые параметры у каждого значения, например как Tagу многих компанетов, и потом, при клике на строку, определять этот параметр, а там всего цифровой код товара (по нему далее вся работа и идет).
Или, как вариант, по LIKE определять ID выбранной строки, но это лишняя нагрузка на БД, т.к. даже скольжение по TTreeView создаст множество запросов к серверу... хотя конечно, ID методом LIKE, по названию, можно не постоянно определять при скольжении, а например при двойном клике не этом товаре.
Т.е. вопрос, можно ли как то рядом с позицией в TTreeView "вбивать" ее код.
evvcom (2005-07-11 11:36:00) [61]
> а вот rowid и есть ID товара
Тогда idparent должен ссылаться на этот rowid. А вообще смысл rowid несколько иной, поэтому, чтобы избежать кривотолков в будущем, советую все же row из этого названия убрать.
msguns (2005-07-11 11:33:00) [62]>msguns © (11.07.05 11:31) [17]
>Т.е. юзер кликает на узле тривью и в гриде отображается содержимое его листьев, а также листьев подчиненных узлов.
Отображаются только листьятекущего узла. Извиняюсь за путаницу - проект старый, уже подзабыл ;)
msguns (2005-07-11 11:31:00) [63]>mmms (11.07.05 11:18) [16]
БД там интербэйз и "ветки" вытаскиваются хранимкой. Уже отсортированной по узлам.
Основа же в том, что записи БД помещаются в объекты, указатели на которых и "засовываются" в тривью. Весь справочник не считывается (для этого есть режим линейного просмотра), т.к. одномоментно надо показывать лишь одну (текущую в тривью) группу/подгруппу. Т.е. юзер кликает на узле тривью и в гриде отображается содержимое его листьев, а также листьев подчиненных узлов.
mmms (2005-07-11 11:18:00) [64]
msguns © (11.07.05 11:08)
Сергей, пока ничего нет, там пробелы между собачкой, если в них дело, или должно позже подойти, буду ждать, спасибо.
evvcom © (11.07.05 10:35)
Так же спасибо за решение, idnodeи idchildnodeэто не ID товара, а указатели для древовидного меню (кстати, рисуется очень хорошо :) ) а вот rowidи есть ID товара, из за нее весь сыр бор.
msguns (2005-07-11 11:08:00) [65]Лови. Комментарии в письме.
evvcom (2005-07-11 10:35:00) [66]1. idchildnode заменить на idparentnode или вообще на idparent
2. НД лучше отсортировать в виде:
id idparent caption level
1 1 Магазин 1
30 1 Электроника 2
...
40 1 Бытовая химия 2
2 1 Продукты 2
50 2 Фрукты 3
1 50 Яблоки 4 ***
1 50 Груша 4 ***
1 50 Слива 4 ***
51 2 Овощи 3
1 51 Картофель 4 ***
1 51 Морковка 4 ***
1 51 Огурцы 4 ***
52 2 Молочные 3
1 52 Молоко 4 ***
1 52 Кефир 4 ***
1 52 Сгущ. молоко 4 ***
1 52 Ряженка 4 ***
1 52 Сыр 4 ***
1 52 Творог 4 ***
3. id должен быть уникальным, поэтому записи помеченные *** имеют неверные id
4. добавить поле level, для более простого анализа на клиенте
5. пример построения дерева для MSSQL давали мастера на этом форуме. Уже не помню кто. Сейчас сделал поиск: не нашел. Привожу тот код:
CREATE FUNCTION TreeFromTable (@Root INT)
RETURNS @T TABLE (ID INT, Owner INT, level INT) AS
BEGIN
DECLARE @level INT
SET @Level=0
INSERT @T SELECT @Root, 0, 0
while exists(SELECT * FROM @T T, Structure S WHERE
T.level=@level and S.Owner=T.ID)
begin
INSERT @T (ID,Owner,Level)
SELECT S.ID, S.Owner, @level+1 from @T T, Structure S WHERE T.level=@level and S.Owner=T.ID
SET @level=@level+1
end
RETURN
END
mmms (2005-07-11 10:28:00) [67]
msguns © (11.07.05 10:24)
worldsite2000 @ mail.ru
Заранее благодарю :)
msguns (2005-07-11 10:24:00) [68]>mmms
Дай мыло, вышлю форму-модуль древовидного справочника
mmms (2005-07-11 10:20:00) [69]
rowid idnode idchildnode caption
1 1 1 Магазин
2 2 1 Продукты
3 30 1 Электроника
4 40 1 Бытовая химия
5 50 2 Фрукты
6 51 2 Овощи
7 52 2 Молочные
8 1 52 Молоко
9 1 52 Кефир
10 1 52 Сгущ. молоко
11 1 52 Ряженка
12 1 52 Сыр
13 1 52 Творог
14 1 51 Картофель
15 1 51 Морковка
16 1 51 Огурцы
17 1 50 Яблоки
18 1 50 Груша
19 1 50 Слива
20 100 30 DVD-плеер
21 101 30 Телевизор
22 102 30 Видеомагнитофон
23 103 30 Музыкальные центры
24 1 100 BBK 911 S
25 1 100 BBK 911
26 1 100 BBK 912 S
27 1 100 BBK 912
28 1 101 Sony 21''
29 1 101 Sony 25''
30 1 102 LG 944
31 1 102 LG 945
Как пример, вывод на экран только DVD-плеера...
mmms (2005-07-11 10:18:00) [70]
evvcom © (11.07.05 09:54)
прошу прощения, MSSQL2000, в принципе понятно, лучше старым дедовским способом, связанные таблицы, вид-товар. Сортировать... под данную процедуру это сложно, если надо что бы родители были всегда вверху.
evvcom (2005-07-11 09:54:00) [71]
> Кстати, в оракле есть CONNECT BY
Вот и я к тому же. Только фиг знает какой сервак у автора, а то может у него вовсе базы dBase или Paradox? А мы тут надрывайся ему, советуй из чего космический корабль построить, когда у него инструментов на велосипед недостаточно.
evvcom (2005-07-11 09:50:00) [72]
> как "получить" значение ID товара не знаю
В примере Query.FieldByName(idNode).asInteger - это и есть "получение ID", в чем проблема?
> может быть и 1000 позиций, может и 10000 быть
Удивляет игнорирование авторами уточняющих вопросов! 10000 - это довольно много. Даже при одноразовом пробеге по такому количеству записей для построения TreeView будет заметна пауза. А уж при
> while not Query.Eof do
> begin
> i := 0;
> while i < Tree.Items.Count do
эта пауза превратится в "смерть"!
Во-первых, надо подумать о сокращении количества выбираемых данных.
Во-вторых, отсортировать возвращаемый набор средствами SQL. Как? Для этого мы должны услышать ответ на вопрос
> База-то какая?
Который был проигнорирован.
ANB (2005-07-11 09:42:00) [73]
> mmms (11.07.05 09:30) [5]
- есть предложение. Имхо. Сами товары храни в плоской таблице с привязкой к древовидной с группами товаров. Тогда легко переключать - дерево / алфавитный список (не всем пользователям и не во всех режимах работы нравится работать с деревом) и инфы в дереве можно по минимуму хранить, а товары группы можно доставать отдельным запросом с любыми полями. И тормозить при закачке сильно не будет, так как групп сильно много не бывает. Кстати, в оракле есть CONNECT BY, который сам дерево строит.
Anatoly Podgoretsky (2005-07-11 09:39:00) [74]Третий параметр AddChildObject - это пользовательские данные, если у тебя ID = Integer, то можешь его прямо писать через приведение к Pointer и обратно.
mmms (2005-07-11 09:30:00) [75]
k2 © (11.07.05 09:15)
Интересное предложение, с GetBookmark попробовал, может что делаю не так (никогда до этого не сталкивался), перестала строится структура с ним, т.е. без Pointer(Query..
[4] evvcom © (11.07.05 09:23)
Да, таблица может быть и 1000 позиций, может и 10000 быть. Поэтому захотелось сделать древовидное меню, для быстроты выбора товара по его типу. Процедура от Delirium идеально подходит, вот только как "получить" значение ID товара не знаю.
evvcom (2005-07-11 09:23:00) [76]А что, запрос не может возвратить уже отсортированное нужным образом дерево, чтобы не сканить после каждого Next весь TreeView? При большом количестве записей в этом месте наступят бАльшие тормоза. База-то какая?
k2 (2005-07-11 09:15:00) [77]вместо idParent писать при заполнении дерева в Data букмарку, например:
Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString, Query.GetBookmark);
при клике по нодам дерева переходить в датасете на соответствующую запись
mmms (2005-07-11 09:00:00) [78]Можно ли данного примера показать, заполняюю этой процедурой..
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Процедура заполнения компонента TTreeView данными из TDataSet-совместимой выборки
Процедура заполнения компонента TTreeView данными из TDataSet-совместимой
выборки типа: idNode int, idParentNode int, cNodeName varchar, ...
Важно: корневой узел дерева должен быть первой записью выборки.
Зависимости: Windows, SysUtils, DB, ComCtrls
Автор: Delirium, Master_BRAIN@beep.ru, ICQ:118395746, Москва
Copyright: Master BRAIN (Delirium)
Дата: 18 октября 2002 г.
***************************************************** }
procedure FillTree(Tree: TTreeView; Query: TDataSet; idNode, idParent,
cNodeName: string);
var
i: integer;
begin
// Корневой узел, должен быть первым в выборке Query
Query.First;
Tree.Items.Clear;
Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString,
Pointer(Query.FieldByName(idNode).asInteger));
Query.Next;
while not Query.Eof do
begin
i := 0;
while i < Tree.Items.Count do
if Tree.Items.Item[i].Data = Pointer(Query.FieldByName(idParent).asInteger)
then
begin
Tree.Items.AddChildObject(Tree.Items.Item[i],
Query.FieldByName(cNodeName).AsString,
Pointer(Query.FieldByName(idNode).asInteger));
break;
end
else
Inc(i);
Query.Next;
end;
end;
k2 (2005-07-11 08:54:00) [79]node.data