Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListView onCompare Performance (https://www.delphipraxis.net/27654-tlistview-oncompare-performance.html)

Sven Janssen 13. Aug 2004 14:41


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:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz