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