AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListView onCompare Performance

Ein Thema von Sven Janssen · begonnen am 13. Aug 2004
Antwort Antwort
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#1

TListView onCompare Performance

  Alt 13. Aug 2004, 15:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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