Ich bin mir nicht sicher, ob ich einen Fehler gemacht habe, oder die Performance von onCompare so extrem bei vielen gleichen Einträgen in den Keller sinkt.
Habe ich eine Spalte mit vielen unterschiedlichen Einträgen, dann sortiert er diese sofort nach dem Klick. Bei vielen gleichen Einträgen in einer Spalte dauert es ziemlich lange.
z.b bie vielen leeren Einträgen, oder wenn eine Spalte von 100 Elementen nur aus 4 verschiedenen besteht. (Dauer ca 2-3 Sekunden auf einem Cleron 2Ghz)
Am schnellsten sortiert er z.b wenn jeder Eintrag ein anderer ist.
Den Beispiel Code dafür hatte ich hier aus dem Forum, ich habe nur diesen noch etwas erweitert.
Code:
procedure Tfmain.lv1ColumnClick(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 Tfmain.lv1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var ix:integer;
wert,datum,woche:boolean;
element1:string;
element2:string;
begin
datum:=FALSE;
woche:=FALSE;
wert:=FALSE;
if ColumnToSort = 0 then begin
element1:=Item1.Caption;
element2:=Item2.Caption;
end else begin
ix := ColumnToSort - 1;
element1:=Item1.SubItems[ix];
element2:=Item2.SubItems[ix];
end;
//Prüfen ob es sich um wochen handelt
if (wochetodate(element1) > '0') and (wochetodate(element2) > '0') then woche:=TRUE;
//Prüfen ob es sich um ein Datum handelt
if not woche then if (isdatum(element1) and isdatum(element2)) then datum:=TRUE;
//Prüfen ob es sich im einen real wert handelt
if not datum then if (isdigit(element1) and isdigit(element2)) then wert:=TRUE;
if (not woche and not datum and not wert) then begin
if SortDir = 0 then Compare := CompareText(element1,element2)
else Compare := CompareText(element2,element1);
exit;
end;
if woche then begin
if SortDir = 0 then Compare := round(strtodate(wochetodate(element1)) - strtodate(wochetodate(element2)))
else Compare := round(strtodate(wochetodate(element2)) - strtodate(wochetodate(element1)));
exit;
end;
if datum then begin
if SortDir = 0 then Compare := round(strtodate(element1) - strtodate(element2))
else Compare := round(strtodate(element2) - strtodate(element1));
exit;
end;
if wert then begin
if SortDir = 0 then Compare := round(strtoreal2(element1) - strtoreal2(element2))
else Compare := round(strtoreal2(element2) - strtoreal2(element1));
exit;
end;
end;
Funktion strtoreal2, wochetodate und isdatum ist von mir selber, aber das Problem tritt dort gar nicht auf, sondern bei Integer Zahlen und Strings. Und dann NUR, wenn wie gesagt viele vom selben Wert vorhanden sind.
Gruß Sven