Du solltest deine Daten in ein Tree-Struktur laden und von da aus die Visualisierung machen.
Das wäre eine solche:
Delphi-Quellcode:
type
TNode<T> = class
private
FChildren: TObjectList<TNode<T>>;
FValue: T;
public
constructor Create(const AValue: T);
destructor Destroy; override;
property Value: T read FValue;
property Children: TObjectList < TNode < T >> read FChildren;
end;
{ TNode<T> }
destructor TNode<T>.Destroy;
begin
FChildren.Free;
inherited;
end;
constructor TNode<T>.Create(const AValue: T);
begin
inherited Create;
FValue := AValue;
FChildren := TObjectList < TNode < T >>.Create();
end;
So könntest du deine Daten da hinein laden
Delphi-Quellcode:
procedure ReadData(const AData: TArray<string>; const ANode: TNode<string>; ALevel: Integer; var ACurrentLine: Integer);
var
lRow: string;
lParts: TArray<string>;
lLevel: Integer;
lNode: TNode<string>;
begin
while ACurrentLine < Length(AData) do
begin
lRow := AData[ACurrentLine];
if not string.IsNullOrEmpty(lRow) then
begin
lParts := lRow.Split(['|']);
lLevel := lParts[0].CountChar('-');
if ALevel < lLevel then
ReadData(AData, lNode, ALevel + 1, ACurrentLine)
else if ALevel > lLevel then
break
else
begin
lNode := TNode<string>.Create(lParts[1]);
ANode.Children.Add(lNode);
Inc(ACurrentLine);
end;
end
else
Inc(ACurrentLine);
end;
end;
Hier eine rekursive
procedure
um den Baum auszugeben
Delphi-Quellcode:
procedure PrintNode(const ANode: TNode<string>; ALevel: Integer = 0);
var
lChild: TNode<string>;
begin
Writeln(string.Create('*', ALevel), ANode.Value);
for lChild in ANode.Children do
begin
PrintNode(lChild, ALevel + 1);
end;
end;
und hier ein kleines Konsolen-Demo
Delphi-Quellcode:
procedure Main;
var
lData: TArray<string>;
lNode: TNode<string>;
lLine: Integer;
begin
lData := TArray<string>.Create( //
'HEADER|Gruppe1', //
'-|Subitem1', //
'--|Subitem2', //
'HEADER|Gruppe2', //
'-|Gruppe3', //
'--|Subitem1');
lNode := TNode<string>.Create('root');
lLine := 0;
ReadData(lData, lNode, 0, lLine);
PrintNode(lNode);
end;
Die Ausgabe ist dann
Code:
root
*Gruppe1
**Subitem1
***Subitem2
*Gruppe2
**Gruppe3
***Subitem1