| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > ctreeCtrl |
| Автор: tonchitos 17.3.2008, 14:29 |
| не могу найти функци - получить уровень выбранного потомка и позицию. |
| Автор: Earnest 17.3.2008, 14:48 |
| Функции для определения уровня нет, но написать ее элементарно, коли надо. Позиция в дереве - это что? Единственный ид-р элемента в дереве - HTREEITEM. |
| Автор: tonchitos 17.3.2008, 14:57 |
| позиция - позиция среди чайлдов. поле1 уровень1 позиция2 поле1.1 уровень2 позиция1 поле1.2 уровень2 позиция2 поле1.3 уровень2 позиция3 поле2 уровень1 позиция2 мне, чтобы удалить чайлда, надо знать его уровень и позицию. как написать не поскажете? |
| Автор: Earnest 17.3.2008, 16:39 |
C выражений мыслей у нас явная проблема. Ты имеешь в виду, линейный порядок элементов? Так кто же, кроме тебя знает, в каком они там у тебя порядке. А дерево не имеет линейного порядка, его обходить можно по-разному. Можно, конечно, считать, что порядок элементов в дереве == порядку, в котором ты их туда записывала, то это не всегда верно, зависит от флагов вставки, и лучше бы на это не полагаться. Если в твоих данных элементы хранятся в массиве и имеют какой-то порядковый номер, то проще всего запоминать его при добавлении элементов, в LPARAM. Если позиция - это номер именно в списке дочерних элементов конкретного узла, тогда записывай и уровень и позицию: MAKELONG (level, pos) - надеюсь 2 байтов тебе хватит для индексации? |
| Автор: dizzy1984 18.3.2008, 10:20 |
| Не совсем понятно, о чем речь. Дерево - это вариант графа, а в графе есть только 2 вещи - вершина и наличие связи между вершинами. Так, кажется я понял о чем речь, уровень - это удаленность от корня. А вот с позицией проблемы - это понятие не имеет смысла, разве что только для определенного способа обхода вершин, либо если предположить, что позиция определяется временем вставки, т.е чем позднее вставили, тем больше "позиция". Тогда я бы сделал обход таким образом ГлубинаПозиция(Глубина, ИдентификаторТекущегоУзла, ИдентификаторИскомогоУзла) Позиция = 0 Для Всех Потомков Текущего Угла Если ИдентификаторТекущегоПотомка = ИдентификаторИскомогоУзла, то Вернуть {Глубина; Позиция} Иначе {Глубина1; Позиция1} = ГлубинаПозиция(Глубина + 1, ИдентификаторТекущегоПотомка, ИдентификаторИскомогоУзла) Если Корректно({Глубина1; Позиция1}), то Вернуть {Глубина1; Позиция1} КонецИначе Позиция = Позиция + 1 КонецДля Вернуть {НекорректнаяГлубина; НекорректнаяПозиция} Или есть второй вариант - как говорит Earnest, при заполнении дерева вести учет глубины и позиции и ассоциировать с вершиной эти значения с помощью CTreeCtrl::SetItemData. |
| Автор: tonchitos 18.3.2008, 14:21 |
| Господа, мне очень нужна ф-ия для отображения или не отображения плюсика. мне нужно загружать всех чайлдов в дерево не сразу, а только при нажатии плюсика. Задание такое. Хто нить ф-ю такую знает? Плюс нажатие на плюсик тоже надо. Добавлено через 5 минут и 28 секунд инит диалог вызывается до дуМодал или после? Добавлено через 6 минут и 6 секунд TreeDlg TrDlg(0, root); TrDlg.myFlag = false; // вот это значение в инитедиалоге уже будет? TrDlg.DoModal(); |
| Автор: tonchitos 18.3.2008, 14:48 |
| Уровень мне нужен: тк добавив потомка в дерево мне надо добавить его в дерево -структуру данных. для этого знать надо уровень. По данным не проверишь, они в разных ветках совпадать могут. |
| Автор: tonchitos 18.3.2008, 15:12 |
Добавлено @ 15:18 то есть как мне с ассоциировать узел в триконтроле с узлом в моем дереве. |
| Автор: tonchitos 18.3.2008, 16:17 |
| как я понимаю в данном случае только по данным можно найти. ну уровень я определила. рекурсия, ну опять тлудно сообразить... |