Как предотвратить перетаскивание определенного виртуального 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.