Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi TreeView in Memo abbilden! (https://www.delphipraxis.net/128460-treeview-memo-abbilden.html)

cherry 30. Jan 2009 09:46


TreeView in Memo abbilden!
 
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]

shmia 30. Jan 2009 11:05

Re: TreeView in Memo abbilden!
 
Ersetze doch noch den Parameter Memo:TMemo durch Lines:TStrings.
Durch diese Verallgemeinerung kann man z.B. Folgendes tun:
Delphi-Quellcode:
var
  liste : TStrings;
begin
  liste := TStringList.Create;
  try
    ForceTreeToMemo(TreeView1, liste, 5);
    liste.SaveToFile(dateiname_treeview); // Speichern ohne Umweg über TMemo
  finally
    liste.Free;
  end;
end;
Wenn man ein TreeView in ein Memo abbilden möchte, dann wäre der Aufruf:
Delphi-Quellcode:
ForceTreeToMemo(TreeView1, Memo1.Lines, 3);


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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