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:
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
[edit=Matze]Anmerkung von XiaN eingefügt. MfG, Matze[/edit]