Farbe Listbox Einträge...
-
tschuldigung aber das verstehe ich jetzt beim besten Willen net...

Was heißt das konkret??
wenn ich Index verändere passiert au nix...
ich peils einfach net, nicht den blaßesten schimmer...
-
Ab dem ersten Buttonklick bleibt txtcol unverändert. Und weil txtcol deine Bedingung ist ändert sich auch die Farbe nicht mehr.
-
hab den Quelltext nochmal geändert...
Also: der erste Eintrag ist grün, drücke ich auf dem zweiten kommt noch ein Eintrag hinzu und beide werden rot, ich möchte aber gerne das der erste weiterhin grün bleibt...
Was muss ich dafür machen?//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TColor LBColors[3] = {clBlue, clGreen, clRed}; int txtcol=1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { ListBox1->Canvas->Font->Color = LBColors[txtcol]; ListBox1->Canvas->TextRect(Rect, Rect.Left, Rect.Top, ListBox1->Items->Strings[0]); if(State.Contains(odFocused)) ListBox1->Canvas->DrawFocusRect(Rect); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ListBox1->Items->Add("Text"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { txtcol=2; ListBox1->Items->Add("Text"); } //---------------------------------------------------------------------------
-
Hallo
du hastdas Prinzip noch nicht verstanden. Der Draw-Event wird nicht einmal beim Einfügen eines Items usgeführt, und das Ergebnis bleibt dann fortan gleich.
Sondern der Draw-Event wird jedesmal ausgeführt, wenn ein Item neugezeichnet werden muß. Deshalb muß die Farbwahl nicht beim Einfügen eines Items, sondern im Event selber ausgeführt werden. Beim Einfügen kann maximal die Auswahl vorbereitet werden.
Du must also dafür sorgen, das auch im Event noch aus dem Item heraus festgestellt werden kann welche Farbe es hat, unabhängig davon ob außerhalb irgendwelche nicht-Item bezogenen Werte gesetzt sind.
Am einfachsten wäre das hier
#include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; const TColor LBColors[3] = {clBlue, clGreen, clRed}; //int txtcol=1; Keine globalen Variablen verwenden! //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { ListBox1->Canvas->Font->Color = LBColors[ListBox1->ItemIndex % 3]; ListBox1->Canvas->TextRect(Rect, Rect.Left, Rect.Top, ListBox1->Items->Strings[0]); if(State.Contains(odFocused)) ListBox1->Canvas->DrawFocusRect(Rect); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ListBox1->Items->Add("Text"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ListBox1->Items->Add("Text"); } //---------------------------------------------------------------------------So wird jede der drei Farben abwechselnd für die Items verwendet.
bis bald
akari
-
Wenn die Zeilennummer das Kriterium sein soll dann musst du halt auch auf die Zeilennummer hin prüfen, um die aktuell zu zeichnende Farbe festzulegen.
Wie der Name sagt: das OnDrawItem wird für jedes Item (hier also für jede Zeile) aufgerufen, und der Index (die Zeilennummer) wird passenderweise als Parameter der Funktion übergeben.
Versuch doch erst nochmal, nachzuvollziehen, was das FAQ-Beispiel genau macht.
-
d.h. ich muss den parameter ändern...
aber wie?
-
Nicht ändern, auslesen bzw. benutzen. Wie im FAQ-Beispiel.
-
es macht doch nur sinn ihn "auszulesen" und zu "benutzen" wenn etwas passieren soll wenn ich auf ein Item geklickt habe...
Ich will doch aber von Anfang an unterschiedliche Farben...Kannst du mir vll nen kleines Beispiel coden?
es reicht auch schon eine Zeile, wenn sie das nötige erklärt, ich kapiers nämlich ehrlich gesagt gerade garnicht, tut mir ja au irgendwie leid weil ihr euch alle Mühe gebt mich draufzubringen was ich falsch mache...
-
Was genau verstehst du am FAQ-Beispiel nicht? Offenbar funktioniert es doch, ohne Klicken oder sonstwas.
-
hi,
du befindest dich im Event DrawItem nicht im Event OnClick, somit macht es schon Sinn den Parameter Index "auszulesen", oder zu "benutzen". Er wird doch in dem Moment benötigt wenn die Funktion DrawItem aufgerufen wird. Und das passiert jedesmal wenn du der ListBox ein Item hinzufügst und nicht wenn du darauf klickst!
mfg, Micha!
-
was ich nicht kapiere ist:
der erste Eintrag wird grün gezeichnet... is ja logisch
wenn jetzt der 2te Eintrag geschrieben wir habe ich die Farbe auf rot gestellt, Index müsste doch jetzt auch auf 1 stehen so das dieses neue Element rot wird, warum wird aber das erste Element dann auch rot??Werden bei Index alle vorhandenen Werte bei onDraw durchlaufen??
-
OnDrawItem wird immer beim Neuzeichnen der Listbox aufgerufen. Also für alle darin vorkommenden Items. Index kennzeichnet dabei den Item der gerade gezeichnet werden soll. Du mußt also deine Farbe entsprechend dem Wert von Index in OnDrawItem anpassen.
-
Hallo
Eine Veränderung der Daten erfordert potentiel ein neuzeichnen der gesamten Items, nicht nur des Neuen. Deshalb wird der OnDraw-Event ausgeführt, und zwar nicht nur für das neue, sondern für alle sichtbaren. Deshalb kannst du keine absoluten Farbangaben im Draw-Event verwenden, sondern die Farbe muß immer in Abhängigkeit des Items bzw. des Index sein.
Du darfst den Draw-Event nicht linear und abhängig zu anderen Methoden senden. Sondern im Draw-Event must du arbeiten, nur auf Basis der Daten, die durch in den Parametern übergebene Itemindex repreäsentiert werden.
Das bedeutet jede (itemabhängige) Farbbestimmung muß zwangsläufig mit der Auswertung des ItemIndex anfangen.bis bald
akari