Hallo,
In einem Listview mit dem ViewStyle 'vsReport' sollen einige Spalten sortierbar sein. Das funktioniert auch alles, wie es soll. Unerwartet kompliziert war jedoch die Darstellung der Sortierrichtung mittels der kleinen Pfeile, wie sie etwa im Windows Explorer zu sehen sind. Nach längerer Suche fand ich fand ich einen Code-Schnipsel, mit dem das tatsächlich funktioniert:
Delphi-Quellcode:
uses Winapi.CommCtrl
Procedure TMediPlanGUI.DBListviewColumnClick(Sender: TObject; Column: TListColumn);
var
columnToSort: Integer;
Header: HWND;
Item: THDItem;
begin
// Vorhandenen Pfeil löschen
ColumnToSort:= abs(sortstatus) - 1;
Header := ListView_GetHeader(DBListView.Handle);
ZeroMemory(@Item, SizeOf(Item));
Item.Mask := HDI_FORMAT;
Header_GetItem(Header, ColumnToSort, Item);
Item.fmt := Item.fmt
and not (HDF_SORTUP
or HDF_SORTDOWN);
//remove both flags
Header_SetItem(Header, ColumnToSort, Item);
[...]
// Neuen Pfeil entsprechend der Sortierichtung setzen
Columntosort:= column.
Index;
// Get the new column
Header_GetItem(Header, Columntosort, Item);
Item.fmt := Item.fmt
and not (HDF_SORTUP
or HDF_SORTDOWN);
// remove both flags
if sortstatus > 0
then // Sortierrichtung aufwärts
Item.fmt := Item.fmt
or HDF_SORTUP
// include the sort ascending flag
else if sortstatus < 0
Then // Sortierrichtung abwärts
Item.fmt := Item.fmt
or HDF_SORTDOWN;
// include the sort descending flag
Header_SetItem(Header, ColumnToSort, Item);
[...]
end
'Sortstatus' ist als Integer-Feld in der Private-Section des Formulars deklariert und enthält den Index der zu sortierenden Spalte, wobei das Vorzeichen die Sortierrichtung bestimmt.
Wie gesagt, alles funktioniert korrekt. Aber leider nur im Standard-Windows-Look. Sobald ich in den Projekt-Optionen ein anderes Erscheinungsbild wähle, werden die Pfeile nicht mehr angezeigt.
Leider habe ich keine Einstellung gefunden, mit der sich das Problem beheben ließ. Weiß da jemand mehr? Oder gibt es gar eine Alternative zu dem o.g. Verfahren?
Gruß LP