Hi,
das Problem ist ja wie folgt zu beschreiben: Der User klickt auf die erste Spalte und ruft dadurch die TForm1.ListViewColumnClick Procedure auf. In dieser Procedure überprüfst du auf welche Spalte der User geklickt hat setzt entsprechend die Variable
LvSortStyle auf den passenden Wert. Klickt der User wie gesagt auf die erste Spalte dann setzt du die Variable auf cssAlphaNum. Das ist schon der erste Fehler. Denn es soll ja nicht nur nach Alpha- und Nummerischen Zeichen in die Sortierung einbezogen werden sondern auch der Type (also Ordner oder Datei).
Um das Problem zu lösen würde ich wie folgt vorgehen: Du erweiterst die
CustomSortProc um eine spezielle Sortiermethode die neben der Caption der Items auch die
Data Eigenschaft in die Sortierung einbezieht. Diese Data Eigenschaft erwartet einen Pointer. Du könntest z. b. einen Interger Wert dort abspeichern. Je größer dieser Wert ist desto weiter tiefer wird das entsprechende Item in die Sortierung gesetzt. In deinem Fall musst du dann beim Einfügen der Items den Data Wert setzen. Zum Beispiel auf 0 wenn es sich um ein Ornder handelt und auf 1 bei einer Datei.
Das heißt also ich würde als erstes dem Aufzählungstypen
TCustomSortStyle, der ja angibt wie sortiert werden soll, ein neues Element hinzufügen um der Sortierprocedure
CustomSortProc mitzuteilen das es hier eine spezielle Sortierung durchführen muss:
Delphi-Quelltext
1: 2:
| Type TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime, cssDataAlphaNum); |
Hier habe ich jetzt das Element
cssDataAlphaNum hinzugefügt. Ich habe das Element deshalb so benannt weil die Sortierung erst nach der Data Eigenschaft des Items sortiert werden soll und anschließend, bei gleichem Wert, die normale AplhaNum Sortierung benutzt werden soll.
Die
CustomSortProc musst du jetzt auch erweitern.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| case LvSortStyle of cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2)); cssDataAlphaNum : begin i1 := Integer (Item1.Data); i2 := Integer (Item2.Data); Result := CompareNumeric (i2, i1); If Result = 0 Then Result = lstrcmp (PChar (s1), PChar (s2)); end; cssNumeric : begin |
Ich hab es nicht getest. Probier es mal aus ob es funktioniert.
Gruß
Tino