![]() |
Erweitertes ListView-Sortieren
![]() MfG Florian :hi: Ich habe den Code aus der Delphi-Hilfe zum Sortieren einer ListView etwas modifiziert, nun können die Listen auf- und absteigend sortiert werden, dies geschieht mit einem wiederholten Klick auf eine Spalte.
Delphi-Quellcode:
[edit=Admin]Highlighting korrigiert. Mfg, Daniel[/edit]
var
ColumnToSort: Integer; LastSorted: Integer; SortDir: Integer; procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin ColumnToSort := Column.Index; if ColumnToSort = LastSorted then SortDir := 1 - SortDir else SortDir := 0; LastSorted := ColumnToSort; (Sender as TCustomListView).AlphaSort; end; //procedure TForm1.ListView1ColumnClick procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var ix: Integer; begin if ColumnToSort = 0 then begin if SortDir = 0 then Compare := CompareText(Item1.Caption,Item2.Caption) else Compare := CompareText(Item2.Caption,Item1.Caption); end //if ColumnToSort = 0 then else begin ix := ColumnToSort - 1; if SortDir = 0 then Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]) else Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]); end; //if ColumnToSort <> 0 then end; //procedure TForm1.ListView1Compare |
Re: Erweitertes ListView-Sortieren
Die einfache Methode findet sich sowohl in der Hilfe von Delphi, als auch
![]() |
Re: Erweitertes ListView-Sortieren
alcaeus hat folgenden weiteren Tipp:
Das Problem beim Listview-Sortieren erhält man, wenn eine Spalte zum Beispiel einen fortlaufenden Index von 1 bis 12 enthält. Sobald die Listview nach dieser Spalte sortiert wird, sieht die Reihenfolge so aus: 1, 10, 11, 12, 2, ... Um dies zu umgehen, habe ich meine vorherige Routinen nochmals etwas erweitert, so dass wahlweise Integer-, Float-, DateTime- oder normale String-Werte verglichen werden. Gesteuert wird das alles über die Tags der einzelnen Listview-Spalten: 1 = Integer 2 = Float 3 = DateTime alles andere wird als String behandelt. Wichtig: Die Tags dürfen nur gesetzt werden, wenn man sich ABSOLUT sicher ist, dass nur gültige Werte drinnen sind. Die Funktionen prüfen nicht zuerst auf gültige Werte. Wichtig: Die DateTime-Werte müssen mit DateToStr, TimeToStr oder DateTimeToStr in die Listview eingetragen werden, andernfalls funktioniert das Sortieren mit Tag=3 nicht. Ich hoffe jeder weiß, wie die Funktionen zu verwenden sind. Und hier ist (endlich ;)) der Source:
Delphi-Quellcode:
[edit=Matze]Anmerkung von XiaN eingefügt. MfG, Matze[/edit]
var
ColumnToSort: Integer; LastSorted: Integer; SortDir: Integer; procedure TForm1.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin ColumnToSort := Column.Index; if ColumnToSort = LastSorted then SortDir := 1 - SortDir else SortDir := 0; LastSorted := ColumnToSort; (Sender as TCustomListView).AlphaSort; end; //procedure TForm1.ListView1ColumnClick procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); var TempStr, TextToSort1, TextToSort2: String; begin //Texte zuweisen if ColumnToSort = 0 then begin TextToSort1 := Item1.Caption; TextToSort2 := Item2.Caption; end //if ColumnToSort = 0 then else begin TextToSort1 := Item1.SubItems[ColumnToSort - 1]; TextToSort2 := Item2.SubItems[ColumnToSort - 1]; end; //if ColumnToSort <> 0 then //Je nach Sortierrichtung evtl. Texte vertauschen if SortDir <> 0 then begin TempStr := TextToSort1; TextToSort1 := TextToSort2; TextToSort2 := TempStr; end; //if SortDir <> 0 then //Texte je nach Tag der Spalte unterschiedlich vergleichen case (Sender as TListView).Columns[ColumnToSort].Tag of //Integer-Werte 1: Compare := StrToIntDef(TextToSort1,0)-StrToIntDef(TextToSort2,0); //Float-Werte 2: begin Compare := 0; if StrToFloat(TextToSort1) > StrToFloat(TextToSort2) then Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))+1; if StrToFloat(TextToSort1) < StrToFloat(TextToSort2) then Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))-1; end; //2 //DateTime-Werte 3: begin Compare := 0; if StrToDateTime(TextToSort1) > StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))+1; if StrToDateTime(TextToSort1) < StrToDateTime(TextToSort2) then Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))-1; end; //3 //Alles andere sind Strings else Compare := CompareText(TextToSort1,TextToSort2); end; //case (Sender as TListView).Columns[ColumnToSort].Tag of end; //procedure TForm1.ListView1Compare |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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