Einzelnen Beitrag anzeigen

Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

TreeView in Memo abbilden!

  Alt 30. Jan 2009, 10:46
Die Funktion bildet eine ganze TTreeView in einem TMemo ab, oder nur die gewünschte Anzahl Ebenen.
Der Aufruf ist dementsprechend einfach:

Delphi-Quellcode:
// Stellt die ersten 3 Ebenen des TreeView1 in Memo1 dar.
ForceTreeToMemo(TreeView1, Memo1.Lines, 3);
Der Parameter "Layers" ist optional. Wird er nicht mitgegeben, oder -1 übergeben, dann
wird die gesamte TreeView mit sämtlichen Unterknoten dargestellt.

Delphi-Quellcode:
procedure TForm1.ForceTreeToList(Tree:TTreeView; Lines:TStrings; Layers:Integer=-1);
const
  // Verschiedene Zeichen für die Darstellung definieren
  strSpace1 : String = '| ';
  strSpace2 : String = ' + - ';
  strSpace3 : String = ' ';
  strSpace4 : String = ' - ';
procedure ForceChilds(fNode:TTreeNode; strSpace:String; fLayer:Integer);
var
  fChild:TTreeNode;
begin
  // Für jeden Knoten und dessen Unterknoten wird ein Eintrag in
  // die Liste geschrieben. Um dies rekursiv zu machen, ruft sich die
  // Funktion selber wieder auf wenn ein weiterer Knoten mit Unterknoten
  // gefunden wurde. Aber immer nur solange bis die Anzahl Layers erreicht
  // wurde.
  if (assigned(fNode)) and ((fLayer < Layers) or (Layers = -1)) then
  begin
    Inc(fLayer);
    if (fNode.HasChildren) then
    begin
      // Schreibt in die Liste mit dem entsprechenden "grafischen" prefix
      Lines.Add(strSpace + strSpace2 + fNode.Text);
      strSpace := strSpace + strSpace3;
      fChild:=fNode.getFirstChild;
      repeat
        ForceChilds(fChild,strSpace,fLayer);
        fChild:=fChild.getNextSibling;
      until not assigned(fChild);
    end
    else
      // Schreibt in die Liste mit dem entsprechenden "grafischen" prefix
      Lines.Add(strSpace + strSpace4 + fNode.Text);
  end;
end;
var
  Node: TTreeNode;
begin
  // Für die Hauptknoten wird jeweils die Funktion ForceChilds aufgerufen.
  with tree.Items do
  begin
    BeginUpdate;
    Node := GetFirstNode;
    while Assigned(node) do
    begin
      ForceChilds(Node,strSpace1,0);
      Node := Node.getNextSibling;
    end;
    EndUpdate;
  end;
end;
Viel Spass damit!

Liebe Grüsse #enemyleft

[EDIT]Habe den Funktionsparameter Memo in TStrings geändert. Danke shmia[/EDIT]
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat