Sortieren die Spalte eine Tlistview vom Benutzer geklickt


Wie eine ListView in aufsteigender oder absteigender Reihenfolge nach einer bestimmten Spalte sortieren?
Sortieren die Spalte eine TListView vom Benutzer geklickt
Wir wollen das folgende Verhalten für ein ListView-Steuerelement:

  • Klickt der Benutzer auf einen Spaltenheader, sollte die ListView nach dieser Spalte sortiert werden

  • Die anfänglichen Sortierreihenfolge sollten aufsteigend sein. Klickt er wieder auf die gleiche Spalte, sollte die Sortierreihenfolge ein-und ausgeschaltet werden. Klickt der Benutzer auf eine andere Spalte, sollte die Sortierreihenfolge der neuen Spalte der letzten sortierten Spalte identisch sein.


Für die Umsetzung benötigen wir zwei Variablen, die letzte Spalte geklickt, indem der Benutzer und die aktuelle Sortierreihenfolge zu halten:
var
    LastSortedColumn: integer;
    Ascending: boolean;

Wir können sie initialisieren, wenn das Formular erstellt wird:
procedure TForm1.FormCreate(Sender: TObject);
  begin
    LastSortedColumn := -1;
    Ascending := True;
  end;

In das ColumnClick-Ereignis der ListView wir bestimmen die Sortierreihenfolge und die zu sortieren:
procedure TForm1.ListView1ColumnClick(Sender: TObject;
    Column: TListColumn);
  begin

    if Column.Index = LastSortedColumn then
      Ascending := not Ascending
    else
      LastSortedColumn := Column.Index;
    TListView(Sender).CustomSort(@SortByColumn, Column.Index);
  end;

SortByColumn ist eine Funktion, die zuvor erklärt werden sollte und die Funktion von CustomSort verwendet, um zwei Elemente vergleichen. An den Data-Parameter der CustomSort übergebene Wert wird als des Data-Parameters an SortByColumn übergeben werden, und wir nutzen es für die Sortierspalte:
function SortByColumn(Item1, Item2: TListItem; Data: integer):
    integer; stdcall;
  begin
    if Data = 0 then
      Result := AnsiCompareText(Item1.Caption, Item2.Caption)
    else
      Result := AnsiCompareText(Item1.SubItems[Data-1],
                                Item2.SubItems[Data-1]);
    if not Ascending then Result := -Result;
  end;

Den vollständigen Quellcode dieses Artikels finden im Archiv Sie, die begleitet die Pascal Newsletter #25









Sortieren die Spalte eine Tlistview vom Benutzer geklickt


Sortieren die Spalte eine Tlistview vom Benutzer geklickt : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Wie eine ListView in aufsteigender oder absteigender Reihenfolge nach einer bestimmten Spalte sortieren?
Sortieren die Spalte eine TListView vom Benutzer geklickt
Wir wollen das folgende Verhalten für ein ListView-Steuerelement:

  • Klickt der Benutzer auf einen Spaltenheader, sollte die ListView nach dieser Spalte sortiert werden

  • Die anfänglichen Sortierreihenfolge sollten aufsteigend sein. Klickt er wieder auf die gleiche Spalte, sollte die Sortierreihenfolge ein-und ausgeschaltet werden. Klickt der Benutzer auf eine andere Spalte, sollte die Sortierreihenfolge der neuen Spalte der letzten sortierten Spalte identisch sein.


Für die Umsetzung benötigen wir zwei Variablen, die letzte Spalte geklickt, indem der Benutzer und die aktuelle Sortierreihenfolge zu halten:
var
    LastSortedColumn: integer;
    Ascending: boolean;

Wir können sie initialisieren, wenn das Formular erstellt wird:
procedure TForm1.FormCreate(Sender: TObject);
  begin
    LastSortedColumn := -1;
    Ascending := True;
  end;

In das ColumnClick-Ereignis der ListView wir bestimmen die Sortierreihenfolge und die zu sortieren:
procedure TForm1.ListView1ColumnClick(Sender: TObject;
    Column: TListColumn);
  begin

    if Column.Index = LastSortedColumn then
      Ascending := not Ascending
    else
      LastSortedColumn := Column.Index;
    TListView(Sender).CustomSort(@SortByColumn, Column.Index);
  end;

SortByColumn ist eine Funktion, die zuvor erklärt werden sollte und die Funktion von CustomSort verwendet, um zwei Elemente vergleichen. An den Data-Parameter der CustomSort übergebene Wert wird als des Data-Parameters an SortByColumn übergeben werden, und wir nutzen es für die Sortierspalte:
function SortByColumn(Item1, Item2: TListItem; Data: integer):
    integer; stdcall;
  begin
    if Data = 0 then
      Result := AnsiCompareText(Item1.Caption, Item2.Caption)
    else
      Result := AnsiCompareText(Item1.SubItems[Data-1],
                                Item2.SubItems[Data-1]);
    if not Ascending then Result := -Result;
  end;

Den vollständigen Quellcode dieses Artikels finden im Archiv Sie, die begleitet die Pascal Newsletter #25


Sortieren die Spalte eine Tlistview vom Benutzer geklickt

Sortieren die Spalte eine Tlistview vom Benutzer geklickt : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Sortieren die Spalte eine Tlistview vom Benutzer geklickt
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung