К списку форумов К списку вопросов
Ttreeview и множественный выбор
садовник
07.04.2004 - 13:48
блин, туплю по черному, уже второй день не могу придумать как заносить в базу выбранные пункты в дереве, пока получается только полностью сохранять дерево в BLOB, но так нельзя база огромная получится! Короче одной записи в базе может соответствовать несколько элементов из дерева, как такое можно организовать? База interbase.
XPEH
1 - 07.04.2004 - 14:10
Подробнее расскажи. Какие таблицы, что за дерево.
садовник
2 - 07.04.2004 - 14:21
Хорошо, щас расскажу.
Дерево представляет собой справочник болезней. Примерно такой:
+Травмы
....+черепеномозговая травма
...........с переломо костей черепа
...........без перелома костей черепа
...........с наличием субдуральной гематомы
.....+скелетно-мозговая травма
...........бла бла бла....
и так далее, около 5 - 6 уровней, причем он должен быть редактируемым и должна быть возможность множественного выбора.
Сначало думал занести ID в Treeview.items[i].DATA и их вносить в базу, но это если бы не нужен был множ.выбор. Или может быть заносить в базу эти ИДишки используя какой-нибудь разделитель типа: 12.15.5 т.е. выбраны были элементы с ИД 12, 15, 5.
Hook
3 - 07.04.2004 - 14:49
садовник для кого пишешь, если не секрет?
садовник
4 - 07.04.2004 - 14:53
я для диплома в ККЭП, щас на практике
XPEH
5 - 07.04.2004 - 15:21
Т.е. есть 2 таблицы - иерархический справочник и какая-то вторая, в каждую запись которой нужно занести один или несколько ID из справочника. Так? Тогда, для исключения последующего парсинга строк, лучше сохранять все эти ID в один BLOB в виде последовательности двойных слов.
садовник
6 - 07.04.2004 - 15:28
"Т.е. есть 2 таблицы - иерархический справочник и какая-то вторая"
да в принципе для справочника я не стал создавать таблицу, я его сохраняю при помощи WriteComponent(treeview1) в файл, а при загрузке проги считываю его из файла.
ХРЕН, если не очень трудно приведи кусок кода твоей идеи, а то я совсем зеленый еще, как с этим БЛОБом работать?
Big Duck
7 - 07.04.2004 - 15:57
Какой BLOB о чем вы говорите?
А если поиск понадобится то че делать будете? К тому же BLOB тоже имеет свои ограничения - не боитесь перепоониться в один прекрасный момент?
Для таких целей делается таблица которая вяжется к этому справочнику-дереву болезней по первому полю, и, допустим, к больному по второму
В итоге получаем таблицу как минимум из этих двух полей:
ID_болезни и ID_больного и если захотим - что-то еще
В результате и искать проще и добавлять убирать новые/старые значения без проблем!
А хранить список ID в блобах - где вас такому учили?!
Big Duck
8 - 07.04.2004 - 16:12
И зачем хранить справочник болезней в каком-то внешнем файле? У тебя база данных или где?
Сделай для этого таблицу! и все твои проблемы пропадают сами собой!
садовник
9 - 07.04.2004 - 16:41
Big Duck,
"И зачем хранить справочник болезней в каком-то внешнем файле?" в таблице то оно конечно лучше, только я потеряю кучу времени пока придумаю как организовать базу что бы она хранила дерево из treeview, а потом еще и загружать из нее в TV, а сроки принимают, скоро диплом сдавать надо будет. А чем плохо хранить TV в отдельном файле?
----------------
"ID_болезни и ID_больного и если захотим - что-то еще" так одному больному может соответствовать несколько болезней!
Big Duck
10 - 07.04.2004 - 16:48
Ну, если задача стоит "скорее написать, сдать и забыть, а там пусть как хотят так и крутятся" - тогда непонятно зачем вообще было поднимать эту тему! - сделал бы хреновую залипуху и дело с концом!
Древовидную структуру организовать просто: одна таблица групп, утсроена так:
ID_группы, ID_родителя, наименование. В справочнике болезней ID_болезни, ID_группы, наименование. Вот и все! Че тут еще выдумывать?!
Да больному будет ссответсвовать несколько болезней - а разве не это требуется? если нет - тогда зачем множественный выбор? Тогда таблицу дополнительную не надо, а в таблице больных сделать поле ссылающееся на справочник болезней....
садовник
11 - 07.04.2004 - 17:03
так какая структура будет то?
таблица:
больной1 - ID_1
больной1 - ID_2
больной2 - ID_2
больной2 - ID_15
больной2 - ID_3
больной3 - ID_6
так? или я не понимаю нех...?
Big Duck
12 - 07.04.2004 - 17:13
Для таблицы, содержащей болезни по больным - так.
садовник
13 - 07.04.2004 - 22:57
попутный вопросик:
с помощью какого свойства можно программно выделить элементы ТрииВьюва чтобы они подсвечивались синим цветом?
Big Duck
14 - 08.04.2004 - 09:45
Какие элементы подсвечивались? Которые ты хочешь выбрать? Так можно Check-и понаставить где надо и все.... или тебе текущий элемент так хочется выделять? В любом случае смотри своства объекта node.
Точно не помню, но кажется так:
tree.checkbox = True
Потом для каждого нужного узла дерева
oNode.checked = true
а если именно цвет..... не помню - надо свойства смотреть, но наверняка что-то типа BackColor там будет - вот им и надо рулить
Наф
15 - 08.04.2004 - 09:58
[14] Не надо путать управление и отображение!
[13]
var
 List:TList;
begin
 List:=TList.Create;
 List.Add(TreeView1.Items[0]);
 List.Add(TreeView1.Items[1]);
 List.Add(TreeView1.Items[2]);
 TreeView1.Select(List);
end;
Big Duck
16 - 08.04.2004 - 10:25
Ну, он же сам спрашивал, как "программно выделить".... так что я по теме ответил.......
садовник
17 - 08.04.2004 - 12:22
Big Duck, чего то не нашел я этого свойства checkbox = True и cheked тоже в ТрииВьюве нету.
Спасибо, НАФ, вроде получилось. И тебе Big Duck тоже спасибо!
Big Duck
18 - 08.04.2004 - 13:14
Ну, за синтаксис не ручаюсь - не знаю какой точно у тебя компонент......
а вот масдаевский, тот, который зашит в mscomctl - там точно эти свойтва есть.
А синим, насколько я помню, по дефолту активный узел подсвечивается. тут Наф прав - просто его активировать и будет он синим :) TreeView1.Select(List)

К списку вопросов на форуме Программирование

>>