Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Drag&Drop and TTreeView


SH ©   (2003-06-03 16:56:00) 

Как сделать, чтобы в TTreeView можно было мышкой перетаскивать строки дерева, меняя их расположение в общей структуре. Подобную фичу можно например наблюдать в The Bat (Ctrl+Shift на каком либо элементе дерева папок и стрелками перемещаем ветки ниже или выше по дереву).


SH   (2003-06-24 18:46:00) [1]

> ZEE c (17.06.03 17:54)
> Я перемещаю так: ...
Спасибо ZEE, вы мне дали хороший старт.

Для тех, кто интересуется этой веткой форума, сообщаю чего я нашёл и
сделал к этому времени. Плюс ниже про новые проблемы.
Нашёл.
--------
Прекрасная статья Бориса Новгородова про Drag&Drop прямо на этом сайте.
Статья называется "Примеры использования Drag and Drop для различных визуальных
компонентов".

Слелал.
-------
Вот этот примерчик:

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=(Source=Sender);
end;

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
SelNode,TarNode:TTreeNode;
begin
SelNode:=TreeView1.Selected;
TarNode:=TreeView1.GetNodeAt(X,Y);
if TarNodenil then
SelNode.MoveTo(TarNode,naInsert);
end;
-------

Чего ещё надо
-------------
Ни как не удаётся запрограммировать нужное поведение в
TreeView1DragDrop. Там сейчас используется naInsert и работает сие по
принципу чистейшей вставки, а мне надо что-то типа naSwap (чтобы не
вставлялось, а происходила замена содержимого приёмника на сод. источника,
при этом сам источник должен получить значение приёмника, которое было у
последнего до замены). Во как запутано вышло... Короче надо махнуть два
itema местами. Проблема в том, что перепахав кучу методов и свойств
TTreeView и TTreeNode я до сих пор не нашёл ничего подходящего для
операции замены. Попадается только типа: "добавь в конец", "добавь в
начало", "вставь". Попытки извратиться, (т.е. применить обычную вставку, а
потом перетасовать пару ветвей, чтобы добится нужного), пока не получили
успеха.
Может тут какая-нибудь WinApi функция нужна? Кто может помочь?


Spawn   (2003-06-20 06:18:00) [2]

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var
TargetNode, SourceNode: TTreeNode;
begin
TargetNode := TreeView1.GetNodeAt (X, Y);
// accept dragging from itself
if (Source = Sender) and (TargetNode <> nil) then
begin
Accept := True;
// determines source and target
SourceNode := TreeView1.Selected;
// look up the target parent chain
while (TargetNode.Parent <> nil) and
(TargetNode <> SourceNode) do
TargetNode := TargetNode.Parent;
// if source is found
if TargetNode = SourceNode then
// do not allow dragging over a child
Accept := False;
end
else
Accept := False;
end;



procedure TForm1.TreeView1DragDrop(Sender, Source: TObject;
X, Y: Integer);
var
TargetNode, SourceNode: TTreeNode;
begin
TargetNode := TreeView1.GetNodeAt (X, Y);
if TargetNode <> nil then
begin
SourceNode := TreeView1.Selected;
SourceNode.MoveTo (TargetNode, naAddChildFirst);
TargetNode.Expand (False);
TreeView1.Selected := TargetNode;
end;
end;


SH   (2003-06-19 13:35:00) [3]

>>Есть примерчик))...
Ещё спрашиваешь! Конечно надо, давай показывай - посмотрю, что за зверь такой. Только небольшая просьба: снабди сие комментариями на русском языке, можно личного производства :-)


ZEE   (2003-06-17 17:54:00) [4]

Я перемещаю так:
var node:TTreeNode;
...
//вверх
node:=TreeView1.Selected.GetPrevSibling;
if node<>nil then TreeView1.Selected.MoveTo(node,nainsert);
//вниз меняем GetPrevSibling на GetNextSibling


Spawn   (2003-06-16 20:45:00) [5]

Есть примерчик)) Из книжечки Марко Кенту. Нада?


SH   (2003-06-16 16:22:00) [6]

Большой очень этот MSDN, заблудился я... Нашёл что-то про DragDropEnabled Property, но на поверку сие оказалось абсолютно левым. Если не трудно, киньте прямой линк или конкреиный совет.


MBo   (2003-06-03 19:02:00) [7]

А что не нравится?


SH   (2003-06-03 18:49:00) [8]

А ещё предложения есть?


DVM   (2003-06-03 17:16:00) [9]

Если на API то на MSDN есть пример как раз того что надо. Только на C. Но там все просто.


MBo   (2003-06-03 17:12:00) [10]

на API?


Наверх

Титульная страница Поиск, карта сайта Написать письмо