TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Rund um die LCL und andere Komponenten
Antworten
HobbyDev
Beiträge: 2
Registriert: Fr 31. Jan 2025, 10:30

TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von HobbyDev »

Hallo, ich versuche in einer ListView die Zeilen untschiedlich farblich zu hinterlegen, komme aber nicht klar. Ich verwende Lazarus 3.8 unter Fedora- Linux, allerdings auf einem MacBook Pro mit M1 Silikon Chip.

Code: Alles auswählen

procedure TForm1.SrcDstFileLViewCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
  var Status : ^byte;
begin
  Status := Item.Data;
  case Status^ of
    1:  Sender.Canvas.Brush.Color := clGreen;
    2 : Sender.Canvas.Brush.Color := clYellow;
    3 : Sender.Canvas.Brush.Color := $0000FF;
    else Sender.Canvas.Brush.Color := clBlue;
  end;
end; 
Über TListItem.Data wird beim Erstellen der ListView pro Listitem ein Byte- Wert gesetzt, der letztlich dazu verwendet werden soll, die Hintergrundfarbe der einzelnen Zeile zu beeinflussen. In der TForm1.Create- Methode habe ich die Property "OwnerDraw" der ListView auf "false" gesetzt. Aber keine der Farben wird angewendet. Was mache ich da falsch?

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 375
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von Jorg3000 »

Guten Morgen!
Das bloße Setzen der Pinselfarbe reicht nicht, ich glaube man muss auch den Bereich füllen.
In einem Delphi-Programm hatte ich das mit folgender Zeile gemacht:

Code: Alles auswählen

Sender.Canvas.FillRect(Item.DisplayRect(drBounds));
Ich nehme an, dass es in Lazarus auch so funktioniert (nicht getestet).
Grüße, Jörg

Soner
Beiträge: 732
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von Soner »

Bei mir funktioniert es unter Windows 11 und Lazarus 3.4:

Code: Alles auswählen

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if (Item.Index mod 2)=0 then  Sender.Canvas.Brush.Color:=clYellow
  else Sender.Canvas.Brush.Color:=clWindow;
end;
Listview
Listview
Screenshot 2025-05-22 100725.png (3.7 KiB) 188 mal betrachtet

Benutzeravatar
Zvoni
Beiträge: 378
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von Zvoni »

HobbyDev hat geschrieben: Mi 21. Mai 2025, 21:52 Über TListItem.Data wird beim Erstellen der ListView pro Listitem ein Byte- Wert gesetzt, der letztlich dazu verwendet werden soll, die Hintergrundfarbe der einzelnen Zeile zu beeinflussen. In der TForm1.Create- Methode habe ich die Property "OwnerDraw" der ListView auf "false" gesetzt. Aber keine der Farben wird angewendet. Was mache ich da falsch?
Setze "OwnerDraw" auf True?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
theo
Beiträge: 10897
Registriert: Mo 11. Sep 2006, 19:01

Re: TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von theo »

Auf GTK und Qt muss man schon selber füllen.
Ist nicht ganz so simpel. So scheint es erst einmal zu funktionieren im ViewStyle=vsReport.
Das müsste man aber sicher noch zu Ende tüfteln.

Code: Alles auswählen

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: boolean);
begin
  if (Item.Index mod 2) = 0 then  Sender.Canvas.Brush.Color := clYellow
  else
    Sender.Canvas.Brush.Color := clWindow;
  if not (cdsSelected in State) then
    Sender.Canvas.FillRect(Item.DisplayRect(drBounds));
  DefaultDraw := True;
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: integer; State: TCustomDrawState; var DefaultDraw: boolean);
begin
  if (Item.Index mod 2) = 0 then  Sender.Canvas.Brush.Color := clYellow
  else
    Sender.Canvas.Brush.Color := clWindow;
  if not (cdsSelected in State) then
    Sender.Canvas.FillRect(Item.DisplayRectSubItem(Subitem, drBounds));
  DefaultDraw := True;
end;   

HobbyDev
Beiträge: 2
Registriert: Fr 31. Jan 2025, 10:30

gelöst: TListView und CustomDrawItem Zeilen unterschiedlich farblich füllen geht nicht

Beitrag von HobbyDev »

Danke, das hat nun auch bei mir geholfen... :lol:

Den Tipp mit OwnerDraw := False habe ich von dieser Seitehttps://wiki.lazarus.freepascal.org/TLi ... om_drawing. Und auf keiner Seite habe ich den Tipp mit FillRect(Item.DisplayRect(drBounds) gefunden.

Perfekt! Danke!

Antworten