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/)
-   -   Delphi Einzelne Zelle in TListView färben, Denkfehler? (https://www.delphipraxis.net/185050-einzelne-zelle-tlistview-faerben-denkfehler.html)

Dalai 11. Mai 2015 15:12

Einzelne Zelle in TListView färben, Denkfehler?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo an alle :).

Gegeben sei dieser Code:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
    if (SubItem = 1) AND (Item.Index = 1) then
        Sender.Canvas.Brush.Color:= clGreen
(*    else
        Sender.Canvas.Brush.Color:= clWindow;*)
end;
Was erwartet man? Doch eigentlich, dass nur die Zelle mit Zeilenindex=1 und Spaltenindex=1 grün gefärbt wird. Was passiert stattdessen? Es werden alle Zellen mit Zeilenindex=1 und Spaltenindex>=1 gefärbt! Siehe Bild im Anhang. Das Verhalten ist im D5 und XE2 identisch.

Also hab ich mit dem auskommentierten
Delphi-Quellcode:
else
-Zweig und CustomDrawItem und ähnlichen Sachen rumgespielt, aber nichts führt zum gewünschten Ergebnis. Hab ich einen Denkfehler? Wenn ja, kann mir den bitte jemand zeigen?

Was ich nicht möchte, ist ein OwnerDraw=True, weil dadurch das Theming flöten geht.

MfG Dalai

Popov 11. Mai 2015 16:04

AW: Einzelne Zelle in TListView färben, Denkfehler?
 
Versuch es mal so:

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if (SubItem = 1) AND (Item.Index = 1) then
    Sender.Canvas.Brush.Color := clGreen;

  Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color + 1;
  Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color - 1;
end;
oder so
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if (SubItem = 1) AND (Item.Index = 1) then
    Sender.Canvas.Brush.Color := clGreen
  else
    Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color + 1;
    Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color - 1;
  end;
end;
oder so
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if Item.Index = 1 then
    case SubItem of
    1: Sender.Canvas.Brush.Color := clGreen;
    else
      Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color + 1;
      Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color - 1;
    end;
end;
Ich hab mich mit den Zeilen
Delphi-Quellcode:
      Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color + 1;
      Sender.Canvas.Brush.Color:= Sender.Canvas.Brush.Color - 1;
kurz ausweinender gesetzt, aber nicht wirklich rausgefunden was sie bewirken. Auf jeden Fall korrigieren sie wieder die Brush Farbe.

Dalai 11. Mai 2015 16:23

AW: Einzelne Zelle in TListView färben, Denkfehler?
 
:shock: Das funktioniert. Verstehen tue ich das aber nicht. Auch wenn ich im Quelltext nichts derartiges erkenne, so ist es ja meist so, dass der Setter nur arbeitet, wenn der reinkommende Wert abweicht (mache ich auch so). Demzufolge wirkt das Setzen von
Delphi-Quellcode:
Brush.Color:=clWindow
nicht, weil es bereits clWindow ist. Aber warum wird dann mit clGreen gezeichnet? :gruebel:

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 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