Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ComboBox-Einträge in verschiedenen Farben (https://www.delphipraxis.net/2125-combobox-eintraege-verschiedenen-farben.html)

Delphi-Coder 8. Jan 2003 08:05


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

eddy 8. Jan 2003 09:46

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:
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;
mfg
eddy

Christian Seehase 8. Jan 2003 10:16

Moin Delphi-Coder,

erst einmal herzlich willkommen.

Meintest Du das so?

Delphi-Quellcode:
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;
Hierbei setze ich voraus, dass die Items der Combobox bereits Werte enthalten, und das die Eigenschaft Style auf csOwnerDrawFixed eingestellt ist.

Delphi-Coder 8. Jan 2003 10:20

Hallo Christian,
vielen Dank für den Code! Genau so wollte ich es haben! Danke!

eddy 8. Jan 2003 11:33

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:
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;
mfg
eddy

eddy 8. Jan 2003 11:47

@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

Christian Seehase 8. Jan 2003 12:30

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

eddy 8. Jan 2003 15:43

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:
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;
Damit wäre wohl das Thema geschafft.

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

Christian Seehase 8. Jan 2003 17:22

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:

Wann muß Create und Destroy verwenden?
Das hab' ich jetzt nicht verstanden, und es wäre auch gut, wenn Du für diese Frage einen eigenen Thread öffnest, da sie vermutlich mit dem Thema dieses Threads nicht so recht was zu tun hat.
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.

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