AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zeile in Listbox färben
Thema durchsuchen
Ansicht
Themen-Optionen

Zeile in Listbox färben

Ein Thema von loirad · begonnen am 17. Mai 2012 · letzter Beitrag vom 18. Mai 2012
Antwort Antwort
Seite 1 von 2  1 2      
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#1

Zeile in Listbox färben

  Alt 17. Mai 2012, 19:57
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
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#2

AW: Zeile in Listbox färben

  Alt 17. Mai 2012, 20:29
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;
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 01:23
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 06:28
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.
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#5

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 08:13
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?
Wer Fehler findet darf sie behalten!
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 08:21
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 08:27
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
  Mit Zitat antworten Zitat
loirad

Registriert seit: 25. Nov 2009
135 Beiträge
 
Delphi 6 Professional
 
#8

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 09:13
Vielen Dank! Ich probiers heute noch aus! Danke für die Antworten

Edit: Und wie kann ich die Parameter übergeben?
Wer Fehler findet darf sie behalten!

Geändert von loirad (18. Mai 2012 um 09:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.581 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 09:18
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#10

AW: Zeile in Listbox färben

  Alt 18. Mai 2012, 09:21
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:26 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