Listview ganze Spalte färben
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:
Habe ich bei
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;
Code:
keinen Wert zb '' färbt er die Zeile Rot
Item.SubItems[0] = ''
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 ? |
AW: Listview ganze Spalte färben
Zitat:
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; |
AW: Listview ganze Spalte färben
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:
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...
procedure TForm1.ListView2CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); begin If Item.SubItems[0] = 'aa' then Listview2.Brush.Color := clRed; end; auch muss ich das fenster einmal klein machen und wieder gross damit die Farbe angezeigt wird ... bei den Zeilen funktioniert das sofort ?!?!?! |
AW: Listview ganze Spalte färben
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 |
AW: Listview ganze Spalte färben
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:
ok (SubItem=0)macht er 2te und 3te Spalten Grün
//if (Item=nil) then Exit;
with Sender.Canvas.Brush do if (SubItem=1) then Color:=clred else Color:=cllime; end; (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 |
AW: Listview ganze Spalte färben
Liste der Anhänge anzeigen (Anzahl: 1)
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. |
AW: Listview ganze Spalte färben
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:
oder spricht da etwas gegen ???
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; |
AW: Listview ganze Spalte färben
Zitat:
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. |
AW: Listview ganze Spalte färben
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 |
AW: Listview ganze Spalte färben
Dann geh ich mal etwas auf Deine Fragen ein:
Zitat:
Zitat:
Zitat:
Zitat:
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 |
AW: Listview ganze Spalte färben
ok dann bin ich ja doch gar nicht so weit weg von deinem
Du machst es mit der prozedur und dem array die eigene Prozedur wollte er schon nicht ich dachte ich hätte sie nicht initalisiert Beispiel.. Geh ich auf listview events und mach einen doppelklick fügt er oben die Prozedur automatisch ein und unten zwischen begin und end sag ich ihm was ich will (EDIT: Ahh Vegiss das ich bin doch zu doof ich hab zwar die Prozedur zwischen public eingefügt aber die Zeile drüber hatte ich voll vergessen... das viel mir jetzt auf wo ich das beispiel schrieb urgssss)
Delphi-Quellcode:
{Event1 das meinte ich mit Block1}
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Item.SubItems[0] then Color:=clred;{<<..Die Zeile so Korrekt?} end; {Event2 das meinte ich mit Block2} procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean); begin 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; |
AW: Listview ganze Spalte färben
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, einfach nur meinen Event Code kopieren ohne Events zuzuweisen das klappt dann wohl nicht.
Nimm einfach mein Beispiel aus dem Anhang als Vorlage. Ps: Das einzige was Du zu machen hast ist in der Zeile wo ich Spalte 1 Spalte 2 usw geschrieben habe -> passe dort deine Wunschfarbe an und wenn Du mehr möchtest musst Du das Array [0..2] erweitern. |
AW: Listview ganze Spalte färben
Ok das mach ich später zu hause bin noch auf der Arbeit
hab hier nichts zum öffnen das ist auf dem anderen pc aber bitte eine letzte Frage was muss den bei der ersten Spalte anstatt item.subitems[] drin stehen ?
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Item.SubItems[0] then Color:=clred;{<<..so ist das sicher Falsch weil die erste spalte ja caption nicht supitem ist} end; |
AW: Listview ganze Spalte färben
Zitat:
Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Item <> Nil then Sender.Canvas.Brush.Color := clRed; end; |
AW: Listview ganze Spalte färben
OK dann nochmal vielen vielen Dank für deine Zeit UND deine Geduld!
Mhh ich finde beide Wege schön, je nachdem was man braucht Nur Spalte 1 mein Weg nur subitems deinen oder meinen Weg bei Spalte 1 und 2+x ... 100% deinen Weg ist übersichtlicher :) lg Timo Edit: Deinen werd ich sicher auch verwenden die Zeit war nicht umsonst :) |
AW: Listview ganze Spalte färben
Gern geschehen, ob Du jetzt meine Variante verwendest oder irgendwie anders ans Ziel kommst, das ist ja das schöne an Pascal das es einem mehr oder minder frei steht wie es denn tatsächlich abzulaufen hat.
Aber der Vcl was machen zu lassen wofür sie nicht gedacht ist kann auch nach hinten losgehen. Ob Du nun ein Event oder zwei aufrufst, ob mit oder ohne eigener Methode, die .exe Dateigröße sowie die Geschwindigkeit werden nicht darunter leiden. Wenn Du später mal mehr Spalten haben willst brauchst Du bei Verwendung meines Source nur an einer Sache fummeln, der eigenen Methode. Wie ich es machen würde kann man ja dem Archiv entnehmen, ggf den Namespace aktualisieren, das ist mit Delphi 5 rasch dahin hingekritzelt worden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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