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 ListView einzelnes Item färben (https://www.delphipraxis.net/50570-listview-einzelnes-item-faerben.html)

citybreaker 27. Jul 2005 19:52


ListView einzelnes Item färben
 
Hallo,
ich hät da mal wieder ein Problem unzwar färbe ich meine Items
in TLIstView grün.

Alerdings möchte ich bei einer Spalte Rot verwenden wenn dort "Ja - ..."
und nicht "Nein" drinne steht.

Also habe ich folgendes versucht, was wieder einmal nicht klappt.

Delphi-Quellcode:
procedure TMainFrm.LViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var i,j: integer;
begin
  j := 1;

  with Sender.Canvas do begin
    if SubItem = 1 then Font.Color := clGreen;
    if SubItem = 2 then Font.Color := clGreen;
    if SubItem = 8 then Font.Color := clGreen;
  end;

  for i := 0 to LView.Items.Count-1 do
     j := Pos('Ja',LView.Items.Item[i].Caption);

  if (j <> 0) then
    if SubItem = 7 then Sender.Canvas.Font.Color := clRed
    else Sender.Canvas.Font.Color := clGreen;
end;

marabu 27. Jul 2005 20:24

Re: ListView einzelnes Item färben
 
Hallo Alexander,

müsste dein Code nicht eher so aussehen (ungetestet)?

Delphi-Quellcode:
procedure TMainFrm.LViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  with Sender.Canvas do begin
    case SubItem of
      1, 2, 8:
        Font.Color := clGreen;
      7:
        begin
          if Uppercase(Item.Caption) = 'JA'
            then Font.Color := clGreen
            else Font.Color := clRed;
        end;
      // else Font.Color := clSaved;
    end;
  end;
end;
Grüße vom marabu

citybreaker 27. Jul 2005 20:37

Re: ListView einzelnes Item färben
 
Ne, geht leider nicht. Wird ja als auch nein rot dargestellt.

Sharky 27. Jul 2005 20:49

Re: ListView einzelnes Item färben
 
Zitat:

Zitat von citybreaker
Ne, geht leider nicht. Wird ja als auch nein rot dargestellt.

Hmmm... wenn ich den Code von marabu richtig lese wird dort ja "nur" geprüft ob in der ersten Spalte (item.caption) ein Ja oder Nein steht. Wenn es bei dir aber in einem SubItem steht musst Du das if UpperCase ... dahingehen ändern.

Oder sehe ich das eben falsch?

citybreaker 28. Jul 2005 19:17

Re: ListView einzelnes Item färben
 
Ne, er prüft das doch in der 7. Spalte oder nicht?
Schließlich ist die if Abfrage und das Uppercase
an der stelle
Delphi-Quellcode:
  case SubItem of
   ...
      7:
        begin
          if Uppercase(Item.Caption) = 'JA'
            then Font.Color := clGreen
            else Font.Color := clRed;
        end;
   ...
Oder ich versteh den Code nicht. Kann ja auch sein. ;)

marabu 28. Jul 2005 19:21

Re: ListView einzelnes Item färben
 
Ich färbe die Spalte 7 in Abhängigkeit vom Inhalt der Spalte 0 (Caption) - so wie ich es im Original-Code gesehen habe. Sharky hat aber eher auf den Text geachtet und jetzt musst du entscheiden, welcher Inhalt maßgeblich für das Einfärben sein soll.

marabu

citybreaker 28. Jul 2005 19:35

Re: ListView einzelnes Item färben
 
Ups ne dann hab ich mich falsch ausgedrückt. Das Ja oder Nein steht auch
in der Spalte 7.

Sharky 29. Jul 2005 06:12

Re: ListView einzelnes Item färben
 
Zitat:

Zitat von citybreaker
... Oder ich versteh den Code nicht. Kann ja auch sein. ;)

Ich versuche es mal zu erklären.
marabu verwendet das Ereigniss Delphi-Referenz durchsuchenOnCustomDrawSubItem. Dies wird beim zeichen von jedem einzelen SubItem aufgerufen.
Jetzt prüft er welches SubItem gezeichnet wird 1/2/8 oder 7.
Wenn die SubItem 1/2/8 gezeichnet werden setzt er deren Fontfarbe auf grün.
Wenn SubItem 7 (was übrigens die achte Spalte ist) gezeichnet wird prüft er ob im Item (Spalte 1, kein SubItem) das Wort "JA" steht und setzt dann die Farbe auf grün und ansonsten auf rot.

Da Du jedoch den Inhal eines SubItems (Spalte 7) prüfe möchtest musst Du auch den Inhalt des SubItems und nicht des Items prüfen ;-)

Hier mal der Code wie er für deinen Fall gehen sollte.
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: integer; State: TCustomDrawState; var DefaultDraw: boolean);
begin
  with Sender.Canvas do
    case SubItem of
      1, 2, 8:
        Font.Color := clGreen;
      6: // Wenn Spalte 7 gezeichnet wird dann...
        if Uppercase(Item.SubItems[SubItem - 1]) = 'JA' then // In Spalte 7 steht "JA"..
          Font.Color := clGreen
        else
          Font.Color := clRed;
      else Font.Color := clBlack; // Für alle andere SubItems diese Farbe
    end;
end;


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