Здесь показан простой способ организации технологии Drag and Drop для TTreeView в Delphi, при помощи которого можно перемещать узлы TTreeView в другие узлы.
Прежде всего необходимо выставить свойство DragDrop компонента TTreeView в dmAutomatic
Затем требуется написать следующий код для события onDragOver компонента TTreeView, которое проверяет допустимость завершения процедуры перетаскивания выделенного узла в тот узел дерева, на который указывает курсор мыши. В этом событии мы должны получить этот узел дерева при помощи функции GetNodeAt, и, если он существует, проверить, можно ли в него выполнить перетаскивание выделенного узла. Если можно, то необходимо выставить переменную Accept в True, иначе - в False. Код может выглядеть примерно так (пусть наше дерево имеет имя Tree, расположенное на форме с именем Form1):
procedure TForm1.TreeDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var Node: TTreeNode;
begin
Node:=Tree.GetNodeAt(X,Y);
if (Node<>nil) and {проверяем условие на допустимость перетаскивания выделенных узлов в текущий узел Node} then
Accept:=true else Accept:=False;
end;
Следующий и последний шаг в нашей технологии - обработать завершение перетаскивания в выбранный разрешенный узел. Выполним это в событии onDragDrop:
procedure TForm1.TreeDragDrop(Sender, Source: TObject; X, Y: Integer);
var Node: TTreeNode;
begin
Node:=Tree.GetNodeAt(X,Y);
Tree.Selected.MoveTo(Node,naAddChild);
// Выполняем другие требуемые действия
end;
Показанный выше код достаточно прост, но при реализации для длинных списков в дереве TTreeView невозможно перетащить узел в том случае, если целевой узел находится за пределами видимости окна TTreeView. Для решения этой проблемы рекомендуется модифицировать код в событии onDragOver, который позволит выполнить прокрутку содержимого дерева при достижении курсора мыши в процессе перетаскивания верхней или нижней границы полосы прокрутки TTreeView:
procedure TForm1.TreeDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var Node: TTreeNode;
begin
if x>Tree.Width-20 then
begin
if y>Tree.Height div 2 then
SendMessage(Tree.Handle, WM_VSCROLL, SB_LINEDOWN, 0)
else
SendMessage(Tree.Handle, WM_VSCROLL, SB_LINEUP, 0);
end;
Node:=Tree.GetNodeAt(X,Y);
if (Node<>nil) and {проверяем условие на допустимость перетаскивания выделенных узлов в текущий узел Node} then
Accept:=true else Accept:=False;
end;
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.