![]() |
Listbox Sortierung
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
Delphi-Quellcode:
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.
Main.MainForm.ListView_Links.sortType := stText ;
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; // |
Re: Listbox Sortierung
Hallo,
Schau in der Hilfe mal unter TListView.OnCompare nach. Vielleicht geht es auch einfacher, aber ich würde bei dem Einlesen der Dateinamen den Typ der Datei irgendwie und irgendwo in den ListItems speichern, also ob es sich um eine Datei handelt oder um einen Ordner. Dieser Typ kann dann bei der Sortierung ausgelesen werden und nach diesem Flag erfolgt dann die Sortierung in der Methode OnCompare... . Nicht vergessen, die Eigenschaft SortType auf stData oder stBoth zu setzen, da ansonsten OnCompare nicht aufgerufen wird. Falls du für Ordner ein eigenes Icon verwendest und für Dateien ein anderes, dann kannst du anhand des Item.ImageIndex-es feststellen, ob es Ordner oder Datei ist. Gruß Frank |
Re: Listbox Sortierung
Moin Edi,
du hast deine Delphi-Version nicht angegeben - trotzdem: Weißt du, dass die Komponente TShellListView mit der Eigenschaft Sorted = True und in Verbindung mit dem Ereignis OnAddFolder() eigentlich genau das tut, was du nachzustellen versuchst? SortType <> stNone führt ab dem Zeitpunkt des Setzens zu einer automatischen Sortierung. Und noch ein paar Tipps:
Vergiss nicht mit einem richtig großen Verzeichnis zu testen. Freundliche Grüße |
Re: Listbox Sortierung
Hallo, Marabu !
Danke für die Tips. Zitat:
Zitat:
Zitat:
Einige Funktionen, die ich in der damaligen Version nicht hatte, z.B. zur Stringbearbeitung, habe ich auch in einer eigenen Unit "Strings" zu stehen. Immerhin: es funktioniert, und ich nutze das Programm, daß diese Codes enthält, auch reichlich. Zitat:
edi |
Re: Listbox Sortierung
Die Komponente
![]() Wenn du weiter mit TListView arbeitest, dann darfst du den Beitrag von Frank (#2) nicht übersehen - OnCompare ist da sehr hilfreich. Freundliche Grüße |
Re: Listbox Sortierung
Zitat:
Zitat:
Erst mal vielen Dank für die Tips ! Mit freundlichen Grüßen an alle edi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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