TTreeView-Node-Bäume schnell anlegen
Das Prinzip dieses Codes ist es, einen String in verschiedene Teile zu zerlegen und den als Baum in ein TTreeView einzufügen. Der String 'Parent|Child|ChildOfChild' führt zu einem Baum Parent -> Child -> ChildOfChild, wenn man als Separator '|' nimmt.
Dies wird realisiert, indem man den zerteilen String von vorne bis hinten durchgeht und überprüft, ob ein Element mit dem gesuchten Namen schon existiert. Wenn ja, wird dieses als Parent für den Node mit dem Namen des nächsten Teil des Strings genommen, wenn nicht wird der Node erst erstellt und dann als Parent genommen. So läuft man dann in einer Schleife einfach durch.
Delphi-Quellcode:
procedure ForceNodes(aTreeView: tTreeView; s: String; aSeparator: Char);
type
tStrArray = array of String;
// Split splits a string into a tStrArray, separator is aSeparator
function Split(s: String; aSeparator: Char): tStrArray;
var
c: Integer;
begin
repeat
SetLength(Result, Length(Result) + 1);
c := Pos(aSeparator, s);
if (c = 0) then
c := Length(s) + 1;
Result[Length(Result) - 1] := Copy(s, 1, c - 1);
Delete(s, 1, c);
until (Length(s) = 0);
end;
// ChildExists checks if a child of a specific tree node exists with a certian title.
// the function returns the tree node if it is successful, if not, it returns nil.
function ChildExists(aTreeNode: tTreeNode; aTitle: String): TTreeNode;
var
i: Integer;
begin
Result := nil;
for i := 0 to aTreeNode.Count - 1 do
if (aTreeNode.Item[i].Text = aTitle) then begin
Result := aTreeNode.Item[i];
Exit;
end;
end;
var
aArr: tStrArray;
aNode: tTreeNode;
i: Integer;
begin
aArr := Split(s, aSeparator);
aNode := nil;
for i := 0 to aTreeView.Items.Count - 1 do
// check if a node with the first node name in the array already exists
if (aTreeView.Items.Item[i].Text = aArr[0]) then begin
aNode := aTreeView.Items.Item[i];
Break;
end;
// if no node with this name found, add one with this name
if (aNode = nil) then
aNode := aTreeView.Items.Add(nil, aArr[0]);
// run through all the other names and create, if needed, new nodes.
// take the created node or, if a node with the forced name already exists,
// the existing node as parent for the next node.
for i := Low(aArr) + 1 to High(aArr) do
if (ChildExists(aNode, aArr[i]) = nil) then
// node exists, take existing node as parent for next one
aNode := aTreeView.Items.AddChild(aNode, aArr[i]);
end else
// node doesn't exist, create a new one and take it as parent for the next one
aNode := ChildExists(aNode, aArr[i]);
end;
Will man auf Elemente, die auf diese Weise erstellt wurden, zugreifen, muss man den Verzeichnisbaum durchlaufen. Ein eindeutiger Identifier für solche Items ist die Eigenschaft TTreeNode.Handle, an ihm kann man die Items erkennen.
MfG,
d3g
[edit=flomei]Wir "räumen auf", daher Titel geändert... Mfg, flomei[/edit]