Einzelnen Beitrag anzeigen

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, 14: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