Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Sortierrichtungs-Pfeile in ListView (https://www.delphipraxis.net/204633-sortierrichtungs-pfeile-listview.html)

Maekkelrajter 14. Jun 2020 14:11

Sortierrichtungs-Pfeile in ListView
 
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

Achim Kalwa 14. Jun 2020 15:57

AW: Sortierrichtungs-Pfeile in ListView
 
Zitat:

Zitat von Maekkelrajter (Beitrag 1467223)
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?

Die Sortierpfeile werden von den Windows Common Controls ab V6 gezeichnet: Microsoft Dokumentation.
Wenn Du einen der alternativen Stile aktivierst (z.B. "Cyan Dusk"), dann erfolgt das Zeichnen mittels TListViewStyleHook.DrawHeaderSection(). Und dort gibt es leider keinen Code zum Zeichnen der Richtungspfeile.

Du solltest das als Bug melden; so besteht zumindest die Hoffnung, dass das irgendwann korrigiert wird :-)

Die Alternative wäre: selber zeichnen. Und da geht es schon los: In welcher Farbe soll der Pfeil gezeichnet werden? Soll ja auch irgenwie zum gewählten Style passen....

Achim Kalwa 14. Jun 2020 16:20

AW: Sortierrichtungs-Pfeile in ListView
 
Liste der Anhänge anzeigen (Anzahl: 2)
Und hier noch eine Alternative:
Eine TImageList zufügen und ListView.SmallImages damit verbinden.
In die ImageList fügst Du zwei Bitmap ein (16x16, 256 Farben), welche einen "Up" und einen "Down"-Pfeil darstellen. In den HeaderColumns kannst Du bei ImageIndex zwischen -1 (=kein Bild), 0 und 1 auswählen, ob und welches Bitmap gezeichnet werden soll. Das funktioniert auch mit den Custom Styles:
Anhang 52675Anhang 52676
Damit die Items in dem TListView nicht ebenfalls einen SortierPfeil anzeigen, muss dort ebenfalls ImageIndex := -1 gesetzt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz