![]() |
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:
Ordnersymbol zuweisen funktioniert.
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; Dann erhalte ich eine Fehlermeldung. |
AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
Was für eine Fehlermeldung,
in welcher Zeile und was meint dein Debugger dazu? |
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; |
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:
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:
PS: Du hast es auch an anderer Stelle einmal richtig gemacht. :wink: [add]
Delphi-Quellcode:
und dann noch ein tipp bezüglich doppelter/mehrfacher Codes ... sowas läßt sich oftmals ganz gut wegoptimieren,
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; womit der code kürzer und manchmal sogar übersichtlicher wird :zwinker:
Delphi-Quellcode:
PS: Codes wurden nicht getestet, aber ich hoff mal die funktionieren dennoch :stupid:
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; |
AW: Verzeichnis in Treeview einlesen und Symbole aus Systemimagelist
Danke schön. Hat sehr gut funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 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-2025 by Thomas Breitkreuz