AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi TTreeView-Node-Bäume schnell anlegen
Thema durchsuchen
Ansicht
Themen-Optionen

TTreeView-Node-Bäume schnell anlegen

Ein Thema von d3g · begonnen am 21. Jun 2002
Antwort Antwort
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#1

TTreeView-Node-Bäume schnell anlegen

  Alt 21. Jun 2002, 16:59
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]
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz