AGB  ·  Datenschutz  ·  Impressum  







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

Listview ganze Spalte färben

Ein Thema von Amenovis · begonnen am 19. Nov 2018 · letzter Beitrag vom 21. Nov 2018
Antwort Antwort
Seite 1 von 2  1 2      
Amenovis

Registriert seit: 17. Nov 2011
52 Beiträge
 
#1

Listview ganze Spalte färben

  Alt 19. Nov 2018, 23:16
Ich habe gesehen das es das Öfter gibt als Fragestellung

nur bin ich mir über die Unterschiede nicht im klaren und hoffe da um Hilfe

A) Ganze Zeile färben aufgrund eines Wertes einer Zeile funktioniert tadelos

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
//if (Item=nil) then Exit;
with Sender.Canvas.Brush do
if Item.SubItems[0] = 'then Color:=clred
else Color:=cllime;
end;
Habe ich bei
Code:
Item.SubItems[0] = ''
keinen Wert zb '' färbt er die Zeile Rot
hab ich einen Wert zb 'Wert' färbt er die Zeile Grün

Wie mach ich es aber bei einer Spalte oder bei zwei Spalten ... Beispiel

Tabelle X

ID | Name | Nachname |

ID keine Farbe
Name Grün
Nachname Gelb ???

Ich Vermute das hängt mit den unterschiedlichen CustonDraw Ereignissen zusammen

OnCustomDraw
OnCustomDrawItem
OnCustomDrawSubitem

Wenn nicht was unterscheidet die Drei ?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Listview ganze Spalte färben

  Alt 20. Nov 2018, 00:19
ID | Name | Nachname |

ID keine Farbe
Name Grün
Nachname Gelb ???

So bekommst Du Grün und Gelb hin, im OnCustomDrawSubItem Event.
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
 if (Item=nil) then
   Exit;
 with Sender.Canvas do
   begin
      case SubItem of
        0: Font.Color := clGreen;
        1: Font.Color := clYellow;
      end;
   end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Amenovis

Registriert seit: 17. Nov 2011
52 Beiträge
 
#3

AW: Listview ganze Spalte färben

  Alt 20. Nov 2018, 00:25
ehm ok aber mit Font wird denk ich die SchriftFarbe geändert oder nicht ???

Mir geht es um den Hintergrund...

Ich hab das hier probiert

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

 begin
  If Item.SubItems[0] = 'aathen
    Listview2.Brush.Color := clRed;
end;
oder die Zeile mit If Item.SubItems[0] = 'aa' then auch geändert in If (SubItem=0) und Subitem(0) usw usw usw mit wert aa ohne wert aa nur'' ... komischer weise färbt er immer nur die Spalten in denen keine werte stehen also die leeren unbenutzen und dort wo werte drin sind bleibt es weiss...

auch muss ich das fenster einmal klein machen und wieder gross damit die Farbe angezeigt wird ... bei den Zeilen funktioniert das sofort ?!?!?!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Listview ganze Spalte färben

  Alt 20. Nov 2018, 00:34
Dann nimm doch einfach das richtige SubItem.. wenn du mehrere hast dann sollte sich der Index auch erhöhen oder?
Du verwendest aber immer nur 0

@KodeZwerg hat es dir doch gezeigt wie es geht oder verwendet er bei jedem Item 0 ?

gruss
  Mit Zitat antworten Zitat
Amenovis

Registriert seit: 17. Nov 2011
52 Beiträge
 
#5

AW: Listview ganze Spalte färben

  Alt 20. Nov 2018, 01:19
hab ich auch gemacht mit 0 1 und 2 ... mir ging es erstmal darum das sich eine spalte färbt in dem werte stehen (hab beim ersten mal irgendwas falsch gemacht beim löschen und neu schreiben ging es)

und wofür stehen sender.... canvas.... brush....

item.subitems[0]zweite spalte in listview
item.subitems[1]dritte spalte in listview

Edit:Sender.Canvas statt Sender.Canvas.Brush war eine mega lightshow epileptiker dürfen das NICHT! testen..

Edit2:
Delphi-Quellcode:
//if (Item=nil) then Exit;
with Sender.Canvas.Brush do
if (SubItem=1) then Color:=clred
else Color:=cllime;
end;
ok (SubItem=0)macht er 2te und 3te Spalten Grün
(SubItem=1)macht er Spalte2 Rot die 3te Grün
(SubItem=2)macht er die Umkehrung Grün Rot

verstehe die Logik dahinter nicht so ganz mhh dachte er zählt bei 0.... dann hätte er doch bei (0) die 2te rot machen müssen und bei (1) die 3te spalte rot...Jetzt bin ich wieder verwirrt mhh

dachte caption ist separat dann subitem 0 ist in listview 2te spalte und 1 in listview 3te spalte

Aber ok die eigentliche Frage ist geklärt... Die syntax bleibt fast identisch abgesehen von der art des draws die man wählt...

OnCustomDraw...........färbt vermutlich Spalte 1
OnCustomDrawItem.......färbt Zeile
OnCustomDrawSubitem....färbt Spalten 2,3,4,n

Geändert von Amenovis (20. Nov 2018 um 02:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Listview ganze Spalte färben

  Alt 20. Nov 2018, 12:55
Hier ein komplettes Beispiel für Deine Einfärbung.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
  private
    { Private declarations }
    procedure SetLVColumnColour( ListView: TCustomListView; Column: Integer );
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

// mit dieser methode ändern wir die Hintergrund-Farbe
// Als eingabe eine Listview und die Spalte angeben
procedure TForm1.SetLVColumnColour( ListView: TCustomListView; Column: Integer );
const
  cColors: array[0..2] of TColor = ( clWindow, clGreen, clYellow );
begin
  ListView.Canvas.Brush.Color := cColors[Column];
end;


// Hier wird die Hauptspalte eingefärbt
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  SetLVColumnColour( Sender, 0 );
end;

// Hier werden Sub-Spalten eingefärbt
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
  if SubItem = 0 then Exit;
  SetLVColumnColour( Sender, SubItem );
end;

end.
Miniaturansicht angehängter Grafiken
form1-20_11.jpg  
Gruß vom KodeZwerg

Geändert von KodeZwerg (20. Nov 2018 um 13:26 Uhr) Grund: updated
  Mit Zitat antworten Zitat
Amenovis

Registriert seit: 17. Nov 2011
52 Beiträge
 
#7

AW: Listview ganze Spalte färben

  Alt 21. Nov 2018, 21:33
OK bei deiner Version brauch ich 3 Blöcke..

Eine eigene Prozedur
Dann ein Block für die Erste Spalte (Caption)
Dann ein Block für die 2te bis xte Spalte (Subitems).

Geht das nicht theoretisch auch ohne eigene Prozedur

Ein Block für die erste Caption Spalte
und ein Block für Subitems

Wie der erste Block aussehen müsste weiss ich nun nicht aber bei subitems ginge doch

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
//if (Item=nil) then Exit;
with Sender.Canvas.Brush do
if Item.SubItems[0] then Color:=clred else
if Item.SubItems[1] then Color:=clgreen else
if Item.SubItems[2] then Color:=clyellow else
if Item.SubItems[3] then Color:=clgray else
end;
oder spricht da etwas gegen ???
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Listview ganze Spalte färben

  Alt 21. Nov 2018, 21:46
oder spricht da etwas gegen ???
Ja. Du scheinst nicht richtig zu lesen obwohl ich es schon zum zweiten mal erwähne.

Frage:
Wo färbe ich Spalte 1 ?
Wo färbe ich Spalte 2 ?
Wo färbe ich Spalte 3 ?
Und am wichtigsten -> Warum tue ich das so wie ich es tue?

/ironie
Und bitte, gern geschehen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Amenovis

Registriert seit: 17. Nov 2011
52 Beiträge
 
#9

AW: Listview ganze Spalte färben

  Alt 21. Nov 2018, 21:51
Ehm ich möchte dich nicht veräppeln oder dir deine Zeit stehlen ich lese was du schreibst und bin darüber sehr Dankbar... Ich habe auch deine Zeilen verstanden. Nur wenn ich es nachmache bei mir im Programm macht er es nicht.

Es stellt sich mir die Frage warum mit eigener Prozedur das versteh ich wirklich nicht... Tut mir leid das ich zu blöde bin

Edit: SetLVColumnColour( Sender, 0 ); färbt spalte 1 aus der case anweisung der prozedur also weiss

der zweite block färbt die subitems

warum du es gerade so tust keine ahnung

und noch ne frage wie färbst du den die erste spalte ohne case und ohne prozedur oder nutzt du das immer auch dann wenn du nur die erste spalte färben willst

Geändert von Amenovis (21. Nov 2018 um 21:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Listview ganze Spalte färben

  Alt 21. Nov 2018, 22:19
Dann geh ich mal etwas auf Deine Fragen ein:

OK bei deiner Version brauch ich 3 Blöcke..

Eine eigene Prozedur
Dann ein Block für die Erste Spalte (Caption)
Dann ein Block für die 2te bis xte Spalte (Subitems).

Geht das nicht theoretisch auch ohne eigene Prozedur
Wie Du ans Ziel gelangst liegt ausschließlich an Dir, Du kannst gerne die benötigten Teile in entsprechende Events kopieren.

Ehm ich möchte dich nicht veräppeln oder dir deine Zeit stehlen ich lese was du schreibst und bin darüber sehr Dankbar... Ich habe auch deine Zeilen verstanden. Nur wenn ich es nachmache bei mir im Programm macht er es nicht.
Zeige mir Dein Source dann sieht man wo Du was falsch machst, wenn Du mein Source von oben 1:1 kopierst und benutzt funktioniert alles nach besten Wissen und Gewissen.

Es stellt sich mir die Frage warum mit eigener Prozedur das versteh ich wirklich nicht... Tut mir leid das ich zu blöde bin
Das dient mir nur dazu um nicht das benötigte doppelt in den Events schreiben zu müssen und sollte in erster Linie Dir helfen, da die Farben nach Spalten angeordnet sind und so Fehler vermieden werden.

...
warum du es gerade so tust keine ahnung
...
und noch ne frage wie färbst du den die erste spalte ohne case und ohne prozedur oder nutzt du das immer auch dann wenn du nur die erste spalte färben willst
Die VCL sieht vor das man bestimmt Dinge in bestimmten Events ausführt.
Da gibt es, wie Du bereits selbst gemerkt hast mehrere Events.
OnCustomDrawItem dient dabei dem Hauptelement (Spalte 1) Aufmerksamkeit zukommen zu lassen.
OnCustomDrawSubItem wird sich dann vermutlich um alles nach Spalte 1 kümmern.
OnCustomDraw benutze ich wenn ich zum Beispiel ein Hintergrundbild haben möchte.

Worauf ich hinaus will ist, benutze für das was Du erreichen möchtest das entsprechende Event.
Ein Erzwingen ist sicherlich möglich aber ob es Sinnvoll wäre mag ich bezweifeln.

Grüße
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:47 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