Thema: Delphi Listbox Sortierung

Einzelnen Beitrag anzeigen

edi-mv

Registriert seit: 21. Jan 2007
4 Beiträge
 
#1

Listbox Sortierung

  Alt 11. Nov 2007, 01:53
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; //
  Mit Zitat antworten Zitat