AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox-Einträge in verschiedenen Farben

Ein Thema von Delphi-Coder · begonnen am 8. Jan 2003 · letzter Beitrag vom 8. Jan 2003
Antwort Antwort
Delphi-Coder

Registriert seit: 8. Jan 2003
Ort: Greifswald / Stralsund
151 Beiträge
 
Delphi 7 Enterprise
 
#1

ComboBox-Einträge in verschiedenen Farben

  Alt 8. Jan 2003, 08:05
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
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#2

Ein Anfang !?

  Alt 8. Jan 2003, 09:46
Hallo Delphi-Coder,

hier ein Stückchen Programm. Es löst zwar nicht zu 100% Dein Problem, aber vielleicht ist es ja ein Anfang
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Delphi-Coder

Registriert seit: 8. Jan 2003
Ort: Greifswald / Stralsund
151 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 8. Jan 2003, 10:20
Hallo Christian,
vielen Dank für den Code! Genau so wollte ich es haben! Danke!
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#5

noch ein Kommentar

  Alt 8. Jan 2003, 11:33
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
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#6
  Alt 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 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
  //...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#8

noch eine Ergänzung

  Alt 8. Jan 2003, 15:43
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 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