Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verschiedene Farben einzelner Items in ComboBox (https://www.delphipraxis.net/146940-verschiedene-farben-einzelner-items-combobox.html)

sebastian1979 29. Jan 2010 19:54


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:
...
  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)
...
Habe auch schon das Ereignis DrawItem probiert...ohne Erfolg...es ändert sich gar nichts.
Delphi-Quellcode:
procedure TMHauptmaske.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  Combobox1.Canvas.Brush.Color := clred;
end;
So ähnlich habe ich es bereits bei einem DBGrid hinbekommen, aber nicht mit der Combobox.

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]

Teekeks 29. Jan 2010 19:55

Re: Verschiedene Farben einzelner Items in ComboBox
 
Du musst nach dem Setzen der Farbe auch Zeichnen:
Delphi-Quellcode:
combobox1.canvas.fillrect(arect);

himitsu 29. Jan 2010 19:56

Re: Verschiedene Farben einzelner Items in ComboBox
 
Hattest du auch .OwnerDraw auf True gestellt?
ach nee, der Style muß csOwnerDrawFixed oder csOwnerDrawVariable sein.

sebastian1979 29. Jan 2010 20:38

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:
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;
Allerdings ändert sich die Frabe erst wenn ich mit der maus über das item gehe,
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.

himitsu 29. Jan 2010 20:44

Re: Verschiedene Farben einzelner Items in ComboBox
 
Zitat:

combobox1.ItemIndex
Rate mal, wozu der Parameter Index ist?

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.

sebastian1979 30. Jan 2010 11:09

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;

fkerber 30. Jan 2010 11:17

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

himitsu 30. Jan 2010 11:23

Re: Verschiedene Farben einzelner Items in ComboBox
 
Jetzt noch statt combobox1 ein TComboBox(Control) verwenden und es ist perfekt.

Zitat:

Delphi-Quellcode:
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;

Wenn du weißt, welcher Eintrag wo ist, dann kannst du den Index auch direkt verwenden.
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.

toms 30. Jan 2010 11:48

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;

sebastian1979 1. Feb 2010 06:50

Re: Verschiedene Farben einzelner Items in ComboBox
 
Hallo Zusammen,


Zitat:

Zitat von fkerber
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

...ich arbeite dran...bei meiner letzten Antwort habe ich es ja gemacht. :thumb:

Hier nun der aktuelle Code und Datenbankbasiert, die Combobox wird im vorfeld mit bestimmten Einträgen gefüttert:

Delphi-Quellcode:
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;
Vielen Dank für Eure Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.
Seite 1 von 2  1 2      

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