Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сформировать иерархию


Scott Storch ©   (2011-03-12 13:26:00) 

есть строки список строк вида:

A \ B \ C
A \ A
B \ B

нужно сформировать иерархию. Должно получится так

A|
|
--B
|
--A
B|
|
--B

как организовать алгоритм, можете на словах объяснить, а то запутался совсем


sniknik   (2011-03-12 15:35:00) [1]

procedure TForm1.Button1Click(Sender: TObject);
var
 sList: TStringList;
 i: integer;

 function FindNode(inNode: TTreeNode; const val: string): TTreeNode;
 begin
   if Assigned(inNode)
     then result:= inNode.getFirstChild
     else result:= TreeView1.Items.GetFirstNode;

   while Assigned(result) do begin
     if result.Text = val then Exit;
     result:= result.getNextSibling;
   end;
 end;

 procedure AddLineChild(Parent: TTreeNode; const st: string);
 var
   n: integer;
   sVal: string;
   Node: TTreeNode;
 begin
   n:= Pos(' \', st);
   if n = 0 then begin
     TreeView1.Items.AddChild(Parent, st);
     Exit;
   end;

   sVal:= Copy(st, 1, n - 1);
   Node:= FindNode(Parent, sVal);
   if Assigned(Node)
     then AddLineChild(Node, Copy(st, n + 3, MaxInt))
     else AddLineChild(TreeView1.Items.AddChild(Parent, sVal), Copy(st, n + 3, MaxInt));
 end;

begin
 sList:= TStringList.Create;
 try
   sList.Text:= 'A \ B \ C'#13#10+
                'A \ A'#13#10+
                'B \ B';

   TreeView1.Items.BeginUpdate;
   try
     TreeView1.Items.Clear;

     for i:= 0 to sList.Count - 1 do
       AddLineChild(nil, sList.Strings[i]);
   finally
     TreeView1.Items.EndUpdate;
   end;
 finally
   sList.Free;
 end;
end;


clickmaker   (2011-03-12 14:19:00) [2]

цикл 1
 разбиваешь каждую строку на массив
 node := nil
 цикл 2
   node := CreateNode(node, элемент массива)
 конец цикла 2
конец цикла 1

в CreateNode проверяешь (когда node = nil), если нод с уровнем 0 и таким заголовком есть, то просто возвращаешь его, иначе создаешь новый


Scott Storch   (2011-03-12 13:36:00) [3]


> а где C?


забыл дописать, должно быть так

A|
 |
 --B|
     |
     --C    
 |
 --A
B|
 |
 --B


clickmaker   (2011-03-12 13:32:00) [4]

а где C?


Наверх

Титульная страница Поиск, карта сайта Написать письмо