![]() |
Bestimmte Zeilen einer TListbox färben
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:
Das klappt auch wunderbar.
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; Hier der Code, mit dem ich herausbekomme, ob die Zeile gefärbt werden soll:
Delphi-Quellcode:
Hier noch die StringInList-procedure, die aber eigentlich funktioniert/funktionieren sollte:
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;
Delphi-Quellcode:
So, jetzt hängt die ganze Sache einfach daran, dass die for-Schleife oben immer komplett durchläuft.
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; 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 ... |
Re: Bestimmte Zeilen einer TListbox färben
Hai Aike,
Du darfst in dem ![]() 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. |
Re: Bestimmte Zeilen einer TListbox färben
Ok, du hast recht 8-) Das Problem war wirkich das erneute Durchlaufen aller Items.
Ich habe es so gelöst und es funktioniert 1a:
Delphi-Quellcode:
Jetzt ist es auch so schön einfach :-) Vielen Dank!
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; |
Re: Bestimmte Zeilen einer TListbox färben
Hai Aike,
schön das es geht :-D 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. |
Re: Bestimmte Zeilen einer TListbox färben
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 ;-)
|
Re: Bestimmte Zeilen einer TListbox färben
Zitat:
|
Re: Bestimmte Zeilen einer TListbox färben
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 = 'verliehen' then 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?? |
Re: Bestimmte Zeilen einer TListbox färben
Versuche es einmal so:
Delphi-Quellcode:
Grüße
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] = 'verliehen' then //<-- 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; Klaus |
Re: Bestimmte Zeilen einer TListbox färben
Hallo,
vom Prinzip her könnte man es so machen:
Delphi-Quellcode:
Der Code müsste allerdings noch erweitert werden, wenn es noch besser aussehen soll.
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] = 'verliehen' then 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; |
Re: Bestimmte Zeilen einer TListbox färben
danke für die schnellen antworten. ich werde es gleich mal testen!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz