AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi Erweitertes ListView-Sortieren

Erweitertes ListView-Sortieren

Ein Thema von alcaeus · begonnen am 23. Apr 2004 · letzter Beitrag vom 26. Mai 2004
Antwort Antwort
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

Erweitertes ListView-Sortieren

  Alt 23. Apr 2004, 06:47
ListView Sortieren erweitert (mit IP)

MfG Florian


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]
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Erweitertes ListView-Sortieren

  Alt 13. Mai 2004, 18:29
Die einfache Methode findet sich sowohl in der Hilfe von Delphi, als auch hier. Letzterer Beitrag stammt von unserem ehem. User Daniel B..
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Erweitertes ListView-Sortieren

  Alt 26. Mai 2004, 15:49
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]
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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