2013-11-09 2 views
3

А имеют дерево: ROOT - VirtualStringTree (Вы не видите его, TVirtualStringTree.RootNode)VitrtualStringTree. Как перетащить на уровень ROOT?

- My Root Node 1 
- My Root Node 2 
- - Second node 1 
- - Second node 2 
- - Second node 3 
- My Root Node 3 

Я drag'n'drop "Мой корневой узел 3" для любого видимого узла, но я не может вернуть его в положение defaut, до корневого уровня дерева.

Я стараюсь, что:

//Part of code from OnDragDrop Event of VirtualStringTree 
    if (Sender.DropTargetNode = Sender.RootNode) then 
    begin 
     for i := 0 to high(Nodes) do 
     begin 
     LinksTree.MoveTo(Nodes[i], Sender.DropTargetNode, Attachmode, False); 
     end; 
    end; 

Я не помещает курсор в никуда, но ничего не происходит. В DragOver я принял drop to root, если DropTarget является VST.RootNode.

Кто-нибудь знает, как удалить узел в VST.RootNode, если я перетаскиваю мышь в пустое пространство компонента?

+1

Предположим, вы уронили «Корневой узел 3» на «Корневой узел 1» и установите 'AttachMode' в' amInsertBefore' это будет перемещаться в корень. добавьте 'toShowDropmark' в' PaintOptions', чтобы увидеть метку падения. Моя логика такова: если 'Mode' (' TDropMode') является 'dmAbove', я устанавливаю' AttachMode: = amInsertBefore'; 'dmOnNode -> amAddChildLast'; 'dmBelow -> amInsertAfter'. – kobik

+1

@kobik, падение до пустого места указывается режимом drop 'dmNowhere', и многие примеры показывают назначение режима amNoWhere в режиме attach. И это будет так, я думаю, потому что вызов 'MoveTo' выглядит правильно. Вы можете перемещать узлы в 'RootNode' (или' nil', что означает то же самое), поэтому единственное, что я подозреваю, это неправильный режим присоединения. – TLama

+1

@TLama, Да, я хотел упомянуть «amNoWhere», но вы были быстрее :) В любом случае я НЕ реализую 'amNoWhere' becouse. Я думаю, что неправильное поведение пользовательского интерфейса для перемещения узлов, когда нет видимых целевых узлов. – kobik

ответ

5

Вы не показали свой код, но в основном, вам просто нужно использовать правильный (прикрепить) Mode параметр для MoveTo вызова метода в ситуациях, когда (падение) Mode параметров вашего метода OnDragDrop событий равна dmNowhere , который указывает, что пользователь просто удалил узел (ы) в пустое пространство дерева. Я предполагаю, что у Вас есть код, как следует определить режим прикрепления в методе OnDragDrop событий:

var 
    ... 
    AttachMode: TVTNodeAttachMode; 
begin 
    ... 
    // the Mode here is a drop mode parameter 
    case Mode of 
    dmNowhere: AttachMode := amNoWhere; // <- where this stands for no move 
    ... 
    end; 
    ... 
end; 

Если это так, вы можете просто сказать дерево, чтобы прикрепить узел, например, в качестве последнего ребенка путем изменения режима подключения к amAddChildLast если режим падение будет dmNowhere:

var 
    ... 
    AttachMode: TVTNodeAttachMode; 
begin 
    ... 
    // the Mode here is a drop mode parameter 
    case Mode of 
    dmNowhere: AttachMode := amAddChildLast; // <- attach node as a last child 
    ... 
    end; 
    ... 
end; 
+0

Не следует ли «dmOnNode» сопоставляться с «amAddChildLast»? – kobik

+0

@kobik, это не важно здесь. Главное, что 'dmNowhere' указывает на падение в пустое пространство. Я думаю, что OP назначил 'amNoWhere' в режим присоединения, который не двигался. – TLama

+1

Я думаю, вы правы, но я предпочитаю ваш предыдущий ответ, где вы показываете все режимы присоединения. +1 – kobik

Смежные вопросы