Показать сообщение отдельно
Старый 12.02.2010, 13:25   #40
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

если я правильно понял 3й пункт это некоторое подобие treeview.
памяти жрать будет немеряно..
писалось на коленке..

delphi Код:
Tnode=class   ParentNode : Tnode; //откуда пришли.   CHildNodes : tlist; //куда можем пойти   Prop1:string; //одно из свойств этой вершины.   constructor create(SetParent:Tnode);   destructor destroy; override; end; constructor tnode.create; begin   childnodes := tlist.create;   if ParentNode <> nil then     ParentNode.CHildNodes.add(self); //если есть парент - добавляем себя в список его чайлдов end; destructor tnode.destroy; begin   if ParentNode <> nil then     ParentNode.CHildNodes.remove(self)//убираем себя из списка чайлдов парента   while CHildNodes.count > 0 do     Tnode(childnodes.items[0]).destroy; //уничтожаем все дочерние узлы   childnodes.destroy; end;

использование (конечно же следует делать рекурсией)
delphi Код:
var   TopLevel, CurrentParent: tnode;   i : integer; begin   TopLevel := tnode.create(nil);   toplevel.prop1 := 'Верхний узел';   CurrentParent := tnode.create(toplevel);   CurrentParent.prop1 := 'Узел вложенный в верхний узел'   CurrentParent := tnode.create(toplevel);   CurrentParent.prop1 := 'Второй узел вложенный в верхний узел'   CurrentParent := tnode.create(toplevel);   CurrentParent.prop1 := 'Третий узел вложенный в верхний узел'   CurrentParent := tnode.create(CurrentParent);   CurrentParent.prop1 := 'Узел вложенный в третий узел вложенный в верхний узел';   while i < toplevel.childnodes do   begin     showmessage(Tnode(toplevel.childnodes.items[i]).Prop1); //показываем свойство всех дочерних узлов верхнего узла     inc(i);   end;   TopLevel.destroy; //разрушение топлевела и всех его дочерних уровней с их дочерними уровнями end;

сохранение и загрузку можно делать в tnode.create/tnode.destroy передавая туда скажем файлстим как параметр.
т.е. при создании нода он будет читать с файлстрима а при разрушении писать туда свои свойства и только тогда приступать к разрушению дочерних нодов.
кол-во дочерних узлов в каждом узле не должно превышать maxint (довольно большое значение)

Добавлено через 38 минут
проверил.
у меня макс кол-во вершин в графе составило 52022554. дальше - закончилась память выделяемая приложению ~2гб. сурсы проверялки прикрепил. -)

Добавлено через 13 минут
можно использовать LargeAddressAware (или 4гбпатч) чтобы на 64битных машинах вместо 2гб памяти выделялось 4. что увеличит в 2 раза кол-во овзможных нодов.
Вложения
Тип файла: rar test.rar (1.4 Кб, 21 просмотров)
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 12.02.2010 в 13:28. Причина: Добавлено сообщение
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от: