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


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 18: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