Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi Erweitertes ListView-Sortieren (https://www.delphipraxis.net/20788-erweitertes-listview-sortieren.html)

alcaeus 23. Apr 2004 05:47


Erweitertes ListView-Sortieren
 
ListView Sortieren erweitert (mit IP)

MfG Florian :hi:


Ich habe den Code aus der Delphi-Hilfe zum Sortieren einer ListView etwas modifiziert, nun können die Listen auf- und absteigend sortiert werden, dies geschieht mit einem wiederholten Klick auf eine Spalte.

Delphi-Quellcode:
var
  ColumnToSort: Integer;
  LastSorted: Integer;
  SortDir: Integer;

procedure TForm1.ListView1ColumnClick(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 TForm1.ListView1ColumnClick

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
var
  ix: Integer;
begin
  if ColumnToSort = 0 then
  begin
    if SortDir = 0 then
      Compare := CompareText(Item1.Caption,Item2.Caption)
    else
      Compare := CompareText(Item2.Caption,Item1.Caption);
  end //if ColumnToSort = 0 then
  else
  begin
   ix := ColumnToSort - 1;
   if SortDir = 0 then
     Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix])
   else
     Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]);
  end; //if ColumnToSort <> 0 then
end; //procedure TForm1.ListView1Compare
[edit=Admin]Highlighting korrigiert. Mfg, Daniel[/edit]

CalganX 13. Mai 2004 17:29

Re: Erweitertes ListView-Sortieren
 
Die einfache Methode findet sich sowohl in der Hilfe von Delphi, als auch hier. Letzterer Beitrag stammt von unserem ehem. User Daniel B..

CalganX 26. Mai 2004 14:49

Re: Erweitertes ListView-Sortieren
 
alcaeus hat folgenden weiteren Tipp:

Das Problem beim Listview-Sortieren erhält man, wenn eine Spalte zum Beispiel einen fortlaufenden Index von 1 bis 12 enthält. Sobald die Listview nach dieser Spalte sortiert wird, sieht die Reihenfolge so aus: 1, 10, 11, 12, 2, ...
Um dies zu umgehen, habe ich meine vorherige Routinen nochmals etwas erweitert, so dass wahlweise Integer-, Float-, DateTime- oder normale String-Werte verglichen werden. Gesteuert wird das alles über die Tags der einzelnen Listview-Spalten:
1 = Integer
2 = Float
3 = DateTime
alles andere wird als String behandelt.
Wichtig: Die Tags dürfen nur gesetzt werden, wenn man sich ABSOLUT sicher ist, dass nur gültige Werte drinnen sind. Die Funktionen prüfen nicht zuerst auf gültige Werte.

Wichtig: Die DateTime-Werte müssen mit DateToStr, TimeToStr oder DateTimeToStr in die Listview eingetragen werden, andernfalls funktioniert das Sortieren mit Tag=3 nicht.

Ich hoffe jeder weiß, wie die Funktionen zu verwenden sind. Und hier ist (endlich ;)) der Source:

Delphi-Quellcode:
var
  ColumnToSort: Integer;
  LastSorted: Integer;
  SortDir: Integer;

procedure TForm1.ListView1ColumnClick(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 TForm1.ListView1ColumnClick

procedure TForm1.ListView1Compare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  TempStr, TextToSort1, TextToSort2: String;
begin
//Texte zuweisen
  if ColumnToSort = 0 then
  begin
    TextToSort1 := Item1.Caption;
    TextToSort2 := Item2.Caption;
  end //if ColumnToSort = 0 then
  else
  begin
    TextToSort1 := Item1.SubItems[ColumnToSort - 1];
    TextToSort2 := Item2.SubItems[ColumnToSort - 1];
  end; //if ColumnToSort <> 0 then

//Je nach Sortierrichtung evtl. Texte vertauschen
  if SortDir <> 0 then
  begin
    TempStr := TextToSort1;
    TextToSort1 := TextToSort2;
    TextToSort2 := TempStr;
  end; //if SortDir <> 0 then

//Texte je nach Tag der Spalte unterschiedlich vergleichen
  case (Sender as TListView).Columns[ColumnToSort].Tag of
//Integer-Werte
    1: Compare := StrToIntDef(TextToSort1,0)-StrToIntDef(TextToSort2,0);
//Float-Werte
    2: begin
      Compare := 0;
      if StrToFloat(TextToSort1) > StrToFloat(TextToSort2) then
        Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))+1;
      if StrToFloat(TextToSort1) < StrToFloat(TextToSort2) then
        Compare := Trunc(StrToFloat(TextToSort1)-StrToFloat(TextToSort2))-1;
    end; //2
//DateTime-Werte
    3: begin
      Compare := 0;
      if StrToDateTime(TextToSort1) > StrToDateTime(TextToSort2) then
        Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))+1;
      if StrToDateTime(TextToSort1) < StrToDateTime(TextToSort2) then
        Compare := Trunc(StrToDateTime(TextToSort1)-StrToDateTime(TextToSort2))-1;
    end; //3
//Alles andere sind Strings
    else
      Compare := CompareText(TextToSort1,TextToSort2);
  end; //case (Sender as TListView).Columns[ColumnToSort].Tag of
end; //procedure TForm1.ListView1Compare
[edit=Matze]Anmerkung von XiaN eingefügt. MfG, Matze[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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