TListView Einträge farbig machen
-
Ich habe da ein TListView mit TListItems, welche ich gerne unterschiedlich färben möchte.
Wie mache ich das, ich finde keine passende Eigenschaft?
Danke!
-
Hallo
dazu must du die On...Draw... - Events benutzen. Je nachdem wie aufwendig deine Modifikationen sind, brauchst du einen anderen.
bis bald
akari
-
Danke, das scheint der richtige Weg zu sein.
Als ich das Ereignis "nDrawItem" des TListView eingefügt habe, meldet der Compiler eine Mehrdeutigkeit zwischen TOwnerDrawState und Windows::TOwnerDrawState bei folgender Funktion:
void __fastcall lst_charakteristikenDrawItem( TCustomListView *Sender, TListItem *Item, TCanvas *Canvas, const TRect &Rect, TOwnerDrawState State);
-
Hallo
kann ich nicht nachvollziehen. Wenn du den Event ordentlich über den Objektinspektor erstellst hast, funktioniert alles.
Such mal in der Header- und der Implementationsdatei nach Windows::TOwnerDrawState und lösche das Windows::bis bald
akari
-
achso:
ich verwende nicht VCL sondern CLX, vielleicht ist da wieder ein Bug ...
-
Also das Problem tritt bei neuen CLX-Projekten auf.
void __fastcall lst_charakteristikenDrawItem( TCustomListView *Sender, TListItem *Item, TCanvas *Canvas, const TRect &Rect, TOwnerDrawState State);Das Problem:
[C++ Fehler] Unit1.h(21): E2015 Mehrdeutigkeit zwischen 'TOwnerDrawState' und 'Windows::TOwnerDrawState'Wie mache ich dem Compiler nun klar, dass er das erste verwenden soll?
Danke!
-
Hallo
also in der VCL ist die Originaldeklaration mit Stdctrls::TOwnerDrawState State angegeben. Versuch mal den Namespace
bis bald
akari
-
Danke für die Hilfe, aber irgendwie habe ich gerade ein Brett vor dem Kopf:
Bei CLX ist es der Namespace Qstdctrls aus der Datei QStdCtrls.hpp.
In meine Header-Datei des Formulars habe ich nun das "using namespace Qstdctrls;" eingefügt:
// [..] #include <QStdCtrls.hpp> // [..] using namespace Qstdctrls; class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten // [..] void __fastcall ListView1DrawItem(TCustomListView *Sender, TListItem *Item, TCanvas *Canvas, const TRect &Rect, TOwnerDrawState State); // [..] };Das Problem bleibt, der Compiler meint immernoch in der Auswahl Windows::TOwnerDrawState zu haben.
Die Deklaration der Funktion kann ich nicht veraendern, da sie sonst gar nicht mehr angesprungen wird, da der RAD die als Fremdkoerper empfindet.Gibt's eine Lösung?
-
Hallo
nein, das using meinte ich nicht, sondern das
void __fastcall ListView1DrawItem(TCustomListView *Sender, TListItem *Item, TCanvas *Canvas, const TRect &Rect, Qstdctrls::TOwnerDrawState State);und das an allenstellen wo der Typ auftritt.
bis bald
akari
-
Vielen Dank für die Ideen.
Das habe ich auch zuerst versucht, aber Borland bemeckert dann direkt:
Die Methode ListView1DrawItem, auf die ListView1->OnDrawItem verweist, enthält eine inkompatible Parameterlist. Soll der Verweis entfernt werden?Fällt Jemand denn ein anderer Trick ein?
Vielleicht kann man den Namespace Windows:: unschädlich machen?Mir fällt akut leider nur ein eigener Event-Handler ein, wobei man dann mit Qt-Nachrichten operieren muss, welche eigentlich keinen Parameter haben und die Borland-Doku dazu schlicht falsch ist ... das würde total abartig und den Rahmen für farbige Listenelemente sprengen.
-
Hallo
und was passiert wenn du statt dem Qstdctrls:: dann eben Windows:: überall davor schreibst?
bis bald
akari
-
Scheint in der Tat ein Bug zu sein.
Benutz doch einfach OnCustomDrawItem, dat geiht.
-
Danke für die tatkräftige Unterstützung.
-- Windows:: mag er auch nicht.
-- Auf OnCustomDrawItem reagiert er - schön.
In einer Doku habe ich gefunden, dass ich nur den "Stift" einfärben muss und schon sollten die Elemente in dieser Farbe gezeichnet werden:
Canvas->Pen->Color= clRed;Wird es aber nicht.
-
Hallo
wenn du das so verwendest, wird auch das Canvas des Forms verwendet.
Das nutzt dir aber nichts, denn du willst den Canvas des ListViews ändern.Sender->Canvas->Pen->Color= clRed;bis bald
akari
-
Danke, aber mein Sender hat die Eigentschaft Canvas nicht:
void __fastcall TForm1::ListView1CustomDrawItem(TCustomViewControl *Sender, TCustomViewItem *Item, TCanvas *Canvas, const TRect &Rect, TCustomDrawState State, TCustomDrawStage Stage, bool &DefaultDraw) { }Langsam bereue ich es wirklich, dass ich CLX statt VCL verwendet habe.
-
Hallo
in der VCL hat TCustomListView die Eigenschaft Canvas...
aber auch kein Problem, du must statt Sender eben direkt das ListView nehmen, wie es als Control heißt.ListView1->Canvas->Pen->Color= clRed;/Edit : Braunstein : Ja... warum einfach wenns auch umständlich geht?

bis bald
akari
-
Das Canvas steht doch als Parameter in der Funktion ListView1CustomDrawItem. Nimm doch einfach das.
-
Hatte ich zuerst (s.o.) gemacht, das erzeugt keine Veränderung in der Farbe.
-
Welche Farbe willst du denn ändern? Pen ist ja eigentlich für Linien o.ä. zuständig. Für Schriften wäre ja eher Font->Color da und für den Hintergrund Brush->Color.
-
Ich möchte ursprünglich den Hintergrund rot machen, es wäre auch ok, wenn die Schrift rot machen könnte.
Canvas->Font->Color= clGreen; Canvas->Brush->Color= clYellow;Bringt aber auch keinen Effekt.
Ich habe zur Sicherheit mal OnDrawItem und OnDrawSubItem damit bestückt, auch kein Ergebnis.Bei der VCL funktioniert das so oder muss man dann nicht nur die Zeichenfarbe sondern auch dann selbst die Kästchen malen?
-
Bei einer ListBox müsste man das Kästchen selber malen. Wie das bei einer ListView und CustomOwnerDraw ist weiss ich nicht.
Du hast ja alle Infos um dein Kästchen selber zu malen (z.Bsp. mit FillRect), also machs doch einfach.