Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#4

AW: VirtualStringTree bringt mich zur Weißglut. Baum anhand von Datei erstellen

  Alt 10. Feb 2019, 14:33
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
  Mit Zitat antworten Zitat