Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ListView SubItem Background Color (https://www.delphipraxis.net/184073-listview-subitem-background-color.html)

SyntaxXx 23. Feb 2015 20:49

ListView SubItem Background Color
 
Guten Abend zusammen,
ich benutze zur Zeit ein TListView mit 3 SubItems.

Nun möchte ich, wenn der Text vom mittleren SubItem = "Test" ist, dass dieses eine andere Farbe bekommt.
Allerdings bekomme ich es nicht hin.

Hier mal mein aktueller Stand:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if SubItem = 1 then
  begin
    if Item.SubItems.Strings[1] = 'Test' then
    begin
      Sender.Canvas.Brush.Color := TColor($CCFFCC);
    end
    else
    begin
      Sender.Canvas.Brush.Color := TColor($CCCCFF);
    end;
  end
  else
  begin
    Sender.Canvas.Brush.Color := clWindow;
  end;
end;
So wie es jetzt ist, werden jedoch alle 3 SubItems mit der Farbe $CCFFCC versehen.
Wenn ich auf SubItem = 2 prüfe, sind die letzten beiden in der Farbe.
Und bei SubItem = 3 nur das Letzte.

Ich verstehe den Zusammenhang von SubItem nicht.
Ich bin davon ausgegangen, das SubItem das aktuelle SubItem ist und das bei 3 SubItems das Event 3 mal aufgerufen wird.
Deshalb war meine Überlegung, dass wenn SubItem = 1 ist (erstes SubItem = Index 0) nur das Mittlere eine andere Farbe bekommt.

Aber dem ist nicht so.
Könntet ihr mich aufklären?

ConnorMcLeod 24. Feb 2015 07:14

AW: ListView SubItem Background Color
 
Die eingestellte Farbe bleibt erhalten und clWindow greift nicht (weshalb, das ist mir auch unklar). Wenn man es auf irgendetwas ändert und danach zurück auf clWindow, dann funktionierts:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  case SubItem of
    1: Sender.Canvas.Brush.Color := clRed;
    2: Sender.Canvas.Brush.Color := clLime;
    3: Sender.Canvas.Brush.Color := clBlue;
    else
      begin
        Sender.Canvas.Brush.Color := clPurple;
        Sender.Canvas.Brush.Color := clWindow;
      end;
  end; // case SubItem of
end;

EWeiss 24. Feb 2015 07:27

AW: ListView SubItem Background Color
 
wie sieht es aus wenn man PtInRect verwendet und dann die Farbe setzt ?

gruss

BadenPower 24. Feb 2015 09:26

AW: ListView SubItem Background Color
 
So wirds gemacht:

Delphi-Quellcode:
procedure TF_DevelopTest.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
begin

  if ((SubItem = 2) and (Item.SubItems.Count > 1)) then
   begin
    if (Item.SubItems.Strings[1] = 'Test') then
     begin
      Sender.Canvas.Brush.Color := $CCFFCC;
     end
    else
     begin
      Sender.Canvas.Brush.Color := $CCCCFF;
     end;
   end
  else
   begin
    Sender.Canvas.Brush.Color := $000000;
    Sender.Canvas.Brush.Color := TListView(Sender).Color;
   end;

end;
Du musst nur aufpassen:

SubItem fängt bei 1 an, dass heisst, dass Dein mittlerer Eintrag von 3 SubItems der Wert 2 ist, aber die Strings von 0 ab gezählt werden.


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