AGB  ·  Datenschutz  ·  Impressum  







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

ListView nach Integer sortieren

Ein Thema von Tpercon · begonnen am 13. Jul 2002 · letzter Beitrag vom 13. Jul 2002
Antwort Antwort
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#1

ListView nach Integer sortieren

  Alt 13. Jul 2002, 14:32
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:
     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;
Als ShellSort auf Basis von Daniels Code aus dem Tutorial gehts zwar schon schneller, aber zufrieden kann man damit trotzdem nicht sein.
Code:
     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;
Gruß
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 13. Jul 2002, 14:47
Moin Tpercon,

lass dass Sortieren doch Delphi übernehmen.
Dazu müsstest Du Dir nur einen CustomSort deklarieren.

Code:
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;
Zum aufrufen dann

Code:
  FListView.CustomSort(FSortProc,p_iColumnTag);
  if FsdSortDirection = sdAscending then
  begin
    FsdSortDirection := sdDescending;
  end
  else
  begin
    FsdSortDirection := sdAscending;
  end;
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.
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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#3
  Alt 13. Jul 2002, 15:16
Danke, hab deinen Code was angepasst und es funktioniert echt gut.

Gruß
  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 20:04 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