AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sortierrichtungs-Pfeile in ListView

Ein Thema von Maekkelrajter · begonnen am 14. Jun 2020 · letzter Beitrag vom 14. Jun 2020
Antwort Antwort
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
118 Beiträge
 
Delphi 11 Alexandria
 
#1

Sortierrichtungs-Pfeile in ListView

  Alt 14. Jun 2020, 14:11
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
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Sortierrichtungs-Pfeile in ListView

  Alt 14. Jun 2020, 15:57
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
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Sortierrichtungs-Pfeile in ListView

  Alt 14. Jun 2020, 16:20
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:
example-cyan-dusk.pngexample-carbon.png
Damit die Items in dem TListView nicht ebenfalls einen SortierPfeil anzeigen, muss dort ebenfalls ImageIndex := -1 gesetzt werden.
Achim
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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