Danke für den Hinweis auf Ken Henderson. Ich muss gestehen, ich habe nicht alles davon verstanden, so dass ich erstmal mit den Daten wie sie vor mir liegen arbeiten will.
Der fertige TreeView liegt mir vor, bevor ich den Report erstelle. Jetzt muss ich nur noch die Knoten durchwandern und dabei entweder in ein Hilfsfeld der Ursprungstabelle oder noch einfacher in eine temporäre MemoryTabelle schreiben. Auf eine der beiden Varianten kann sich dann der Report beziehen und das TreeView Satz für Satz aufbauen.
Ein TreeView kann beliebig viele Ebene haben und sieht zB so aus:
Code: Alles auswählen
0
0.1
0.1.2
0.1.2.3
0.1.2.3.4
0.1.2.5
0.1.2.6
0.1.2.7
0.1.2.8
0.1.9
0.1.10
0.11
0.11.12
0.11.13
0.11.14
0.15
0.16
0.17
Folgende Voraussetzungen:
- In der Praxis wird ein TreeView genau eine Wurzel haben und mind. ein Kind haben.
- Jeder Knoten kennt das Hilfsfeld: Reihenfolge (Integer, default=0)
- Jeder Knoten kennt das Hilfsfeld: AlleKinderBesucht (boolean, default=false)
Mein Code sieht so aus:
Code: Alles auswählen
procedure TForm1.btnCreateReport(Sender: TObject);
procedure NumberNode(Node: TTreeNode; i: Integer);
begin
while Node.HasChildren And (TTeile(Node.Data).AlleKinderBesucht <> true) do
begin
TTeile(Node.Data).Reihenfolge:=i;
inc(i);
NumberNode(Node.GetFirstChild, i);
end;
while (Node.GetNextSibling <> nil) do
begin
If TTeile(Node.Data).AlleKinderBesucht <> true Then
begin
TTeile(Node.Data).Reihenfolge:=i;
inc(i);
end;
NumberNode( Node.GetNextSibling, i);
end;
SchreibeNode(Node, i);
If Node.HasChildren <> true Then
TTeile(Node.Data).AlleKinderBesucht := true;
inc(i);
If (Node.Parent.AbsoluteIndex = TreeView2.Items.GetFirstNode.AbsoluteIndex) then
exit
else
begin
TTeile(Node.Parent.Data).AlleKinderBesucht := true;
NumberNode(Node.Parent, i);
end;
end;
begin
If TreeView2.Items.GetFirstNode <> nil then NumberNode( TreeView2.Items.GetFirstNode, 1);
end;
Das obige Beispiel eines Treeviews ist real und führt im Code dazu, dass die ersten 15 Knoten richtig gesetzt werden, dann aber eine Endlosschleife zwischen den beiden letzten Knoten 0.16 und 0.17 aufläuft.
Was mache ich falsch?
Gruß,
Peter