Thema: Delphi Icons in Treeview

Einzelnen Beitrag anzeigen

Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Icons in Treeview

  Alt 13. Sep 2007, 14:08
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.
  Mit Zitat antworten Zitat