AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
Thema durchsuchen
Ansicht
Themen-Optionen

Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

Ein Thema von verkouter · begonnen am 9. Mai 2011 · letzter Beitrag vom 9. Mai 2011
Antwort Antwort
verkouter

Registriert seit: 29. Dez 2004
64 Beiträge
 
Delphi 2010 Architect
 
#1

Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

  Alt 9. Mai 2011, 08:19
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.

Geändert von verkouter ( 9. Mai 2011 um 08:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

  Alt 9. Mai 2011, 08:27
Was für eine Fehlermeldung,
in welcher Zeile
und was meint dein Debugger dazu?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
verkouter

Registriert seit: 29. Dez 2004
64 Beiträge
 
Delphi 2010 Architect
 
#3

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

  Alt 9. Mai 2011, 10:19
Als Fehlermeldung bekomme ich
'Zugriffsverletzung bei Adresse 0047FBE0 in Modul 'CDFinder.exe'. Lesen von Adresse 00000024'

In der Zeile
anode.ImageIndex:=fileinfo.iIcon;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

  Alt 9. Mai 2011, 10:40
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:
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.


[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
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Mai 2011 um 12:44 Uhr)
  Mit Zitat antworten Zitat
verkouter

Registriert seit: 29. Dez 2004
64 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist

  Alt 9. Mai 2011, 12:24
Danke schön. Hat sehr gut funktioniert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:12 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