AGB  ·  Datenschutz  ·  Impressum  







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

Bestimmte Zeilen einer TListbox färben

Ein Thema von Aike · begonnen am 10. Mai 2006 · letzter Beitrag vom 14. Jun 2007
Antwort Antwort
Seite 1 von 3  1 23      
Aike

Registriert seit: 2. Okt 2004
319 Beiträge
 
#1

Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 09:32
Hallöchen,

ich habe mich nun ein paar Stunden mit dem Problem rumgeschlagen und komme einfach nicht wirklich voran.

Mein Problem sieht so aus:
Ich habe eine Listbox, die ca. 40 Einträge umfasst, aber nur etwa 20 auf einmal anzeigen kann. Nun möchte ich, abhängig von Registry-Einträgen bestimmte Zeilen in der Listbox färben (z.B. blau). (Problemstellung nochmal nach dem Code)

An einer anderen Stelle im Forum fand ich diesen Code zum Färben des Textes einer Listbox-Zeile:
Delphi-Quellcode:
procedure ZeileFaerben(Zeile:integer;Farbe:integer;Listbox:TListbox;
  Index:Integer;Rect:TRect);
begin
  if Index<>Zeile then
    Farbe:=clBlack;

  Listbox.Canvas.Brush.Color:=clWhite;
  Listbox.Canvas.Pen.Color:=Farbe;
  Listbox.Canvas.FillRect(Rect);
  Listbox.Canvas.Font.Color:=Farbe;
  Listbox.Canvas.TextOut(Rect.Left,Rect.Top,Listbox.Items[Index]);
end;
Das klappt auch wunderbar.

Hier der Code, mit dem ich herausbekomme, ob die Zeile gefärbt werden soll:
Delphi-Quellcode:
procedure TForm1.Listbox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var Farbe,i:integer;
    GewuenschterName:string;
    Liste:TStringList;
begin
  Liste:=TStringList.Create;
  Farbe:=clBlue;
  regist.CloseKey;
  regist.OpenKey(MyRegKey);
  regist.GetValueNames(Liste);
  Liste.Sorted:=True;
  
  for i:=0 to Listbox1.Count-1 do
  begin
    GewuenschterName:=Listbox1.Items[i]+'+';
    if regist.ValueExists(GewuenschterName) then
    begin
      if StringInList(GewuenschterName,Liste) then
      begin
        ZeileFaerben(i,Farbe,Listbox1,Index,Rect); //Code siehe oben
        Showmessage(GewuenschterName); //Zu Testzwecken
      end;
    end;
  end;
end;
Hier noch die StringInList-procedure, die aber eigentlich funktioniert/funktionieren sollte:
Delphi-Quellcode:
function StringInList(s:string;Liste:TStrings):boolean;
var i:integer;
begin
  result:=False;
  for i:=0 to Liste.Count-1 do
    if s=Liste.Strings[i] then
      result:=True;
end;
So, jetzt hängt die ganze Sache einfach daran, dass die for-Schleife oben immer komplett durchläuft.
Er findet Eintrag 1, vergleicht, findet nichts, färbt schwarz;
geht zu Eintrag 2, vergleicht, stellt fest, dass es stimmt, färbt;
geht zu Eintrag 3, vergleicht, findet nichts, färbt wieder schwarz, ... => Knackpunkt

Ich habe es wirklich nicht geschafft, ihn zum Aufgeben zum zwingen Das dumme ist, das die OnDraw-Methode auch andauernd und sehr seltsam durchläuft, was bei meinem Showmessage-Test sehr nervenraubend war, weil ich den Prozess immer beenden musste. Anscheinend färbt er das Item einfach wieder schwarz, wenn er nach der for-Schleife feststellt, dass keine der if-Anweisungen zutraf

Würde mich echt freuen, wenn ihr mir da weiterhelfen könntet

Wie immer mit besten Grüßen ...
Achim
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 09:38
Hai Aike,

Du darfst in dem Delphi-Referenz durchsuchenOnDrawItem Event nicht noch einmal die Zeilen der Listbox durchlaufen!
Das Ereigniss wird für jede Zeile aufgerufen die gezeichnet werden muss. Ausserdem ist es ganz schlecht in solch einem Ereingiss etwas via Showmessage auszugeben. Wenn Du jetzt nämlich das Fenster mit der Meldung schliesst muss die Listbox wieder gezeichnet werden und scho kommt die Meldung wieder.
Stephan B.
  Mit Zitat antworten Zitat
Aike

Registriert seit: 2. Okt 2004
319 Beiträge
 
#3

Re: Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 10:22
Ok, du hast recht Das Problem war wirkich das erneute Durchlaufen aller Items.

Ich habe es so gelöst und es funktioniert 1a:

Delphi-Quellcode:
procedure TForm1.Listbox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var Farbe:integer;
    Name:string;
begin
  Farbe:=clBlue;
  Open(RegKey);
  Name:=Listbox1.Items[index];
  if regist.ValueExists(Name+'+') then
    ZeileFaerben(Index,Farbe,Listbox1,Index,Rect)
  else
    ZeileFaerben(Index,clBlack,Listbox1,Index,Rect);
end;
Jetzt ist es auch so schön einfach Vielen Dank!
Achim
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 10:26
Hai Aike,

schön das es geht

Eine Anmerkung noch. Du solltest das Wort Name für eine Variable vermeiden (ausser in einem Record oder so) da es auch ein Property von allen Komponenten ist.
Stephan B.
  Mit Zitat antworten Zitat
Aike

Registriert seit: 2. Okt 2004
319 Beiträge
 
#5

Re: Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 10:32
Na ja, ich verwende es halt gerne, wenn es um Namen von Personen geht o.O Was besserese und treffenderes fällt mir da nicht ein
Achim
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Bestimmte Zeilen einer TListbox färben

  Alt 10. Mai 2006, 10:36
Zitat von Aike:
Na ja, ich verwende es halt gerne, wenn es um Namen von Personen geht o.O Was besserese und treffenderes fällt mir da nicht ein
Es ist aber eine häufige Fehlerursache, da teilweise auf die Eigenschaft eines Controls reagiert wird und nicht auf deine Variable (je nach Situation). Aus diesem Grunde sagt dir Sharky das und das solltest du wirklich ändern. Wird das anders interpretiert, als du es dir vorstellst, wirst du den Fehler so leicht nicht finden, glaub mir
  Mit Zitat antworten Zitat
obscureSg

Registriert seit: 14. Jun 2007
7 Beiträge
 
#7

Re: Bestimmte Zeilen einer TListbox färben

  Alt 14. Jun 2007, 11:00
Ich habe das ähnliche Problem =(

Delphi-Quellcode:
procedure ZeileFaerben(Zeile:integer;Farbe:integer;Listbox:TListbox;
  Index:Integer;Rect:TRect);
begin
  if Index<>Zeile then
    Farbe:=clRed;

// Listbox.Canvas.Brush.Color:=clWhite;
  //Listbox.Canvas.Pen.Color:=Farbe;
 // Listbox.Canvas.FillRect(Rect);
  Listbox.Canvas.Font.Color:=Farbe;
 // Listbox.Canvas.TextOut(Rect.Left,Rect.Top,Listbox.Items[Index]);
end;
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
Name: string;
Farbe,count, i : integer;
begin

begin
count := listbox1.Items.Count;
label1.Caption := inttostr(count);
Farbe := clRed;
if


listbox1.Items.Text = 'verliehenthen

  ZeileFaerben(Index,Farbe,Listbox1,Index,Rect) ;
//canvas.Font.Color := clRed;

 // for i := 0 to count do

  //if
  //listbox1.Items.Text = 'verliehen' then

  end;
end;

das alles funktioniert nicht =( Ich möchte das in meiner Listbox nur die einträge rot gefärbt werden, die das wort "verliehen" haben.

Kann mir wer helfen??
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Bestimmte Zeilen einer TListbox färben

  Alt 14. Jun 2007, 11:31
Versuche es einmal so:

Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Name: string;
  Farbe,count, i : integer;

begin
  count := listbox1.Items.Count;
  label1.Caption := inttostr(count);
  Farbe := clRed;
  if listbox1.Items.Strings[index] = 'verliehenthen //<-- index eingebaut
     ZeileFaerben(Index,Farbe,Listbox1,Index,Rect) ;
    
 //canvas.Font.Color := clRed;

// for i := 0 to count do

  //if
  //listbox1.Items.Text = 'verliehen' then
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Bestimmte Zeilen einer TListbox färben

  Alt 14. Jun 2007, 11:40
Hallo,

vom Prinzip her könnte man es so machen:
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  if Control is TListbox then
  begin
    TListbox(Control).Canvas.FillRect(Rect);
    if TListbox(Control).Items.Strings[Index] = 'verliehenthen
      TListbox(Control).Canvas.Font.Color := clRed
    else
    if odSelected in State then
      TListbox(Control).Canvas.Font.Color := graphics.clHighlightText
    else
      TListbox(Control).Canvas.Font.Color := graphics.clBtnText;

    TListbox(Control).Canvas.TextOut(Rect.Left, Rect.Top, TListbox(Control).Items[Index]);
  end;
end;
Der Code müsste allerdings noch erweitert werden, wenn es noch besser aussehen soll.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
obscureSg

Registriert seit: 14. Jun 2007
7 Beiträge
 
#10

Re: Bestimmte Zeilen einer TListbox färben

  Alt 14. Jun 2007, 12:10
danke für die schnellen antworten. ich werde es gleich mal testen!!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 22:35 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