![]() |
Verschiedene Farben einzelner Items in ComboBox
Hallo,
ich möchte gerne mehrere ITEMS mit verschiedenen Hintergrundfarben in einer ComboBox darstellen. Leider habe ich bislang keine vernünftigen Lösungsansatz gefunden. Die einzelnen Einträge sollen hinterher zur Laufzeit erstellt werden und Text und Farbe aus der Datenbank übernehmen. Die Datenbank ist nicht das Problem, ich weiß einfach nicht wie die die einzelnen Items ansprechen soll.
Delphi-Quellcode:
Habe auch schon das Ereignis DrawItem probiert...ohne Erfolg...es ändert sich gar nichts.
...
combobox1.Items.Clear; combobox1.Items.Add('test1'); (z.B. rot) combobox1.Items.Add('test2'); (z.B. gelb) combobox1.Items.Add('test3'); (z.B. grün) ...
Delphi-Quellcode:
So ähnlich habe ich es bereits bei einem DBGrid hinbekommen, aber nicht mit der Combobox.
procedure TMHauptmaske.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); begin Combobox1.Canvas.Brush.Color := clred; end; Ich hoffe mir kann jemand weiter helfen. Vielen Dank. [edit=Matze][delphi]-Tags eingefügt, da der Themenersteller den Beitrag nicht mehr editieren kann. MfG, Matze[/edit] |
Re: Verschiedene Farben einzelner Items in ComboBox
Du musst nach dem Setzen der Farbe auch Zeichnen:
Delphi-Quellcode:
combobox1.canvas.fillrect(arect);
|
Re: Verschiedene Farben einzelner Items in ComboBox
Hattest du auch .OwnerDraw auf True gestellt?
ach nee, der Style muß csOwnerDrawFixed oder csOwnerDrawVariable sein. |
Re: Verschiedene Farben einzelner Items in ComboBox
vielen Dank für die raschen Antworten.
Ich habe es jetzt wie folgt ausprobiert: Style auf csOwnerDrawFixed gesetzt und testweise auch auf csOwnerDrawVariable
Delphi-Quellcode:
Allerdings ändert sich die Frabe erst wenn ich mit der maus über das item gehe,
procedure TMHauptmaske.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var i:integer; begin i:= combobox1.ItemIndex; if combobox1.Items.Strings[i] = 'test1' then combobox1.canvas.Brush.Color := clred; if combobox1.Items.Strings[i] = 'test2' then combobox1.canvas.Brush.Color := clyellow; if combobox1.Items.Strings[i] = 'test3' then combobox1.canvas.Brush.Color := clgreen; combobox1.canvas.FillRect(rect); end; vorher ist das ganze Feld weiß, es sollen aber direkt die entsprechneden Fraben angezeigt werden. Des Weiteren scheint dabei der Text auch in der Farbe erstellt zu werden, der soll aber schwarz bleiben. |
Re: Verschiedene Farben einzelner Items in ComboBox
Zitat:
und was den Text betrifft: Stell am Ende der Prozedur die Farbe wieder zurück. PS: Es kann nicht schaden, wenn der Parameter State auch noch ausgewertet wird. |
Re: Verschiedene Farben einzelner Items in ComboBox
Vielen Dank für Eure Hilfe, vor allem für den INDEX :wall:
habe es jetzt wie folgt hinbekommen:
Delphi-Quellcode:
procedure TMHauptmaske.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var holdColor: TColor; begin holdColor := combobox1.Canvas.Brush.Color; if combobox1.Items.Strings[index] = 'test1' then combobox1.canvas.Brush.Color := clred; if combobox1.Items.Strings[index] = 'test2' then combobox1.canvas.Brush.Color := clyellow; if combobox1.Items.Strings[index] = 'test3' then combobox1.canvas.Brush.Color := clgreen; combobox1.canvas.Font.Color := clblack; combobox1.Canvas.FillRect(rect); combobox1.Canvas.TextOut(Rect.left, Rect.top, combobox1.Items[index]); combobox1.canvas.brush.Color := holdColor; end; |
Re: Verschiedene Farben einzelner Items in ComboBox
Hallo Sebastian,
könntest du bitte in deinem ersten Beitrag auch noch die Delphi-Tags um den Quellcode herum setzen? Dann sieht es hübscher aus ;) Danke! Grüße, Frederic |
Re: Verschiedene Farben einzelner Items in ComboBox
Jetzt noch statt combobox1 ein TComboBox(Control) verwenden und es ist perfekt.
Zitat:
Delphi-Quellcode:
case Index of
0: TComboBox(Control).Canvas.Brush.Color := clRed; 1: TComboBox(Control).Canvas.Brush.Color := clYellow; 2: TComboBox(Control).Canvas.Brush.Color := clGreen; end; PS: Eine ordentliche Codeeinrückung, sowie eine entsprechende Groß-/Kleinschreibung macht das Lesen/Verstehen von Code um Einiges einfacher. |
Re: Verschiedene Farben einzelner Items in ComboBox
Bei vielen Farben könne man es auch so machen:
Delphi-Quellcode:
type
TFarbe = record Name: String; Farbe: TColor; end; const MaxFarben = 2; MeineFarben: array[0..MaxFarben] of TFarbe = ((Name: 'test1'; Farbe: clred), (Name: 'test2'; Farbe: clyellow), (Name: 'test2'; Farbe: clgreen)); procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var i: Word; begin for i := 0 to MaxFarben do begin if ComboBox1.Items.Strings[Index] = MeineFarben[i].Name then ComboBox1.Canvas.Brush.Color := MeineFarben[i].Farbe; end; end; |
Re: Verschiedene Farben einzelner Items in ComboBox
Hallo Zusammen,
Zitat:
Hier nun der aktuelle Code und Datenbankbasiert, die Combobox wird im vorfeld mit bestimmten Einträgen gefüttert:
Delphi-Quellcode:
Vielen Dank für Eure Hilfe!
procedure TMHauptmaske.ComboBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var holdColor: TColor; begin holdColor := ((FindComponent(CB)) as TCombobox).Canvas.Brush.Color; DB.TSTSTATUS.Locate('BEZ',((FindComponent(CB)) as TCombobox).Items[index],[]); ((FindComponent(CB)) as TCombobox).canvas.Brush.Color := stringtocolor(DB.TSTSTATUSFARBE.asstring); ((FindComponent(CB)) as TCombobox).canvas.Font.Color := clblack; ((FindComponent(CB)) as TCombobox).Canvas.FillRect(rect); ((FindComponent(CB)) as TCombobox).Canvas.TextOut(Rect.left, Rect.top, ((FindComponent(CB)) as TCombobox).Items[index]); ((FindComponent(CB)) as TCombobox).canvas.brush.Color := holdColor; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz