AGB  ·  Datenschutz  ·  Impressum  







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

Farbige Listbox

Ein Thema von XXcD · begonnen am 29. Dez 2007 · letzter Beitrag vom 29. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#1

Farbige Listbox

  Alt 29. Dez 2007, 02:20
Hallo,
ich müsste in einer Listbox einzelne Items farbig machen.
Mein Problem ist ich muss das in die OnShow Routine reinkriegen.
Soweit ich weiß geht das ja nur in DrawItem.

Kann mir da einer helfen oder hat einer eine bessere Idee mit einer anderen Komponente?
  Mit Zitat antworten Zitat
ManfredG

Registriert seit: 12. Feb 2007
Ort: Berlin
34 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Farbige Listbox

  Alt 29. Dez 2007, 06:09
Hallo,
verwende doch statt der TListbox ein TListView.
Dort hast du das Ereignis OnCustomDrawItem. Dort läßt sich die Hintergrundfarbe der Zeile einfach einstellen, ohne daß du dich um den ganzen Inhalt kümmern mußt.
Beispiel:

Delphi-Quellcode:
procedure THF.FilesCustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var Attrs: Integer;
    pSi: PShellItem;
    nCol: boolean;
begin
  nCol:=TRUE;
  if (Length(StC1.Caption)>0)and(StC1.Tag>0) then begin // irgend eine Bedingung...
    if pos(uppercase(StC1.Caption),uppercase(pSi.DispName))>0 then begin
      Files.Canvas.Brush.Color:=StC1.Tag; // Farbe setzen woher sie auch immer kommt
      nCol:=FALSE; // Kennezeichen für Farbe ist gesetzt
    end;
  end;
  if (Length(StC2.Caption)>0)and(StC2.Tag>0) then begin // gleichartig für eine andere Farbe
    if pos(uppercase(StC2.Caption),uppercase(pSi.DispName))>0 then begin
      Files.Canvas.Brush.Color:=StC2.Tag;
      nCol:=FALSE;
    end;
  end;
  // wenn keine Bedingung für eine der beiden Farben, dann Fensterfarbe setzen
  if NCol then Files.Canvas.Brush.Color:=clWindow;
end;
Den Rest erledigt das TListView selbst, wenn DefaultDraw=TRUE
(StC1 und StC2 sind TStaticText in deren Tag eine Farbe steht und dessen Text mit dem Inhalt der Zeile verglichen wird)
TListView auf ViewStyle=vsReport setzen und die Breite der Spalte anpassen.

Gruß Manfred
Manfred Götze
  Mit Zitat antworten Zitat
Hansa

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

Re: Farbige Listbox

  Alt 29. Dez 2007, 06:31
Eine Listview verwenden, um die Sachen wesentlich komplizierter zu machen, die die Listbox schon hat, oder wie ?

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  if Index mod 2 = 0 then begin
    Listbox1.Canvas.Brush.Color := clRed;
    Listbox1.Canvas.FillRect(Rect);
    Listbox1.Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);
  end
  else
    Listbox1.Canvas.TextOut(Rect.Left, Rect.Top, Listbox1.Items[Index]);
end;
Das färbt jede zweite Zeile rot. Du kannst aber genausogut die letzten Lottozahlen verwenden, um genau die Zeilen mit den entsprechenden Nummern zu färben. Den Inhalt der Zeilen kann man auch für sowas verwenden.

P.S.: der Style der Listbox muss im OI auf OwnerDraw??? gesetzt werden !
Gruß
Hansa
  Mit Zitat antworten Zitat
ManfredG

Registriert seit: 12. Feb 2007
Ort: Berlin
34 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Farbige Listbox

  Alt 29. Dez 2007, 09:21
Hallo Hansa,
a) OwnerDraw muß gesetzt werden
b) was ist an einem ListView kompliziert
und
c) schau dir mal die Rahmen an, wenn du die Zeilen selektierst, wenn du von einer Zeile auf die nächste klickst (einmal auf den Text und einmal auf eine leere Position rechts neben den Text)
d) wenn schon, dann "Listbox1.Canvas.TextOut(Rect.Left+1, Rect.Top+1, Listbox1.Items[Index])"

Gruß Manfred
Manfred Götze
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Farbige Listbox

  Alt 29. Dez 2007, 10:58
Das Problem ist ich müsste das in das OnShow ereignis reinkriegen.
Ich möchte damit anzeigen wer online oder offline ist.

Hier mal der Code:
Delphi-Quellcode:
Listbox3.Clear;
if assigned(FResult) then begin
    if FMysql.Status<>MYSQL_STATUS_READY then
      ShowMessage('Ein Ergebnis wurde unvollständig gelesen!');
      FreeAndNil(FResult);
  end;
FResult := FMysql.query('select * from users;', true, ex);
  if assigned(FResult) then
  begin
  FResult.First;
          for j:=0 to FResult.RowsCount-1 do
          begin
          if FResult.FieldValuebyname('status')='onlinethen
          begin
          //Hier muss die Schrift grün werden
           Listbox3.Items.Insert(0, FResult.FieldValuebyname('login'));
          end
          else
          begin
        //Hier muss die Schrift rot werden
        Listbox3.Items.add(FResult.FieldValuebyname('login'));
          end;
        FResult.Next;
      end;
  end
  else
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Farbige Listbox

  Alt 29. Dez 2007, 11:04
Du hast das Problem, es unbedingt in Onshow Ereignis der Form reinzupacken, da du für die einzelne Einträge in der Listbox der Status (online oder offline) nicht weisst, weil du ja nur den Namen de Login drin speicherst. Im OnDrawItem ist dir also die Information verloren, ob der User online oder offline ist.

Ich würde dir also dringend raten, diese Information ebenfalls zu speichern. Das kannst du, indem du statt Items.Add besser die Methode Items.AddObject nutzt. Dort kannst du, neben der eigentlichen Caption die in der Listbox dargestellt wird, noch ein beliebiges Objekt mitspeichern...

Und dann geht das auch wieder, alles im OnDrawItem Ereignis abzufragen, um zu entscheiden welche Farbe der Eintrag sein soll.
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Farbige Listbox

  Alt 29. Dez 2007, 11:11
Ok ich muss jetzt noch kurz weg, danach schau ich mal ob ich in der scuhe was finde. Vielleicht kann mir ja einer schon einen tip geben, wie das mit addobject geht. Hab damit noch nie gearbeitet
  Mit Zitat antworten Zitat
ManfredG

Registriert seit: 12. Feb 2007
Ort: Berlin
34 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

Re: Farbige Listbox

  Alt 29. Dez 2007, 12:21
Vielleicht nicht elegant, aber wie wärs mit:

Delphi-Quellcode:
Listbox3.Clear;
if assigned(FResult) then begin
    if FMysql.Status<>MYSQL_STATUS_READY then
      ShowMessage('Ein Ergebnis wurde unvollständig gelesen!');
      FreeAndNil(FResult);
  end;
FResult := FMysql.query('select * from users;', true, ex);
  if assigned(FResult) then
  begin
  FResult.First;
          for j:=0 to FResult.RowsCount-1 do
          begin
          if FResult.FieldValuebyname('status')='onlinethen
          begin
          //Hier muss die Schrift grün werden
           ListBox3.Items.InsertObject(0, FResult.FieldValuebyname('login'), TObject(clGreen));
          end
          else
          begin
        //Hier muss die Schrift rot werden
           ListBox3.Items.InsertObject(0, FResult.FieldValuebyname('login'), TObject(clRed));
          end;
        FResult.Next;
      end;
  end
  else
Das würde für jede Zeile die Farbe festhalten, im TObject-Zeiger dieser Zeile.
Danach mußt du aber trotzdem OnDrawItem erstellen, damit die Farbe auch dargestellt wird.
Nach der Methode von @Hansa wäre das:

Delphi-Quellcode:
procedure TForm1.ListBox3DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  Listbox3.Canvas.Brush.Color := TColor(ListBox3.Items.Objects[Index]);
  Listbox3.Canvas.FillRect(Rect);
  Listbox3.Canvas.TextOut(Rect.Left, Rect.Top, Listbox3.Items[Index]);
end;
Für ListBox3 - Style auf lbOwnerDrawFixed - stellen.
Gruß Manfred
Manfred Götze
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Farbige Listbox

  Alt 29. Dez 2007, 12:30
Anstatt InsertObject würde ich AddObject nehmen
Vergiss nicht Rect.Left+1 und Rect.Top+1

Grüße
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von XXcD
XXcD

Registriert seit: 19. Sep 2006
581 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Farbige Listbox

  Alt 29. Dez 2007, 13:00
Jo danke das funtzt wunderbar.
Und ich muss insertobject nehmen, weil die online Player oben erscheinen sollen.

Vielen dank für eure Hilfe und einen Guten Rutsch ins neue Jahr
  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 19:05 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