Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Drag&Drop TreeList Status

69K
29 января 2013 года
l2qwe
13 / / 27.09.2011
Доброе время суток.
Необходимо запретить перенос узлов на другие уровни.

В DevExprese у TreeList есть индикатор Drag&Drop


Можно ли как нибудь определить его состояние в событии:

 
Код:
procedure DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
?
Что бы получилось что то вроде

 
Код:
if InicatorState = 1 then
    Accept := false
  else
    Accept := true
Тогда задача решилась бы сама собой, но не как не могу определить статус этого индикатора....
20K
30 января 2013 года
ellor!
198 / / 24.05.2012
Цитата: mfender
В процедуру уже изначально входят Sender и Source. Этого вполне достаточно. У каждого из них есть как минимум ParentNode и Items, если предусмотрено таскание только по дереву.


Здесь недостаточно. Sender и Source ссылаются на объекты-участники перетаскивания, и поскольку в данном случае перетаскивание происходит в пределах одного компонента TcxTreeList, то они равны и имеют тип TcxTreeList.

Цитата: l2qwe
Не дает навести на узлы другой уровня но позволяет навести на узел с общим родителем в результате есть возможность как переместить внутри текущего уровня так и перевести в потомки к одному из узлов..


Можно добавить проверку на попадание в линию дерева.

 
Код:
Accept := (TargetNode.Parent = SourceNode.Parent) and cxTreeList1.HitTest.HitAtIndent;
8
29 января 2013 года
mfender
3.5K / / 15.06.2005
Нужно в событии проверять Sender и Source на принадлежность к одному корню циклом по ParentNode.
69K
29 января 2013 года
l2qwe
13 / / 27.09.2011
Дело в том что на момент отрабатывания события Sender и Source находятся на одном уровни и имеют общего родителя.
То есть я пытаюсь перетащит узел "010" и поместить его над узлом "008", во время отрабатывания события DragOver оба узла имеют родителя "0"(его видно на сирине в 3 случаи). но получается что в зависимости от того где находится курсор в пределах узла "008" узел "010" может в итоге оказаться потомком узла "008" чего нельзя допустить.
8
29 января 2013 года
mfender
3.5K / / 15.06.2005
Секундочку, не надо травить ноды по каким-то мистическим цифрам. У каждого нода есть совершенно определённый Handle. И опять же, у нода, у которого level=3 ParentNode будет не корневой, а только тот что выше. И соответственно его нужно проверять в цикле.
8
29 января 2013 года
mfender
3.5K / / 15.06.2005
2l2qwe: Нужно просто немного ниже уровнем пойти. Не выдумывать своих идентификаторов, а воспользоваться тем, что уже написано. Да, это немного сложнее, но иногда потратить время на чтение исходников куда полезнее изобретения очередного велосипеда.
69K
29 января 2013 года
l2qwe
13 / / 27.09.2011
Sender и Source у меня равны и являются самим TreeList'ом типа TcxDBTreeList;
Цитата:
И опять же, у нода, у которого level=3 ParentNode будет не корневой, а только тот что выше


Изначально у меня все узлы кроме корневого на одном уровне(то есть у них один и тот же 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;
Не дает навести на узлы другой уровня но позволяет навести на узел с общим родителем в результате есть возможность как переместить внутри текущего уровня так и перевести в потомки к одному из узлов..
8
29 января 2013 года
mfender
3.5K / / 15.06.2005
Совершенно неправильные условия.
В процедуру уже изначально входят Sender и Source. Этого вполне достаточно. У каждого из них есть как минимум ParentNode и Items, если предусмотрено таскание только по дереву. Можно и из внешних компонентов таскать.

Ну и понятно, что заявление

 
Код:
if TargetNode.Parent <> SourceNode.Parent then
      Accept := False;
практически в любом случае даст отрицательный результ, и в контексте вопроса вообще бесполезен.
69K
30 января 2013 года
l2qwe
13 / / 27.09.2011
Цитата: ellor!

Можно добавить проверку на попадание в линию дерева.
 
Код:
Accept := (TargetNode.Parent = SourceNode.Parent) and cxTreeList1.HitTest.HitAtIndent;


Огромное спасибо то что нужно!
Как я только не пытался не пытался определить что курсор мыши наведен на область с пиктограммами, а оказалось так просто.. я так понимаю Indent(отступ) область под пиктограммы.
Еще раз огромное спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог