Hallo Gestock,
Um den richtigen Knoten anzuhängen, muss zuvor der Elternknoten gefunden werden.
Also ich mache das so (ist mit Sicherheit nicht für Tausende Knoten geeignet):
Delphi-Quellcode:
{-------------------------------------------------------------------------------
function: TVNodeInsert(); overload;
ltz.Aendr.: 19.04.2007
Parameter: Nod: TTreeNodes // TTreeView.Items - Liste
var NeueNode: TTreeNode // Neuer Knoten zurückgeben
const strElternKnoten: String // ElternKnoten
const strKnoten: String // Knoten der am ElternKnoten kommt
Rueckgabe: TRUE= Knoten eingetragen FALSE= Knoten nicht eingetragen
Beschr.: Mit dieser Funktion wird ein neuer Knoten an die richtige Stelle
im TTreeView eingetragen. Bei dieser Funktion muss mindestens 1
Knoten schon vorhanden sein. Es wird die Stelle in TTreeView ge-
sucht die mit der Elternknoten übereinstimmt und der neue Knoten,
wenn er noch nicht vorhanden ist angehängt.
Aufruf: TVNodeInsert(MS_TV.Items, Ebene2, 'Meßstellen', 'EO-Tank');
-------------------------------------------------------------------------------}
function TVNodeInsert (Nod: TTreeNodes; var NeueNode: TTreeNode;
const strElternKnoten: String;
const strKnoten: String): boolean; overload;
var
TempNode: TTreeNode;
begin
result:= FALSE; // Es ist kein Knoten im Baum eingetragen worden
TempNode:= Nod.GetFirstNode; // Hier wird der Root-Knoten in sNode gespeichert
while TempNode <> NIL do // Solange wiederholen, bis SNode = NIL ist
begin
If (CompareText(TempNode.Text, StrElternKnoten)=0) then
begin
if NOT(IstDoppelt(Nod, strKnoten)) then // Ist der Knoten nicht vorhanden
begin
NeueNode:= Nod.AddChild(TempNode,StrKnoten); // Neuer Knoten eintragen
Result:= TRUE; // Es ist ein Knoten eingetragen
end;
end;
TempNode:= TempNode.getNext; // Nächster Knoten in sNode
end;
end;
Und die Funktion ist doppelt:
Delphi-Quellcode:
{-------------------------------------------------------------------------------
function: IstDoppelt()
ltz.Ändr.: 18.04.2007
Syntax: function IstDoppelt (Nodes: TTreeNodes; const S: String): boolean;
Parameter: Nodes ist TreeView.Items, also eine Liste von Baumknoten
S ist ein String-Ausdruck
Rückgabe: FALSE= Eintrag ist noch nicht vorhanden und kann eingetragen werden.
TRUE= Eintrag ist vorhanden und soll nicht eingetragen werden.
Beschr.: Es werden alle Knoten geprüft,ob der neue Eintrag schon vorhanden ist
Aufruf: IstDoppelt(Nod, strKnoten);
-------------------------------------------------------------------------------}
function IstDoppelt(Nod: TTreeNodes; StrKnoten: String):boolean;
var
sNode: TTreeNode;
begin
Result:= FALSE; // Eintrag noch nicht vorhanden.
sNode:= nod.getFirstNode; // Auf den ersten Knoten setzen.
while sNode <> NIL do // Solange prüfen bis kein Eintrag
begin
If (CompareText(sNode.Text, StrKnoten)=0) then // Ist der Knoten schon
begin // vorhanden?
Result:= TRUE; // Eintrag vorhanden
end;
sNode:= sNode.GetNext; // nächster Knoten prüfen
end;
end;
Also grob gesagt die Funktion geht durch den Baum bis der Elternknoten gefunden worden ist, in dem Fall wird noch geprüft ob sie schon doppelt vorhanden ist, ist das nicht der Fall so wird der Kindknoten am Elternknoten gehängt.
Ich hoffe Du blickst da durch wie ich das meine.
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.