![]() |
ComboBox-Einträge in verschiedenen Farben
Hallo,
ich hab lange im Internet gesucht, aber nichts brauchbares gefunden! Ich hab eine ComboBox mit folgenden Einträgen: der 1. Eintrag '' (weißer Hintergrund, schwarze Schrift), der 2. Eintrag 'Ja' (grüner Hintregrund, weiße Schrift) und der 3. Eintrag 'Nein' (roter Hintergrund, weiße Schrift)! Wie kann ich die Einträge gemäß der Angaben in den Klammern gestalten??? Vielen Dank! Delphi-Coder |
Ein Anfang !?
Hallo Delphi-Coder,
hier ein Stückchen Programm. Es löst zwar nicht zu 100% Dein Problem, aber vielleicht ist es ja ein Anfang :wink: :idea:
Delphi-Quellcode:
mfg
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); begin with Control as TComboBox do begin Canvas.FillRect(Rect); Canvas.Font.Color := TColor(Items.Objects[Index]); Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]); end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin ComboBox1.Items.AddObject('Red Item', Pointer(clRed)); ComboBox1.Items.AddObject('Green Item', Pointer(clGreen)); end; procedure TForm1.FormCreate(Sender: TObject); begin // kann auch im ObjektInspektor (OI) eingestellt werden ComboBox1.Style := csOwnerDrawFixed; end; eddy |
Moin Delphi-Coder,
erst einmal herzlich willkommen. Meintest Du das so?
Delphi-Quellcode:
Hierbei setze ich voraus, dass die Items der Combobox bereits Werte enthalten, und das die Eigenschaft Style auf csOwnerDrawFixed eingestellt ist.
procedure TfrmMAIN.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var cb : TComboBox; begin cb := TComboBox(Control); case Index of 0 : begin cb.Canvas.Brush.Color := clWhite; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clBlack; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Items[Index]); end; 1 : begin cb.Canvas.Brush.Color := clGreen; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clWhite; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Items[Index]); end; 2 : begin cb.Canvas.Brush.Color := clRed; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clWhite; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Items[Index]); end; end; end; |
Hallo Christian,
vielen Dank für den Code! Genau so wollte ich es haben! Danke! |
noch ein Kommentar
Hallo Delphi-Coder,
auch wenn Christian inzwischen eine Lösung geliefert hat, will ich noch eine kleine Ergänzung bringen.
Delphi-Quellcode:
mfg
type
TArrCol = record Font : TColor; Bkgr : TColor; end; const maxColAnz = 3; // max. Anzahl verschiedener Farbvarianten var carr : array[1..maxColAnz] of TArrCol; i : integer; procedure TForm1.FormCreate(Sender: TObject); begin // kann auch im ObjektInspektor (OI) eingestellt werden ComboBox1.Style := csOwnerDrawFixed; // Festlegung der der Farben für jeden 1., 2. usw. Eintrag // noch besser wäre wahrscheinlich die Festlegung in einem Array i := 1; carr[i].Font := clBlack; carr[i].Bkgr := clWhite; inc(i); carr[i].Font := clWhite; carr[i].Bkgr := clGreen; inc(i); carr[i].Font := clWhite; carr[i].Bkgr := clRed; SpeedButton1.Caption := 'ComboBox mit Einträgen füllen'; end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with Control as TComboBox do begin i := Index mod maxColAnz; inc(i); // weil cArr mit 1 beginnt Canvas.Font.Color := carr[i].Font; Canvas.Brush.Color := carr[i].Bkgr; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]); end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); var i : integer; begin for i := 1 to 10 do begin ComboBox1.Items.Add('Eintrag Nr. ' + IntToStr(i)); end; end; eddy |
@Christian Seehase
Hallo Christian, ich hoffe, Du wirfst hier noch einmal einen Blick rein, denn ein Problem konnte ich noch nicht lösen: Nach dem Öffnen der Liste hätte ich gern weiße Schrift auf blauen Grund (so wie in der Standard-Version), damit ich den aktuell gewählten Beitrag besser sehen kann. Vielleicht hast Du dafür ja auch noch eine Lösung? mfg eddy |
Moin Eddy,
meinst Du das hier?
Delphi-Quellcode:
//...
cb := TComboBox(Control); if (odComboBoxEdit in State) and (odFocused in State) then begin cb.Canvas.Brush.Color := clNavy; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clWhite; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Text); exit; end; case Index of //... |
noch eine Ergänzung
Hallo Christian,
mit Hilfe Deines vorigen Hinweises habe ich die Prozedur so umgeändert, daß in der Liste der selektierte Eintrag wieder weiß auf blau erscheint, wenn man sich mit der Maus darüber hinwegbewegt, und nach der Auswahl eines Eintrages dieser wieder in schwarz auf weiß erscheint und nicht in der Farbe wie in der Auswahlliste.
Delphi-Quellcode:
Damit wäre wohl das Thema geschafft.
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var cb : TComboBox; begin cb := TComboBox(Control); // sorgt dafür, daß der in der Liste aktuell gewählte Punkt // weiß auf blau dargestellt wird if (odSelected in State) then begin cb.Canvas.Brush.Color := clNavy; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clWhite; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Text); exit; end; // sorgt dafür, daß die Farben aus der Liste nicht in das // AnzeigeFeld übernommen werden if (odComboBoxEdit in state) then begin cb.Canvas.Brush.Color := clWhite; cb.Canvas.FillRect(Rect); cb.Canvas.Font.Color := clBlack; cb.Canvas.TextOut(Rect.Left,Rect.Top,cb.Text); exit; end; // sorgt dafür das (hier) drei aufeinanderfolgende Einträge in der // Auswahlliste jeweil anders gefärbt sind with cb do begin i := Index mod maxColAnz; inc(i); // weil cArr mit 1 beginnt Canvas.Font.Color := carr[i].Font; Canvas.Brush.Color := carr[i].Bkgr; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]); end; end; Hier gleich noch ein paar allgemeine Fragen: Warum verwendest Du
Delphi-Quellcode:
cb := TComboBox(Control); with cb do begin .... statt with control do begin .... Wann muß Create und Destroy verwenden? Auch wenn ich einiges davon verwende, wäre es natürlich auch mal schön zu wissen warum, weil wenn man weiß warum etwas geht, kommt man über den Punkt des Nachmachens (was hier auf keinen Fall negativ zu betrachten ist) hinaus zum Machen. mfg eddy |
Moin eddy,
auch wenn's jetzt etwas Off Topic (OT) wird: Control ist vom Typ TWinControl. TWincontrol hat aber, z.B., keine Eigenschaft Canvas. Die wird, in diesem Falle, erst bie TCustomComboBox, dem Vorläufer von TComboBox eingeführt. Deshalb nehme ich die Hilfsvariable, damit ich nicht soviel schreiben muss ;-) Ersatzweise wäre auch TComboBox(Control) gegangen. Das gleiche gilt auch, in verstärktem Masse, bei der Verwendung von Sender, der ja in den meisten Ereignisroutinen auftaucht. Zitat:
Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:36 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