Einzelnen Beitrag anzeigen

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