Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bestimmte Zeilen einer TListbox färben (https://www.delphipraxis.net/69098-bestimmte-zeilen-einer-tlistbox-faerben.html)

Aike 10. Mai 2006 09:32


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

Sharky 10. Mai 2006 09:38

Re: Bestimmte Zeilen einer TListbox färben
 
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.

Aike 10. Mai 2006 10:22

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

Sharky 10. Mai 2006 10:26

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.

Aike 10. Mai 2006 10:32

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

Matze 10. Mai 2006 10:36

Re: Bestimmte Zeilen einer TListbox färben
 
Zitat:

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

obscureSg 14. Jun 2007 11:00

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

Klaus01 14. Jun 2007 11:31

Re: Bestimmte Zeilen einer TListbox färben
 
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] = '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;
Grüße
Klaus

bitsetter 14. Jun 2007 11:40

Re: Bestimmte Zeilen einer TListbox färben
 
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] = '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;
Der Code müsste allerdings noch erweitert werden, wenn es noch besser aussehen soll.

obscureSg 14. Jun 2007 12:10

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 23:24 Uhr.
Seite 1 von 3  1 23      

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