Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(tonchitos @  17.3.2008,  15:57 Найти цитируемый пост)
позиция - позиция среди чайлдов.

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.

Автор: Earnest 18.3.2008, 10:59
Цитата(dizzy1984 @  18.3.2008,  11:20 Найти цитируемый пост)
Или есть второй вариант - как говорит Earnest, при заполнении дерева вести учет глубины и позиции и ассоциировать с вершиной эти значения с помощью CTreeCtrl::SetItemData. 

Ну, я имела ввиду заносить данные прямо при вставке элемента, заполняя lparam, но и так можно.

Автор: 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
как я понимаю в данном случае только по данным можно найти. ну уровень я определила. рекурсия, ну опять тлудно сообразить...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)