Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zeile in Listbox färben (https://www.delphipraxis.net/168378-zeile-listbox-faerben.html)

loirad 17. Mai 2012 18:57

Zeile in Listbox färben
 
Hallo liebe Community,

wie kann man die oberste Zeile einer während der Laufzeit erzeugten Listbox färben (Hintergrundfarbe z.B. rot)?

Liebe Grüße
loirad

Popov 17. Mai 2012 19:29

AW: Zeile in Listbox färben
 
Hier mein Beispiel für ein Zebraeffekt. Eventuell musst du es anpassen:

Zitat:

Hier ein Tipp wie man diesen Effekt bei einer ListBox nutzt. Dazu nutzt man das Ereignis OnDrawItem der ListBox. Diese bietet ein Canvas zum zeichnen und ein Rect-Bereich in den gezeichnet werden darf.

Zuerst muß allerdings die TListBox.Style Eigenschaft auf lbOwnerDrawFixed (oder lbOwnerDrawVariable bei variablen Höhen) gestellt werden. Wenn man das nicht macht, dann wird nicht gezeichnet.

Wichtig!

Delphi-Quellcode:
  ...
  ListBox1.Style := lbOwnerDrawFixed;
  ...
Entweder im Code einstellen oder bereits in Objektinspektor.

Die Prozedur ist allgemein aufgebaut und kann aus jeder OnDrawItem Prozedur aufgerufen werden. Die Parameter der Prozedur sind die gleichen wie bei der OnDrawItem Prozedur. Man muß die Variablenbezeichnungen einfach nur übertragen:

Delphi-Quellcode:
procedure DrawListBoxZC(Control: TWinControl; Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
const
  Col1: array [Boolean] of TColor = ($00F8F8F8, clWindow); // <<< Wunschfarben
  Col2: array [Boolean] of TColor = (clInactiveCaptionText, clWindowText);
var
  TopDif: Integer; // Gleicht die Höhendifferenz aus
begin
  with (Control as TListbox) do
  begin
    if odSelected in State then Canvas.Font.Color := clCaptionText else begin
      Canvas.Brush.Color := Col1[Odd(Index)];
      Canvas.Font.Color := Col2[(Control as TListbox).Enabled];
    end;
    TopDif := (ItemHeight div 2) - (Canvas.TextHeight(#32) div 2);
    Canvas.TextRect(Rect, Rect.Left, Rect.Top + TopDif, Items[Index]);
  end;
end; {Popov}

Beispiel:

Die DrawListBox Prozedur (oben) ist universal einsetzbar und kann aus verschieden Prozeduren gleichzeitig aufgerufen werden. Hier aus der OnDrawItem Ereignisprozedur der ListBox1:

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  DrawListBoxZC(Control, Index, Rect, State);
end;


Hansa 18. Mai 2012 00:23

AW: Zeile in Listbox färben
 
Zitat:

Zitat von loirad (Beitrag 1166998)
wie kann man die oberste Zeile einer während der Laufzeit erzeugten Listbox färben (Hintergrundfarbe z.B. rot)?

@Popov : warum so kompliziert ?

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
begin
  if Index = 1 then begin // oder Index = 0 ? selber testen
    Listbox1.Canvas.Brush.Color := clRed;
    Listbox1.Canvas.FillRect(Rect);
   Listbox1.Canvas.TextOut(Rect.Left,Rect.Top,Listbox1.Items[Index]);
  end;
end;
Es war ja nur nach 1. Zeile gefragt.

Für "Zebra-Effekt" reicht es, statt bei 1 bei (Index mod 2) dementsprechend einzugreifen.

Popov 18. Mai 2012 05:28

AW: Zeile in Listbox färben
 
Also ich weiß nicht ob das ausreicht. Wenn man der einen Zeile Zitat folgt, dann vielleicht ja, aber ich schätze er will auch den Rest sehen. Und nach meinem Verständnis fehlt da was. Vielleicht klappt es in neueren Versionen von Delphi, aber bei D7 nicht unbedingt.

loirad 18. Mai 2012 07:13

AW: Zeile in Listbox färben
 
Vielen Dank für die Antworten! Ich werde es mal ausprobieren!

Eine Frage: Wo bekomme ich die Prozedure DrawItem her bei ender während der Laufzeit erzeugten Listbox?

Ralf Kaiser 18. Mai 2012 07:21

AW: Zeile in Listbox färben
 
Zitat:

Zitat von loirad (Beitrag 1167021)
Eine Frage: Wo bekomme ich die Prozedure DrawItem her bei ender während der Laufzeit erzeugten Listbox?

Einfach so:

Zuerst die Zeichenmethode implamentieren und dann der Listbox zuweisen die zur Laufzeit erzeugt wurde.

Delphi-Quellcode:
// Nachdem die Listbox erzeugt wurde:
DeineErzeugteListBox.OnDrawItem := DeineListBoxDrawItem;
// Wobei DeineListBoxDrawItem die Zeichenmethode ist

Popov 18. Mai 2012 07:27

AW: Zeile in Listbox färben
 
Durch Zuweisung. Du erzeugst doch zur Laufzeit eine ListBox, oder? Dort gibst du der Komponente bestimmte Eigenschaften, wie Parent, Width oder Height. Genauso kannst du auch eine Prozedur zuweisen. Z. B. MyListBox.OnClick

Delphi-Quellcode:
  private
    { Private-Deklarationen }
    procedure MyListBoxClick(Sender: TObject);

...

procedure TForm1.MyListBoxClick(Sender: TObject);
begin
  ShowMessage('Eigene OnClick Prozedur nach Klick auf Button1');
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  ShowMessage('Original OnClick Prozedur');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.OnClick := MyListBoxClick;
end;
Edit:

In deinem Fall natürlich OnDrawItem

loirad 18. Mai 2012 08:13

AW: Zeile in Listbox färben
 
Vielen Dank! Ich probiers heute noch aus! Danke für die Antworten:thumb:

Edit: Und wie kann ich die Parameter übergeben?

jaenicke 18. Mai 2012 08:18

AW: Zeile in Listbox färben
 
Du rufst die Methode ja nicht selbst auf. Das macht die Komponente, schließlich weist du deshalb die Methode als Eventbehandlung zu.
Die Parameter übergibt dann auch die Komponente.

DeddyH 18. Mai 2012 08:21

AW: Zeile in Listbox färben
 
Welche Parameter willst Du denn übergeben? Wenn das Ereignis gefeuert wird, stehen da eh schon die Daten der gemeinten Listbox drin. Übrigens solltest Du besser den Sender auswerten statt die Instanz hartzucoden. Also statt
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  Listbox1.Canvas.Brush.Color := clRed;
besser
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  (Sender as TListbox).Canvas.Brush.Color := clRed;
dann kannst Du den Handler auch mehreren Listboxen zuweisen.

Popov 18. Mai 2012 08:22

AW: Zeile in Listbox färben
 
Wenn du jeden einzelnen Schritt erfragst, wird es Jahre dauern bis du das Programm fertig schreibst. Nicht falsch verstehen, aber was hältst du von Learning by Doing?

loirad 18. Mai 2012 08:27

AW: Zeile in Listbox färben
 
Eine Frage noch @DeddyH: Wo bekomme ich in der 2.Variante (die bessere) den Sender her (der wird doch nicht übermittelt oder?)?

jaenicke 18. Mai 2012 08:29

AW: Zeile in Listbox färben
 
Normalerweise heißt der erste Parameter immer Sender, er hat übersehen, dass der bei DrawItem Control heißt. ;-) Einfach durch Control ersetzen, dann gehts.

loirad 18. Mai 2012 08:31

AW: Zeile in Listbox färben
 
Control kennt aber kein Canvas? Jedenfalls sagt er mit undefinierter Bezeichner 'Canvas'!

Popov 18. Mai 2012 08:31

AW: Zeile in Listbox färben
 
Zitat:

Zitat von loirad (Beitrag 1167041)
Eine Frage noch @DeddyH: Wo bekomme ich in der 2.Variante (die bessere) den Sender her (der wird doch nicht übermittelt oder?)?

Wenn du nicht alles erfragen würdest, sondern auch den Post #2 studieren würdest, da steht
Delphi-Quellcode:
(Control as TListbox)
.

Übrigens, das geht auch und ist vielleicht übersichtlicher

Delphi-Quellcode:
TListBox(Control).Canvas

loirad 18. Mai 2012 08:35

AW: Zeile in Listbox färben
 
Vielen Dank! Jetzt klappts! Teilweise war ich ja sehr beratungsresistent:oops:! Danke für eure Gedult!

DeddyH 18. Mai 2012 08:43

AW: Zeile in Listbox färben
 
Zitat:

Zitat von Popov (Beitrag 1167044)
Übrigens, das geht auch und ist vielleicht übersichtlicher

Delphi-Quellcode:
TListBox(Control).Canvas

Das ist aber nicht dasselbe.

mkinzler 18. Mai 2012 09:24

AW: Zeile in Listbox färben
 
Beim harten Cast musst du dir sicher sein können, das der Sender wirklich eine TListbox oder Nachfahre ist!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:03 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