FoxBase!
msgbartop
Блог Oracle разработчика
msgbarbottom
foxbase

29.01.2010 TTreeView Drag and Drop

Здесь показан простой способ организации технологии 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;

www.foxbase.ru



Смотрите также:



Оставьте свой комментарий

Вы должны быть авторизированны, чтобы оставить комментарий.