![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Коллеги, приветствую. Теперь я прошу помощи.
Song © (2002-04-01 21:12:00)Не получается копирнуть ветвь со всеми внутренними подветвями из одного дерева в другое дерево. Использую рекурсию:
Function CopyItems(ItemDest,ItemSource:TTreeNode):Boolean;
Var n,m:Integer;
TempItem:TTreeNode;
Begin
try
Result:=True;
n:=ItemSource.Count;
m:=0;
While m<n Do
Begin
TempItem:=TTreeView(ItemDest.TreeView).Items.AddChild(TempItem,"");
TempItem.Assign(ItemSource.Item[m]);
CopyItems(TempItem,ItemSource.Item[m]);
Inc(m);
End;
except
Result:=False;
end;
End;
Вызываю функцию так: (Root1 - корневая ветвь)
Node:=Items[t];
Repeat
try
IF not CopyItems(Root1,Node) then Break;
Node:=Node.GetNextSibling;
except
Break;
end;
Until False;
Перебровал многое. Кое-что получается, но наживаю другие проблемы. Вообщем не работают две вещи:
1) Не добавляются пустые ветви (без детей) - Level1
2) Не добавляются промежуточные ветви: - Level2,Level11
например
Level1
Level11
-Level2
-Level3
-node1
-node2
-node3
Level3, её подветви (node1,2,3) добавляются без проблем. Пробовал исправить чтобы добавлялась Level1 и 11 но нажил другие проблемы.
Вообщем я буду пытаться, но заранее благодарю всех кто вникнет в судь проблемы и поможет разобраться.
Набережных С. (2002-04-02 16:42:00) [1]
> Song © (02.04.02 07:05)
Ну при чем здесь это? Никто тут ничего нового не изобретет, все давно придумано. Я о том что нужно вникать в код, а не просто бездумно копировать, а потом заявлять, что код нерабочий.
Song (2002-04-02 08:16:00) [2]Спасибо MBo © огромное!
Всё работает чудно.
С меня 2 бутылки пива, если употребляете. :)))
MBo (2002-04-02 07:43:00) [3]Я к тому, что если возможно применение процедуры в рамках одного
Treeview, надо отслеживать и запрещать копирование ветки в ее подузел (беск. рекурсия)
Song (2002-04-02 07:05:00) [4]2Набережных С. (01.04.02 22:20)
Я и не утверждал, что это мой код. Мог написать сам да и намеревался сделать, если не получится.
2MBo © (01.04.02 22:58)
Да, всегда разные. Спасибо, я попробую сегодня.
MBo (2002-04-01 22:58:00) [5]Деревья всегда разные?
так работает
procedure CopyItems(ItemDest,ItemSource:TTreeNode);
Var i,j:Integer;
TempItem,TempItem2:TTreeNode;
Begin
TempItem:=TTreeView(ItemDest.TreeView).Items.AddChild(ItemDest,"");
TempItem.Assign(ItemSource);
for i:=0 to ItemSource.Count-1 do begin
TempItem2:=TTreeView(ItemDest.TreeView).Items.AddChild(TempItem,"");
TempItem2.Assign(ItemSource.Item[i]);
for j:=0 to ItemSource.Item[i].count-1 do
CopyItems(TempItem2,ItemSource.Item[i].item[j]);
End;
End;
Набережных С. (2002-04-01 22:20:00) [6]Вообще-то эта процедура(которая у тебя - функция) писалась для копирования дочерних итемов одного узла в другой уже существующий узел. Понимаешь? Она копирует дочернии узлы ItemSource, но не сам элемент ItemSource.
Нельзя же так бездумно копировать!
Song (2002-04-01 21:14:00) [7]Очепятка:
TempItem:=TTreeView(ItemDest.TreeView).Items.AddChild(TempItem,"") на самом деле у меня
TempItem:=TTreeView(ItemDest.TreeView).Items.AddChild(ItemSource,"");
Это просто уже последствия борьбы с проблемой :))