{{notification.text}}

MirGames

Wadi161
07.08.09 17:25
0
Всем привет!!! У меня есть иерархия объектов. Есть главный, родительский объект у которого есть дочерние объекты и каждый дочерний объект может иметь свои дочерние объекты. :wacko: У меня получился такой код:
Код


Type
RMRoot=class
           Name:String;
           Root:TList;
           Constructor Create(Names:String);
           Procedure AddRoot(Name:String);
           Function GetName(i:Integer):String;
           Function GetCount:Integer;
          end;

Var
Tree:RMRoot;

//==========ResMen==============================
Procedure RMInit;
begin
Tree:= RMRoot.Create('Root');
Tree.Root:=Tlist.Create;
end;
//------------------ResMen------------------------------------------------------

//==================RMRoot======================
Constructor RMRoot.create(Names:String);
begin
Name:=Names;
end;

Procedure RMRoot.AddRoot(Name:String);
Begin
Root.Add(RMRoot.Create(Name));
end;

Function RMRoot.GetName(i:Integer):String;
begin
Result:=RMRoot(Root.Items[i]).Name;
end;

Function RMRoot.GetCount:Integer;
Begin
result:=Root.Count;
end;
//------------------RMRoot------------------------------------------------------

Вопрос: Как мне пройтись по всем элементам иерархии, и вывести их имена?
#1
07.08.09 18:00
0
Wadi161 такое слово как цикл вам известно?
Код

procedure OutPutNames(Root: RmRoot);
var cur: Integer;
begin
writeln('йа родителько', Root.Name);
cur:=0;
while true do begin
if cur < Root.List.Count then
OutPutNames(Root.List.GetValue(cur))
else
break;
inc(cur);
end;
end;

я уж не помнб как там в листе сделано, но чтото на подобие етого....
#2
Wadi161
07.08.09 19:48
0
Пытаюсь сделать так:
Код

procedure WriteTree(Tree: RmRoot);
Var j,i:integer;
Begin
inc(j);
Form1.Canvas.TextOut(10,10+j*14,Объект'_'+Tree.Name);
for i:=0 to Tree.GetCount-1 do
WriteTree(RmRoot(Tree.Root.Items[i]));
end;

Не чего не получается, при исполнении возникает ошибка и компилятор указывает на строчку где получаю количество элементов в списке.
lans Я знаю что такое цикл, просто не додумался использовать рекурсию :)
#3
Wadi161
08.08.09 02:33
0
lans большое спасибо вам за код! Разобрался. Ошибка была впри создании нового объекта, забыл создать список.
#4
08.08.09 02:34
0
Wadi161 незачто)))
#5
15.08.09 08:43
0
lans
Перебор всех элементов в списке (а на самом деле фактически в массиве) при помощи while true do - это сильно :)
#6
15.08.09 19:45
0
visual
ну блин мне так захотелось....)))тем более вроде тот же цикл фор это вариант цикла while)))на ассамблере любой цикл строить одиннаково)))
#7
Хранитель Флейма
15.08.09 22:01
0
Цитата(lans @ Сегодня, 15:45)
[snapback]97437[/snapback]
тем более вроде тот же цикл фор это вариант цикла while

Не правда!

Цикл while вычисляет условие на каждой итерации, а у цикла for - конечное значение счетчика вычисляется только один раз.
#8
17.08.09 02:19
0
Цитата(Said @ Вчера, 18:01)
[snapback]97445[/snapback]
условие на каждой итерации

т.е. после выполнения кадждой команды while проверяет усовие???тебе не кажется это бредом?)))
Отредактировано: 17.08.09 02:19
#9
17.08.09 02:35
0
lans
Не каждой команды, а каждой итерации. Итерация = тело цикла.
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}