![]() |
TListView onCompare Performance
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:
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.
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; Gruß Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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