Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Icons in Treeview (https://www.delphipraxis.net/99367-icons-treeview.html)

Gehstock 11. Sep 2007 09:25

Datenbank: Access • Zugriff über: ADO

Icons in Treeview
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Procedure OpenDB;
var
i: integer;
node:Tnode;
tnodes:TTreenodes
begin
tnodes := frmmain.TreeView1.Items;
frmmain.ADOConnection1.GetTableNames(st,False);
//frmmain.TreeView1.Items.Clear;
for i:=0 to st.Count - 1 do begin
while frmmain.ADOQuery1.Active do
        frmmain.ADOQuery1.Close;
        frmmain.ADOQuery1.SQL.Text := 'select * from '+st.Strings[i];
        frmmain.ADOQuery1.Open;
        node := tnodes.Add(nil,st.Strings[i]+' ('+inttostr(frmmain.ADOQuery1.RecordCount)+')');
        SetNodeBoldState(node, True);
        node.ImageIndex:=0;
        node.StateIndex:=0;
        While Not frmmain.ADOQuery1.Eof do
         begin
          tnodes.AddChild(node, frmmain.ADOQuery1.FieldByName('Feld1').AsString);
          //node.ImageIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3'])+3;
          //node.StateIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3'])+3;
          frmmain.ADOQuery1.Next;
  end;
    end;
    st.Free;
end;

wie bekomme ich unterschiedliche Icons im Treeview und zwar in die Untereinträge so wie im Anhang (Markierung)

Zacherl 11. Sep 2007 09:27

Re: Icons in Treeview
 
Mach mal lieber Node := tnodes.AddChild(...) und dann entferne die Kommentare vor den 2 Zeilen.

Gehstock 12. Sep 2007 06:31

Re: Icons in Treeview
 
Klappt leider nicht

Chemiker 12. Sep 2007 07:09

Re: Icons in Treeview
 
Hallo Gestock,

für unterschiedliche Icons musst Du den Unterknoten einen Icon zuweisen.
Das ist jetzt nur ein Beispiel, aber vielleicht kann man erkennen was ich meine.

Delphi-Quellcode:
Var
   Unterknoten: TTreeNode;



UnterKnoten:= tnodes.AddChild(node,frmmain.ADOQuery1.FieldByName('Feld1').AsString);
Dann kann man den Unterknoten mit einem Icon belegen.

Delphi-Quellcode:
UnterKnoten.ImageIndex:=1;
Oder eine Bedingung schreiben:

Delphi-Quellcode:
If Darstellung= 'Fahrrad' then
  Unterknoten.ImageIndex:= 2;       //Fahrradbild
 Else
  Unterknoten.ImageIndex:= 3;       //Autobild
Bis bald Chemiker

Gehstock 13. Sep 2007 09:25

Re: Icons in Treeview
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Procedure OpenDB;
var
i: integer;
tnodes : TTreeNodes;
node : TTreeNode;
begin
tnodes := frmmain.TreeView1.Items;
frmmain.ADOConnection1.GetTableNames(st,False);
frmmain.TreeView1.Items.Clear;
for i:=0 to st.Count - 1 do
 begin
  while frmmain.ADOQuery1.Active do
        frmmain.ADOQuery1.Close;
        frmmain.ADOQuery1.SQL.Text := 'select * from '+st.Strings[i];
        frmmain.ADOQuery1.Open;
        node := tnodes.Add(nil,st.Strings[i]+' ('+inttostr(frmmain.ADOQuery1.RecordCount)+')');
        SetNodeBoldState(node, True);
        node.ImageIndex:=0;
        node.StateIndex:=0;
        While Not frmmain.ADOQuery1.Eof do
         begin
          node:= tnodes.AddChild(node, frmmain.ADOQuery1.FieldByName('Feld1').AsString);
          node.ImageIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3']);
          node.StateIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3']);
          frmmain.ADOQuery1.Next;
  end;
    end;
    st.Free;
end;
führt zu: siehe Bild irgendwas hab ich übersehen

Chemiker 13. Sep 2007 14:08

Re: Icons in Treeview
 
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

Gehstock 14. Sep 2007 09:23

Re: Icons in Treeview
 
war unterdessen selber draufgekommen
Delphi-Quellcode:

Procedure OpenDB;
var
i: integer;
tnodes : TTreeNodes;
node,Eintrag : TTreeNode;
begin
tnodes := frmmain.TreeView1.Items;
frmmain.ADOConnection1.GetTableNames(st,False);
frmmain.TreeView1.Items.Clear;
for i:=0 to st.Count - 1 do
begin
  while frmmain.ADOQuery1.Active do
        frmmain.ADOQuery1.Close;
        frmmain.ADOQuery1.SQL.Text := 'select * from '+st.Strings[i];
        frmmain.ADOQuery1.Open;
        node := tnodes.Add(nil,st.Strings[i]+' ('+inttostr(frmmain.ADOQuery1.RecordCount)+')');
        SetNodeBoldState(node, True);
        node.ImageIndex:=0;
        node.StateIndex:=0;
        While Not frmmain.ADOQuery1.Eof do
         begin
          Eintrag:= tnodes.AddChild(node, frmmain.ADOQuery1.FieldByName('Feld1').AsString);
          Eintrag.ImageIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3']);
          Eintrag.StateIndex:=StrtoInt(frmmain.ADOQuery1.FieldValues['Feld3']);
          frmmain.ADOQuery1.Next;
  end;
    end;
    st.Free;
end;
Danke Trotzdem


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz