если я правильно понял 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 раза кол-во овзможных нодов.