Установка индекса узла в VirtualStringTree? - PullRequest
1 голос
/ 07 февраля 2011

Я пытаюсь изменить индекс узла, потому что есть определенные узлы, которые всегда должны быть внизу моего дерева. Я пытался изменить Node.Index, но это ничего не изменило. Итак, мой вопрос: как мне изменить индекс PVirtualNode?

Спасибо! - Джефф

Ответы [ 4 ]

4 голосов
/ 07 февраля 2011

Чтобы изменить индекс узла A , найдите узел B , имеющий индекс, который вы хотите A , и затем вызовите Tree.MoveTo(A, B, amInsertBefore, False). B и все после него сместится на единицу, чтобы освободить место для A , и их поля Index будут пересчитаны.Это работает, даже если A еще не существует в дереве (например, сразу после вызова MakeNewNode).

Если вы используете Index, чтобы связать каждый узел с егосоответствующее значение данных в списке или массиве, тогда вы найдете это в значительной степени неэффективным для переупорядочения отображаемых значений.

3 голосов
/ 07 февраля 2011

Вы не можете изменить индекс узла.Обычно при использовании VirtualStringTree вы держите свои данные в собственной структуре данных отдельно от дерева и получаете доступ к данным из событий.Вы также можете хранить данные непосредственно в узлах (используя запись), но я предпочитаю другой подход, поскольку он не допускает логику в древовидном представлении.

Например, вы можете сохранить данные в списке иполучить доступ к этому списку в обработчике GetText (вы можете использовать Node.Index).Затем, если вы хотите изменить порядок элементов, просто измените порядок в вашем списке, и все остальное произойдет автоматически (вам может потребоваться вызвать Invalidate на дереве).

Псевдокод:

Инициализация:

Tree.RootNodeCount := MyList.Count;

В событии GetText:

NodeText := MyList [Node.Index];

Изменение порядка следования:

Reorder (MyList);
Tree.Invalidate;
2 голосов
/ 07 февраля 2011

Учитывая, что вы по-прежнему используете древовидный элемент управления в качестве контейнера, идеальное решение, предлагаемое Smasher, вам недоступно.

Одним из довольно очевидных решений, учитывая, что ваше древовидное представление не имеет иерархии (т.е. это список), было бы использование метода Sort с собственной функцией сравнения (OnCompareNodes).

Другой очевидной стратегией было бы добавить узел, который вы хотите внизу, последним. Если вам нужно добавить другие узлы позже, вставьте их над специальным последним узлом с помощью InsertNode. Этот простой подход, вероятно, будет достаточно для решения проблемы, как вы ее описали.

2 голосов
/ 07 февраля 2011

TVirtualNode - это двусвязный список, это не основанная на индексе структура: вы изменяете индекс узла, удаляя его и добавляя его в нужное место.

Просмотр DeleteNode и AddChild.

...