Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Вниз

Drag&Drop and TTreeView   Найти похожие ветки 

 
SH   (2003-06-03 16:56) [0]

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


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

на API?


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

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


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

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


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

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


 
SH   (2003-06-16 16:22) [5]

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


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

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


 
ZEE   (2003-06-17 17:54) [7]

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



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

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


 
Spawn   (2003-06-20 06:18) [9]

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-24 18:46) [10]

> 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 TarNode<>nil then
SelNode.MoveTo(TarNode,naInsert);
end;
-------

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.07 c
7-81984
Alex-kosmonavt
2003-06-04 15:52
2003.08.25
Запись в реестр


14-81965
Gogerman
2003-08-06 16:49
2003.08.25
Нужно получить разницу переменных типа TDateTime в часах.


3-81543
stud
2003-07-30 16:29
2003.08.25
sql - запрос


4-82015
Inch
2003-06-20 23:04
2003.08.25
TMemoryStream WinApi


14-81955
NetKnight
2003-08-06 12:43
2003.08.25
Написание FireWall





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский