![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| uandriy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 22.3.2007 Где: Украина, Днепропе ровск Репутация: нет Всего: нет |
Полистал разные форумы, но так и не нашел толком описанных решений использования VST в связке с иерархическими данными, хранящимися в БД. Почитал мануал и статью Quadr0 (как наиболее полный по-моему источник), но и там рассматриваются только примеры, где данные в VST добавляются просто путем изменения RootNodeCount или обычные линейные списки.
Я в процессе изучения написал 3-4 варианта заполнения VST простейшими иерархическими данными (связь типа id-parentid). С этим проблем нет, если нужно, то могу выложить все эти вартианты с описанием. Но вот дошла очередь до Drag'n'drop и начались проблемы. Нужно организовать возможность перетягивания элементов мышкой для изменения иерархических связей и все это потом сохранять обратно в БД. Люди, кто сталкивался с подобным, отзовитесь. Страдают дети, родственники, соседи.... |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Я немного сталкивался. Какие проблемы возникают?
По-моему всё можно описать следующими правилами: При изменении родителя, меняем ParentID на ID нового родителя. Немного сложнее, если надо поменять порядок узлов. У меня для этого заведена отдельная переменная ORDER_ID, и при перетаскивании элемента, ORDER_ID перетаскиваемого узла заменяется на ORDER_ID + или - 1 от ORDER_ID того узла перед или за которым мы бросаем выделенную. |
|||
|
||||
| uandriy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 22.3.2007 Где: Украина, Днепропе ровск Репутация: нет Всего: нет |
Bose, ну, это самый логичный по-моему из вариантов и все это я тоже подразумеваю, но вот КУДА т.е. в какие ивенты все это вписывать -- не могу понять.
То перетаскиваемые элементы пропадают, то ... короче ламерство какое-то. Сейчас еще перечитаю/перепишу, мож вечером поделюсь впечатлениями. |
|||
|
||||
| Bose |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
В OnDragAllowed пишем:
в OnDragOver пишем следующее:
в OnDragDrop пишем примерно следующее:
Свойства дерева: ClipboardFormat:=[Virtual Tree Data] DragType: dtOle Как вариант ещё могу посоветовать посмотреть как реализван Drag&Drop в в демках к Dynamic DBTreeView controls Это сообщение отредактировал(а) Bose - 16.4.2007, 13:43 |
||||||
|
|||||||
| uandriy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 22.3.2007 Где: Украина, Днепропе ровск Репутация: нет Всего: нет |
Bose, а если не секрет, то вы как дерево заполняли первоначальными данными?
Я "нашел" след. способы "глобальные": 1 - "На лету": Заполняю через AddChild только корневые элементы (самый верхний уровень), а в событиях OnInitChildren отфильтровываю MemTable, оставляя только дочерние элементы текущего элемента-родителя. В OnInitNode заполняю поля структуры из текущей записи в MemTable и перехожу к следующей. Достоинства -- экономное расходование памяти и высокая скорость, т.к. инициализируются только те элементы, которые простмотрел пользователь и для фильтрации используется метод SetRange/CancelRange по индексированным полям. Недостаток -- извращения с переключением Range у таблицы. 2 - "Полная инициализация": Рекурсивной строится полностью все дерево с помощью функции AddChild. В принципе на моих объемах данных тоже быстро и нет необходимости все время устанавливать/снимать Range, что в принципе проще. |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
uandriy, у меня используется древний наследник от VirtualTreeView(есть на офф. сайте delphigems в third-party examples), таким он мне достался от предшественника, а в исходники я не лазил.
Если бы мне сейчас пришлось выбирать, я бы выбрал Dynamic DBTreeView control. В нём загрузка, насколько я понял из описания реализована более грамотно. Сейчас у меня работа с деревом происходит по второму методу. Т.е. Считываются все данные из базы, а после строится структура(насколько я понял принцип работы того компонента). В Dynamic DBTreeView есть возможность выбрать способ. Реализовано это так: помимо полей OBJECT_ID, PARENT_ID там можно указать опциональное поле HAS_CHILDREN, которое будет использоваться для выяснения, есть ли у узла дети. Если поле HAS_CHILDREN присутствует, тогда инициализация детей и считывание данных происходит на лету, если не указано, то считываются все данные. Но, могу и ошибаться. Кстати ещё один из плюсов этого компонента в том, что в нём для каждого столбца в дереве(Column) можно указать соответствующее поле из Datasetа.
это я вообще не понял. |
|||
|
||||
| uandriy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 22.3.2007 Где: Украина, Днепропе ровск Репутация: нет Всего: нет |
Та ну, так не интересно. Сделал, чтобы все работало, но на Dynamic DBTreeView. Просто из-за того, что время поджимает оставлю пока что этот вариант, но все равно расковыряю с "ручной" обработкой в VirtualStringTree, т.к хочется разобраться что/почему/от чего и как....
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |