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 ...