Drag&Drop TreeList Status
Необходимо запретить перенос узлов на другие уровни.
В DevExprese у TreeList есть индикатор Drag&Drop
Можно ли как нибудь определить его состояние в событии:
Код:
procedure DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
State: TDragState; var Accept: Boolean);
Что бы получилось что то вроде
Код:
if InicatorState = 1 then
Accept := false
else
Accept := true
Accept := false
else
Accept := true
Цитата: mfender
В процедуру уже изначально входят Sender и Source. Этого вполне достаточно. У каждого из них есть как минимум ParentNode и Items, если предусмотрено таскание только по дереву.
Здесь недостаточно. Sender и Source ссылаются на объекты-участники перетаскивания, и поскольку в данном случае перетаскивание происходит в пределах одного компонента TcxTreeList, то они равны и имеют тип TcxTreeList.
Цитата: l2qwe
Не дает навести на узлы другой уровня но позволяет навести на узел с общим родителем в результате есть возможность как переместить внутри текущего уровня так и перевести в потомки к одному из узлов..
Можно добавить проверку на попадание в линию дерева.
Код:
Accept := (TargetNode.Parent = SourceNode.Parent) and cxTreeList1.HitTest.HitAtIndent;
Нужно в событии проверять Sender и Source на принадлежность к одному корню циклом по ParentNode.
То есть я пытаюсь перетащит узел "010" и поместить его над узлом "008", во время отрабатывания события DragOver оба узла имеют родителя "0"(его видно на сирине в 3 случаи). но получается что в зависимости от того где находится курсор в пределах узла "008" узел "010" может в итоге оказаться потомком узла "008" чего нельзя допустить.
Секундочку, не надо травить ноды по каким-то мистическим цифрам. У каждого нода есть совершенно определённый Handle. И опять же, у нода, у которого level=3 ParentNode будет не корневой, а только тот что выше. И соответственно его нужно проверять в цикле.
2l2qwe: Нужно просто немного ниже уровнем пойти. Не выдумывать своих идентификаторов, а воспользоваться тем, что уже написано. Да, это немного сложнее, но иногда потратить время на чтение исходников куда полезнее изобретения очередного велосипеда.
Изначально у меня все узлы кроме корневого на одном уровне(то есть у них один и тот же Parent и он же является корнем ) и необходимо что бы так всё и оставалось.
Вы имеете в веду проверку такого типа?
Код:
var
i:Integer;
TargetNode,SourceNode : TcxTreeListNode;
begin
TargetNode := lstBody.GetNodeAt(X,Y);
SourceNode := lstBody.Selections[0];
if TargetNode.Parent <> SourceNode.Parent then
Accept := False;
end;
i:Integer;
TargetNode,SourceNode : TcxTreeListNode;
begin
TargetNode := lstBody.GetNodeAt(X,Y);
SourceNode := lstBody.Selections[0];
if TargetNode.Parent <> SourceNode.Parent then
Accept := False;
end;
В процедуру уже изначально входят Sender и Source. Этого вполне достаточно. У каждого из них есть как минимум ParentNode и Items, если предусмотрено таскание только по дереву. Можно и из внешних компонентов таскать.
Ну и понятно, что заявление
Код:
if TargetNode.Parent <> SourceNode.Parent then
Accept := False;
Accept := False;
Цитата: ellor!
Можно добавить проверку на попадание в линию дерева.
Код:
Accept := (TargetNode.Parent = SourceNode.Parent) and cxTreeList1.HitTest.HitAtIndent;
Огромное спасибо то что нужно!
Как я только не пытался не пытался определить что курсор мыши наведен на область с пиктограммами, а оказалось так просто.. я так понимаю Indent(отступ) область под пиктограммы.
Еще раз огромное спасибо.