Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ListView Spalte automatisch sortieren


T.E. - Do 11.08.11 09:54
Titel: ListView Spalte automatisch sortieren
Moin moin,

das ist vermutlich nur eine Denkblockade bei mir, aber ich hab gerade absolut keine Idee, wie ich mein ListView beim Start/von vornherein nach der zweiten Spalte sortiere.

Also ich habe ein ListView mit drei Spalten in denen diverse Werte stehen. Nun möchte ich, das nicht standardmäßig nach der ersten Spalte sortiert wird, sondern nach der zweiten.

Klar ich könnte das ganze auch per OnColumnClick machen, das habe ich auch, aber die User möchten standardmäßig das halt die zweite Spalte absteigend sortiert ist und per OnColumnClick nur im "Ausnahmefall" die anderen sortieren.

OnCompare:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
procedure TMain_Form.Filelist_Grid_SchnittFertigCompare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
begin
  FileListOnCompare(Sender, Item1, Compare, Item2);
end;

procedure TMain_Form.FileListOnCompare(Sender: TObject; Item1: TListItem; var Compare: Integer; Item2: TListItem);
var
  TextToSort1: string;
  TempStr: string;
  TextToSort2: string;
begin
  //Texte zuweisen
  if ColumnToSort = 0 then
  begin
    TextToSort1 := Item1.Caption;
    TextToSort2 := Item2.Caption;
  end else
  //if ColumnToSort = 0 then
  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
    1:
      Compare := StrToIntDef(TextToSort1, 0) - StrToIntDef(TextToSort2, 0);
    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;
    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;
  else
    //3
    //Alles andere sind Strings
    Compare := CompareText(TextToSort1, TextToSort2);
  end;
end;


OnColumnClick

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TMain_Form.Filelist_Grid_SchnittFertigColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  SortFileListColumns(Sender, Column);
end;

procedure TMain_Form.SortFileListColumns(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;


Ich hoffe ihr könnt mir bei meiner Denkblockade helfen. Besten Dank im voraus! =)


jaenicke - Do 11.08.11 10:36

Naja, ColumnToSort usw. setzen, AlphaSort aufrufen, fertig. :gruebel:
Natürlich nach dem Laden der Daten.