Построение визуального дерева (TreeView)
Есть список следующего содержания
Пост
Пост.Кладовая
Пост.Склад
Пост.Столовая
Пост.Столовая.Посудомоечная
Офис
Офис.Администраиция
Как этот список вывести в treeview? В смысле чтобы было
Пост
|-Кладовая
|-Склад
|-Столовая
|-Столовая
|-Посудомоечная
Офис
|-Администраиция
type
...
tvNodes: TTreeView;
procedure AddNode(tv: TTreeView; nt: string; pn: TTreeNode);
var
nn: TTreeNode;
begin
nn := tv.Items.AddChild(pn, nt);
end;
procedure BuildTree(tv: TTreeView; sl: TStringList);
var
i: integer;
curnod: TTreeNode;
chunks: TStringList;
parentNode: TTreeNode;
level: integer;
begin
tv.Items.BeginUpdate;
try
parentNode := nil;
chunks := TStringList.Create;
try
for i := 0 to sl.Count - 1 do
begin
chunks.Delimiter := '.';
chunks.StrictDelimiter := True;
chunks.DelimitedText := sl[i];
curnod := tv.Items.GetFirstNode;
level := 0;
while (curnod <> nil) and (level < chunks.Count) do
begin
if curnod.Text = chunks[level] then
begin
parentNode := curnod;
curnod := curnod.GetFirstChild;
Inc(level);
end
else
curnod := curnod.GetNextSibling;
end;
while level < chunks.Count do
begin
parentNode := tv.Items.AddChild(parentNode, chunks[level]);
Inc(level);
end;
end;
finally
chunks.Free;
end;
finally
tv.Items.EndUpdate;
end;
end;
procedure TForm1.OnCreate(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Duplicates := dupIgnore;
sl.Add('Пост');
sl.Add('Пост.Кладовая');
sl.Add('Пост.Склад');
sl.Add('Пост.Столовая');
sl.Add('Пост.Столовая.Посудомоечная');
sl.Add('Офис');
sl.Add('Офис.Администрация');
BuildTree(tvNodes, sl);
finally
sl.Free;
end;
end;
У меня "офис" оказывается вложен в "посудомоечная". Вложенность может варьироваться:
Комната
Комната.Уборная
Комната.Уборная.Ванна1
Комната.Уборная.Ванна1.Ответвление
Комната.Уборная.Ванна2
Комната.Уборная.Ванна2.Ответвление
Комната.Уборная.Ванна2.Ответвление.Левое
Комната.Уборная.Ванна2.Ответвление.Правое
и т.д. Подскажите кодом, так как в коде легче разобраться, чем вычитывать между строк.
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Нужно переместить
parentNode := nil;
внутрь цикла for, иначе новая серия стартует с последнего записанного узла
Было:
try
parentNode := nil;
chunks := TStringList.Create;
try
for i := 0 to sl.Count - 1 do
begin
chunks.Delimiter := '.';
Надо:
try
chunks := TStringList.Create;
try
for i := 0 to sl.Count - 1 do
begin
parentNode := nil;
chunks.Delimiter := '.';