![]() |
ListView nach Integer sortieren
In der zweiten Spalte der ListView stehen nur Zahlen und danach möchte ich die Einträge sortiert haben. Der gute alte Bubble Sort funktioniert da zwar perfekt, ist aber viel zu langsam. Wer hat ne schnellere Lösung? Gibt es sowas wie CompareText nur für Integer halt?
Mein jetziger Code:
Code:
Als ShellSort auf Basis von Daniels Code aus dem Tutorial gehts zwar schon schneller, aber zufrieden kann man damit trotzdem nicht sein.
ListView1.Items.BeginUpdate;
ListView1.Items.Add; For x:=ListView1.Items.Count-2 downto 0 do For y:=0 to x do If StrtoInt(ListView1.Items.Item[x].SubItems.Strings[0])<StrtoInt(ListView1.Items.Item[y].SubItems.Strings[0]) then begin ListView1.Items.Item[ListView1.Items.Count-1]:=ListView1.Items.Item[x]; ListView1.Items.Item[x]:=ListView1.Items.Item[y]; ListView1.Items.Item[y]:=ListView1.Items.Item[ListView1.Items.Count-1]; end; ListView1.Items.Delete(ListView1.Items.Count-1); ListView1.Items.EndUpdate;
Code:
Gruß
ListView1.Items.BeginUpdate;
ListView1.Items.Add; h:=1; Repeat h:=(3*h)+1; Until (h>ListView1.Items.Count-1); Repeat h:=(h div 3); For i:=(h+1) To ListView1.Items.Count-1 Do Begin ListView1.Items.Item[listView1.Items.Count-1]:=ListView1.Items.Item[i-1]; j:=i; While ((j>h) and (StrtoInt(ListView1.Items.Item[j-h-1].SubItems.Strings[0])>StrtoInt(ListView1.Items.Item[listView1.Items.Count-1].SubItems.Strings[0]))) Do Begin ListView1.Items.Item[j-1]:=ListView1.Items.Item[j-h-1]; dec(j,h); End; ListView1.Items.Item[j-1]:=ListView1.Items.Item[listView1.Items.Count-1]; End; Until (h=1); ListView1.Items.Delete(ListView1.Items.Count-1); ListView1.Items.EndUpdate; |
Moin Tpercon,
lass dass Sortieren doch Delphi übernehmen. Dazu müsstest Du Dir nur einen CustomSort deklarieren.
Code:
Zum aufrufen dann
function SortProc(p_liItem1 : TListItem;p_liItem2 : TListItem; p_iColumnTag : integer) : integer; stdcall;
var rNumber1 : integer; rNumber2 : integer; begin Result := 0; if p_iColumnTag = 0 then begin sValue1 := p_liItem1.Caption; sValue2 := p_liItem2.Caption; end else begin sValue1 := p_liItem1.SubItems[p_iColumnTag-1]; sValue2 := p_liItem2.SubItems[p_iColumnTag-1]; end; rNumber1 := StrToInt(sValue1); rNumber2 := StrToInt(sValue2); if rNumber1 = rNumber2 then begin Result := 0; end; Result := -1; if rNumber1 > rNumber2 then begin Result := 1; end; if Form1.ActiveSortDirection = sdDescending then begin Result := -1 * Result; end; end;
Code:
Der Aufruf ist jetzt so nicht direkt zu übernehmen, da ich mir das Füllen und bearbeiten des Listviews als Objekt ausgelagert habe, ausserdem ist die Sortierrichtung ein Aufzählungstyp.
FListView.CustomSort(FSortProc,p_iColumnTag);
if FsdSortDirection = sdAscending then begin FsdSortDirection := sdDescending; end else begin FsdSortDirection := sdAscending; end; Ausserdem habe ich noch die Sortierroutine abgespeckt und auf int angepasst, da ich das in dem ListView aus dem ich das habe nicht verwende. Ist deshalb nicht getestet, sollte aber funktionieren. Wichtig: Ich habe den Tags der Items immer die Spaltennummer zugeordnet, damit das Sortieren auch funktioniert, wenn die Spalten umgestellt werden (FullDrag = true) |
Danke, hab deinen Code was angepasst und es funktioniert echt gut.
Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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 by Thomas Breitkreuz