Hallo, Delphi- Freunde, wer kann helfen ?
Ich habe eine Listbox, die ein gewähltes Verzeichnis listen soll. Tut sie auch. Beim Create der Form wird die Funktion Verzeichnis_Links_Einlesen() aufgerufen.
Diese dreht mit repeat eine Runde alle Unterverzeichnisse listen, dann noch eine repeat- Runde Dateien listen.
In der Listbox kommen dann auch erst alle Ordner, darunter alle Dateien, wie's sein soll.
...Nur nicht alphabetisch. Klar- wie auch..
Wenn ich nun aber nach den "Einlese- Runden" mit der Eigenschaft sortType
Main.MainForm.ListView_Links.sortType := stText ;
einsetze, habe ich danach Ordner UND Dateien zwar alphabetisch sortiert im ListView... aber Ordner und Dateien durcheinander. Sogar schon, wenn ich die Zeile gleich nach der "Verzeichnis- Runde" einsetze, und nach der Dateien- Runde nicht.
Hat jemand eine Idee, warum das ListView das so macht, und wie ich das korrekt hinkriege ?
Vielen Dank im Voraus !
edi
Hier die Funktionen dazu. (Das Listobjekt- Array speichert den vollen Pfad zu Verzeichnis/ Datei für andere Aufgaben)
Delphi-Quellcode:
procedure Verzeichnis_Links_Einlesen(DIR:string); //
VAR //
SR: TSearchRec; //
INDEX: Integer ; //
DriveNumber: Integer ; //
ErrorMode: word; //
//
Begin //
INDEX := 0 ; //
{************** 1. Durchgang: Verzeichnisse ***************} //
{Neues Datenobjekt erzeugen} //
ListObjekt_Links := TListObjekt.Create ; //
{Übergebenes Verzeichnis existent ?...} //
If DirectoryExists(DIR) then //
Begin ; //
if DIR[length(DIR)]<>'\' then //
DIR:=DIR+'\'; //
with MainForm do begin //
if FindFirst(DIR+'*.*',faAnyFile,SR) = 0 then Begin //
repeat //
{Nur Verzeichnisse zulassen} //
if ( //
(SR.Attr and FaDirectory = FaDirectory) and //
(SR.Name <> '.') and //
(SR.Name <> '..') //
) then //
Begin //
{Datenzuweisung an ListView} //
PFAD_LI := Uppercase(DIR) + SR.Name ; //
ListView_Links_Items_Add( //
PFAD_LI, //
'Dir', //
FormatDateTime ('dd.mm.yyyy',FileDateToDateTime(SR.time)), //
Fileops.GetAttribut(SR.attr) //
); //
//
{Datenzuweisung an Array im Datenobjekt} //
ListObjekt_Links.Set_PFAD(INDEX, PFAD_LI) ; //
INDEX := INDEX + 1 ; //
End; //
until FindNext(SR)<>0; //
FindClose(SR); //
{Nach jedem findfirst nötig, um sr freizugeben!} //
End; //
end; //
//
{************2. Durchgang: Dateien **********************} //
if DIR[length(DIR)]<>'\' then //
DIR:=DIR+'\'; //
with MainForm do begin //
if FindFirst(DIR+'*.*',faAnyFile,SR) = 0 then Begin //
repeat //
{Nur Dateien zulassen} //
if not (SR.Attr and FaDirectory = FaDirectory) then //
Begin //
{Datenzuweisung an ListView} //
PFAD_LI := Uppercase(DIR) + SR.Name ; //
ListView_Links_Items_Add( //
PFAD_LI, //
GetCorrectFileSize(PFAD_LI), //
FormatDateTime ('dd.mm.yyyy',FileDateToDateTime(SR.time)), //
Fileops.GetAttribut(SR.attr) //
); //
//
{Datenzuweisung an Array im Datenobjekt} //
ListObjekt_Links.Set_PFAD(INDEX, PFAD_LI) ; //
INDEX := INDEX + 1 ; //
End; //
until FindNext(SR)<>0; //
FindClose(SR); //
{Nach jedem findfirst nötig, um sr freizugeben!} //
End; //
end; //
//
{Anzeige des Platzes im oberen Editfeld} //
Main.MainForm.Edit_LW_Links.Text := //
DirOps.GetDriveSpaceData(DIR) ; //
//
Main.MainForm.Edit_Links.Text := DIR ; //
end ; //
end; //
Delphi-Quellcode:
{Wird von Prozedur Einlesen aufgerufen} //
procedure ListView_Links_Items_Add(const PFAD_LI, //
GROESSE, //
DATUM, //
ATTRIBUTE: string //
); //
var //
Newitem: TListItem; //
Info: TSHFileInfo; {uses shellapi;} //
ANZEIGENAME_LI: String ; //
Begin //
ANZEIGENAME_LI := DirOps.Anzeigename(PFAD_LI) ; //
NewItem := MainForm.ListView_Links.Items.Add ; //
NewItem.Caption := ANZEIGENAME_LI ; //
newItem.subitems.add(GROESSE); //
newItem.subitems.add(DATUM); //
newitem.subitems.Add(ATTRIBUTE); //
//
{if pos('\', PFAD_LI) = 0 then NewItem.ImageIndex := -1 else} //
Begin //
SHGetFileInfo(PChar(PFAD_LI), 0, Info, SizeOf(TSHFileInfo),//
SHGFI_SYSIconIndex or SHGFI_TYPENAME); //
NewItem.ImageIndex := Info.IIcon; //
End; //
end; //