2015-10-24 1 views
0

В TtreeView1.DragDrop я использую заявления, такие как(Delphi TTreeView), как перетащить/узел падение ниже (или выше), выбранный узел

targetnode := TreeView1.GetNodeAt(x,y); 
... 
TreeView1.Selected.MoveTo(targetnode , naInsert) ; 

переместить узел с помощью мыши и вставить его перед т.е. выше, существующий узел на одном уровне.

Id нравится изменять поведение, так что, если я перетаскиваю вниз, узел перемещается ниже цели, но если я перетаскиваю его вверх, он перемещается вверху цели (в противном случае я могу перетащить в новое нижнее положение, но не новый верх или наоборот). Рода структуры я пытаюсь это

targetnode := TreeView1.GetNodeAt(x,y); 
... 
if DraggedItem.Index > targetnode.Index then //we are dragging upwards, insert before 
    TreeViewStructure.Selected.MoveTo(targetnode , naInsert) 
else          //we are dragging downwards, insert after 
    TreeViewStructure.Selected.MoveTo(targetnode , ???) ; 

, но я не могу найти постоянную TNodeAttachMode, который вставляет родственный после целевого узла. Константы TNodeAttachMode приведенная здесь http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TNodeAttachMode.html являются ...

naAdd: The new or relocated node becomes the last sibling of the other node. 
naAddFirst: The new or relocated node becomes the first sibling of the other node. 
naInsert:The new or relocated node becomes the sibling immediately before the other node. 
naAddChild:The new or relocated node becomes the last child of the other node. 
naAddChildFirst:The new or relocated node becomes the first child of the other node. 

, но ни один из них не относятся к новому последнему собрату.

Могу ли я делать то, что хочу? если да, то как?

ответ

1

Нет опции для вставки после узла, только вставить ранее. Таким образом, вам нужно найти узел после цели перетаскивания и вставить перед ним.

Чтобы добавить после последнего узла, найдите последний узел и пройдите naAdd до MoveTo.

+0

Но нет ни одного узла после последнего! Поэтому, если у меня есть A, B, C, D, E, и я хочу изменить порядок, чтобы стать B, C, D, E, A, вы говорите, что я не могу перетащить «А» на новое место? Могут ли мои отдельные параметры отдельно перетаскивать каждый другой узел (B, C, D, E) до «A» или сначала перетаскивать «A» вниз между «D» и «E», а затем в отдельной операции перетаскивать «E» до «D» и «A»? - Я вижу, что это путает многих пользователей. – user3209752

+0

(У меня есть небольшая программа под названием «HelpNDoc», которая отображает заголовки разделов документации в виде дерева и позволяет перетаскивать заголовок вправо или снизу вверх, чтобы это было возможно.) – user3209752

+0

Для последнего узла используйте 'naAdd ' –

0

Благодаря Давиду за его предложения. Используя их, я, наконец, написал следующий код для достижения того, что мне нужно. Написал здесь, если он будет полезен кому-либо еще. (Это соответствующий бит кода внутри OnDragDrop)

if (Assigned(targetnode)) //we are over a target node 
    and (DraggedNode.Level = targetnode.Level then //we are dragging within the same sub level 
     begin 
     if targetnode.Index = targetnode.Parent.Count -1 then //target is the last node so do an naAdd to drop node at the end 
       TreeViewStructure.Selected.MoveTo(targetnode , naAdd) 
     else 
       TreeViewStructure.Selected.MoveTo(targetnode , naInsert) //drop before target using naInsert 
     end; 
Смежные вопросы