Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


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