Как предотвратить перетаскивание определенного виртуального StringTree NodeLevel?

Чего я пытаюсь достичь

У меня есть виртуальное дерево строк с подуровнями строк, которые могут быть расширены пользователем. Верхний уровень иерархии всех узлов должен быть перетаскиваемым. Но ни один из уровней подузла не должен быть.

Как проверить

Для тестирования я использую проект Advanced Demo текущей версии Virtual TreeView. Вторая демонстрация (Общие способности и возможности) имеет адекватную иерархию узлов, и вы можете перетаскивать узлы вокруг.

рассмотрение

Я думал, что смогу выполнить свою задачу, используя OnDragAllowed событие, но оно не срабатывает, когда я тащу. Мое намерение состоит в том, чтобы проверить уровень узла (GetNodeLevel) до начала перетаскивания и разрешить перетаскивание только для верхнего уровня 0.

Как я могу предотвратить перетаскивание определенных уровней узлов виртуального дерева строк?

1 ответ

Решение

Ради ответа... вся заслуга принадлежит TLama.

Чтобы предотвратить перетаскивание определенного уровня узла, мы можем реализовать OnDragAllowed обработчик событий и убедитесь, что у StringTree есть DragMode установлен в dmManual,

Вот обработчик события.

procedure TForm1.vstDragAllowed(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; var Allowed: Boolean);
begin
  { dragging shall only be possible for top nodes (level 0) }
  Allowed := TVirtualStringTree(Sender).GetNodeLevel(Node) = 0;
end;

Основы и значение Drag and Drop описаны в этой статье Delphi About.com.

Другие вопросы по тегам