![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сформировать иерархию
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?