Для ListView2 установим ViewStyle = vsSmallIcon и покажем, как вручную расставлять значки. В OnDragOver зададим условие
Code: |
Accept := (Sender = Source) and ([htOnLabel,htOnItem, htOnIcon] * ListView2.GetHitTestInfoAt(x, y) = []); // пересечение множеств должно быть пустым - запрещаем накладывать элементы |
а код в OnDragDrop очень простой:
Code: |
ListView2.Selected.SetPosition(Point(X,Y)); |
Перетаскивание в TreeView - довольно любопытная тема, здесь порой приходится разрабатывать алгоритмы обхода ветвей для достижения желаемого поведения. Для TreeView1 разрешим перестановку своих узлов в другое положение. В OnDragOver проверим, не происходит ли перетаскивание узла на свой же дочерний во избежание бесконечной рекурсии:
Code: |
var Node, SelNode: TTreeNode; begin Node := TreeView1.GetNodeAt(x, y); // находим узел-приемник Accept := (Sender = Source) and (Node <> nil); if not Accept then Exit; SelNode := Treeview1.Selected; while (Node.Parent <> nil) and (Node <> SelNode) do begin Node := Node.Parent; if Node = SelNode then Accept := False; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!