Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist (https://www.delphipraxis.net/160335-verzeichnis-treeview-einlesen-und-symbole-aus-systemimagelist.html)

verkouter 9. Mai 2011 07:19


Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
 
Ich lade bei Programmstart die Systemimagelist und weise sie dem
Treeview zu.Mit dieser Procedure lese ich das Verzeichnis ein.

Code:
Procedure FindFilesTree (aTree: tTreeView; aPath: String; aNode: tTreeNode; aWithFiles: Boolean);
Var
  SearchRec: tSearchRec;
  NodeTmp: tTreeNode;
  Info: pNodeInfo;
  fileinfo:Tshfileinfo;
Begin
  aTree.Items.BeginUpdate;

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  If aPath [Length (aPath)] <> '\' Then
    aPath := aPath + '\';

  If FindFirst (aPath + '*.*', faDirectory, SearchRec) = 0 Then
    Begin
      Repeat
        // Wenn es sich um ein Verzeichnis handelt
        If (SearchRec.Attr and faDirectory = faDirectory)
          and (SearchRec.Name[1] <> '.')
        Then
          Begin
            If (SearchRec.Attr and faDirectory > 0) then
              Begin
                New (Info);
                Info^.Path := True;
                Info^.Name := aPath + SearchRec.Name;

                // zum aktuellen Eintrag hinzufügen
                aNode := aTree.Items.AddChildObject (aNode, SearchRec.Name, Info);
                anode.ImageIndex:=1;
              End;

            // Eintrag merken
            NodeTmp := aNode.Parent;
            // auf Untereinträge prüfen
            FindFilesTree (aTree, aPath + SearchRec.Name, aNode, aWithFiles);
            // Eintrag wiederholen
            aNode := NodeTmp;
          End
        Else
          // Eintrag ist eine Datei
          If aWithFiles
            and (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
          Then
            Begin
              New (Info);
              Info^.Path := False;
              Info^.Name := aPath + SearchRec.Name;
                        SHGetFileInfo(PChar(aPath + SearchRec.Name), 0, FileInfo,
            SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
              aTree.Items.AddChildObject (aNode, SearchRec.Name, Info);
              anode.ImageIndex:=fileinfo.iIcon;
            End;

      // solange weiter bis keine wieteren Dateien/Verzeichniss gefunden werden
      Until FindNext (SearchRec) <> 0;

      FindClose (SearchRec);
    End;

  aTree.Items.EndUpdate;
End;
Ordnersymbol zuweisen funktioniert.
Dann erhalte ich eine Fehlermeldung.

himitsu 9. Mai 2011 07:27

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
 
Was für eine Fehlermeldung,
in welcher Zeile
und was meint dein Debugger dazu?

verkouter 9. Mai 2011 09:19

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
 
Als Fehlermeldung bekomme ich
'Zugriffsverletzung bei Adresse 0047FBE0 in Modul 'CDFinder.exe'. Lesen von Adresse 00000024'

In der Zeile
anode.ImageIndex:=fileinfo.iIcon;

himitsu 9. Mai 2011 09:40

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
 
Dann ist ANODE an der Stelle ganz bestimmt NIL, bzw. irgendwer hat wohl vergessen diesem etwas zuzuweisen.
Das passiert z.b. wenn der Prozedur an diesewr Stelle ein Nil zugewiesen und als erstes eine Datei gefunden wird.

Aber ich vermute mal du wolltest nicht den ImagIndex von aNode ändern, sondern von dem node, welcher über aTree.Items.AddChildObject erstellt wurde.

Zitat:

Delphi-Quellcode:
// Eintrag merken
NodeTmp := aNode.Parent;
// auf Untereinträge prüfen
FindFilesTree (aTree, aPath + SearchRec.Name, aNode, aWithFiles);
// Eintrag wiederholen
aNode := NodeTmp;

hier stimmt aber auch etwas nicht.
aNode kann nicht verändert werden, da es nicht ala Var-Parameter übergeben wird, weswegen man es sich nicht merken müßte
und dann merkst du dir den wert von aNode.Parent, setzt aber danach den Wert von aNode.


Zitat:

Delphi-Quellcode:
SearchRec.Name[1] <> '.'

ist falsch, denn Dateien und verzeichnisse dürfen mit einem Punkt anfangen.
PS: Du hast es auch an anderer Stelle einmal richtig gemacht. :wink:


[add]
Delphi-Quellcode:
Procedure FindFilesTree(aTree: TTreeView; aPath: String; aNode: TTreeNode; aWithFiles: Boolean);
Var
  SearchRec: TSearchRec;
  NodeTmp: TTreeNode;
  Info: PNodeInfo;
  FileInfo: TShFileInfo;
Begin
  aTree.Items.BeginUpdate;

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  aPath := IncludeTrailingBackslash(aPath);

  If FindFirst(aPath + '*.*', faDirectory, SearchRec) = 0 Then
    Begin
      Repeat
        If (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          Begin
            // Wenn es sich um ein Verzeichnis handelt
            If SearchRec.Attr and faDirectory <> 0 Then
              Begin
                New(Info);
                Info^.Path := True;
                Info^.Name := aPath + SearchRec.Name;

                // zum aktuellen Eintrag hinzufügen
                NodeTmp := aTree.Items.AddChildObject(aNode, SearchRec.Name, Info);
                NodeTmp.ImageIndex := 1;

                // auf Untereinträge prüfen
                FindFilesTree(aTree, aPath + SearchRec.Name, NodeTmp, aWithFiles);
              End
            // Eintrag ist eine Datei
            Else
              Begin
                New(Info);
                Info^.Path := False;
                Info^.Name := aPath + SearchRec.Name;
                NodeTmp := aTree.Items.AddChildObject(aNode, SearchRec.Name, Info);
                SHGetFileInfo(PChar(aPath + SearchRec.Name), 0, FileInfo,
                  SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
                NodeTmp.ImageIndex := FileInfo.iIcon;
              End;
          End;
      // solange weiter bis keine wieteren Dateien/Verzeichniss gefunden werden
      Until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    End;
  aTree.Items.EndUpdate;
End;
und dann noch ein tipp bezüglich doppelter/mehrfacher Codes ... sowas läßt sich oftmals ganz gut wegoptimieren,
womit der code kürzer und manchmal sogar übersichtlicher wird :zwinker:
Delphi-Quellcode:
Procedure FindFilesTree(aTree: TTreeView; aPath: String; aNode: TTreeNode; aWithFiles: Boolean);
Var
  SearchRec: TSearchRec;
  NodeTmp: TTreeNode;
  Info: PNodeInfo;
  FileInfo: TShFileInfo;
Begin
  aTree.Items.BeginUpdate;

  // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen
  aPath := IncludeTrailingBackslash(aPath);

  If FindFirst(aPath + '*.*', faDirectory, SearchRec) = 0 Then
    Begin
      Repeat
        If (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          Begin
            New(Info);
            Info^.Path := SearchRec.Attr and faDirectory <> 0;
            Info^.Name := aPath + SearchRec.Name;
            NodeTmp := aTree.Items.AddChildObject(aNode, SearchRec.Name, Info);
            If Info^.Path Then
              Begin
                NodeTmp.ImageIndex := 1;
                FindFilesTree(aTree, aPath + SearchRec.Name, NodeTmp, aWithFiles);
              End
            Else
              Begin
                SHGetFileInfo(PChar(aPath + SearchRec.Name), 0, FileInfo,
                  SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
                NodeTmp.ImageIndex := FileInfo.iIcon;
              End;
          End;
      Until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    End;
  aTree.Items.EndUpdate;
End;
PS: Codes wurden nicht getestet, aber ich hoff mal die funktionieren dennoch :stupid:

verkouter 9. Mai 2011 11:24

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
 
Danke schön. Hat sehr gut funktioniert.


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