TListView Einträge farbig machen



  • 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.



  • Danke, das funktioniert.

    Leider ist das sehr unpraktisch, da ich dann die gesamten TListItems mit ihren ganzen Funktionen und Erscheinungsformen nachempfinden müsste.



  • Hallo,

    Hast Du das schon probiert :

    void __fastcall TForm1::ListView1CustomDrawItem(TCustomListView *Sender, TListItem *Item, TCustomDrawState State, bool &DefaultDraw)
    {
    Sender->Canvas->Font->Color  = clBlack;
    Sender->Canvas->Brush->Color = clRed;
    }
    

    Bei VCL-Projekten funktioniert es.
    OwnerDraw ist false

    Nash



  • Bei CLX hat Sender leider nicht die Eigentschaft Canvas nicht.

    In was muss ich das casten?



  • Hallo

    wie in diesem Thread auf Seite 2 bereits beschrieben ist, ist in der CLX die Canvas-Fläche ein Extra-Parameter der Events.

    bis bald
    akari



  • Wie auch bereits im Thread beschrieben, bringt die Manipulation des Canvas-Parameter keine Änderung.

    Ich glaube, wie drehen uns im Kreis.



  • void __fastcall TForm1::ListView1CustomDrawItem(TCustomViewControl *Sender,
          TCustomViewItem *Item, TCanvas *Canvas, const TRect &Rect,
          TCustomDrawState State, TCustomDrawStage Stage, bool &DefaultDraw)
    {
      Canvas->Brush->Color = clLime;
      Canvas->FillRect(Rect);
    }
    

    Funktioniert problemlos.


Anmelden zum Antworten