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
By Wiezutun
Sortieren die Spalte eine Tlistview vom Benutzer geklickt : Mehreren tausend Tipps, um Ihr Leben einfacher machen.