![]() |
Listbox Eintrag fett machen
Hallo,
ich habe eine ListBox und in dieser würde ich gerne unterschiedliche Einträge fett machen. Also z.b. mal den ersten, dann mal den 2. und den 6. Eintrag. Das mit den Fett machen in der OnDraw-Procedure hab ich gemacht, ob ichs verstanden hab ist etwas anderes :) Mein Problem ist das ich nicht weiß, wie ich es abfragen kann das er z.b. den 1. und 2. Index normal läßt und den 3. Fett macht und den 4. wieder normal läßt. Die Test wo ich gemacht hab, hat er immer alle Einträge Fett gemacht. Könnte mir da jemand auf die Sprünge helfen? Besten Dank BenniP |
Re: Listbox Eintrag fett machen
hi,
Zitat:
gruss urbanbruhin |
Re: Listbox Eintrag fett machen
Du bekommst doch bei der prozedur index übergeben, so musst du einfach nur prüfen oder dieser 4 oder 6 ist oder sonstwas und dann deine methode ausführen.
EDIT: Hier der Code
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); begin If (Index = 4) or (Index = 6) then //Hier die Methode zum fett zeichnen end; |
Re: Listbox Eintrag fett machen
@urbanbruhin:
Oh ja, Verzeihung:
Delphi-Quellcode:
@CLRS530:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); begin listbox1.canvas.FillRect(rect); Listbox1.canvas.Font.Style:= [fsbold]; Listbox1.canvas.TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); end; Werd ich gleich probieren. |
Re: Listbox Eintrag fett machen
Zitat:
|
Re: Listbox Eintrag fett machen
Geht auch! Dankeschön für die schnelle und hilfreiche Antwort! :)
Nur noch eine abschließende Frage, kann ich in dieser OnDraw-Procdure auch for-Schleifen ausführen? |
Re: Listbox Eintrag fett machen
klar, du kannst da alles ausführen was du willst.
die schleife wird dann halt jedesmal bei einem ondraw-event aufgerufen. |
Re: Listbox Eintrag fett machen
Ok, jetzt hab ich mal meine OnDraw-Procdure erweitert.
In Listbox2 stehen die Einträge [0, 2, 5] drin. Die versuche ich mit einer For-Schleife auszulesen und dann mit dem Index zu vergleichen.
Delphi-Quellcode:
Allerdings, markiert er mir nur den fünften Eintrag, also den letzten der Listbbox, fett. Alle anderen sind normal.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var i, i2, iihnhalt: integer; begin with (Control as TListBox).Canvas do begin for i:= 0 to listbox2.Count-1 do begin iihnhalt:= strtoint(listbox2.Items[i]); If Index = iihnhalt then begin FillRect(rect); Font.Style:= [fsbold]; TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); end else begin FillRect(rect); Font.Style:= []; TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); end; end; //DO end; //with end; |
Re: Listbox Eintrag fett machen
Das macht absolut kein Sinn wie du es machst.
OnDraw ist eine Prozedur die so lange aufgerufen wird, wie Elemente in der Listbox sind. Es geht also alle durch. Versuch es mal folgendermaßen:
Delphi-Quellcode:
EDIT : Habs getestet, das funzt so :)
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var iihnhalt: integer; begin with (Control as TListBox).Canvas do begin FillRect(rect); iihnhalt:= strtoint(listbox2.Items[Index]); If Index = iihnhalt then Font.Style:= [fsbold] else Font.Style:= []; TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); end; //with end; Ist doch auch gleich viel angenehmer der Code oder? ;) |
Re: Listbox Eintrag fett machen
Ok ich werds mal testen. Danke schon mal im Vorraus :)
Edit: Ok, aber es funktioniert nur wenn die Anzahl der Listbox2 Einträge mit dem der Listbox1 übereinstimmt. Denn der Index geht ja von 0 bis zum Ende der Listbox1. |
Re: Listbox Eintrag fett machen
Ja klar, ich mein macht doch auch sonst keinen sinn, wie willste denn ne zahl mit nichts vergleichen, selbst wenn es weiter ginge.
|
Re: Listbox Eintrag fett machen
probiers mal so:
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var i, i2, iihnhalt: integer; begin with (Control as TListBox).Canvas do begin FillRect(rect); Font.Style:= []; TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); for i:= 0 to listbox2.Count-1 do begin iihnhalt:= strtoint(listbox2.Items[i]); If Index = iihnhalt then begin FillRect(rect); Font.Style:= [fsbold]; TextOut(Rect.Left+2, Rect.Top, listbox1.Items[index]); end ; end; end; end; |
Re: Listbox Eintrag fett machen
Zitat:
@CLRS530: Die Listbox2 speichert nur die Einträge die hervorgehoben werden sollen. |
Re: Listbox Eintrag fett machen
Achso na dann hab ich dich falsch verstanden gehabt
Delphi-Quellcode:
Mach das aber mal so, dda ist ja soviel redundanz drinne und das Textout gehört auch nicht in die Schleife mit rein, dann wird es ja womöglich viel zu oft aufgerufen.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var i, iihnhalt: integer; begin with (Control as TListBox).Canvas do begin FillRect(rect); for i:= 0 to listbox2.Count-1 do begin iihnhalt:= strtoint(listbox2.Items[i]); If Index = iihnhalt then Font.Style:= [fsbold] else Font.Style:= []; end; TextOut(Rect.Left + 2, Rect.Top, listbox1.Items[index]); end; end; |
Re: Listbox Eintrag fett machen
Dankeschön, sieht gleich ein wenig ordentlicher aus. :)
Aber ein Fehler ist drin. Weis nicht ob es wirklich einer ist, aber wenn ich es so mache wie du es geschrieben hast dann wird wieder nur der 5. (letzter Eintrag in der lstbx2) Eintrag hervorgehoben. Wenn man aber das "Font.Style:= [];" außerhalb der For-Schleife setzt wird alles richtig angezeigt. |
Re: Listbox Eintrag fett machen
Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var i: Integer; begin with (Control as TListBox).Canvas do begin FillRect(Rect); if ListBox2.Items.IndexOf(IntToStr(Index)) <> -1 then Font.Style:= [fsbold] else Font.Style:= []; TextOut(Rect.Left + 2, Rect.Top, ListBox1.Items[Index]); end; end; |
Re: Listbox Eintrag fett machen
jo genau, das ist noch ein wenig besser :)
|
Re: Listbox Eintrag fett machen
Hai BenniP,
ich habe hier mal einen anderen Lösungsweg. Ich "missbrauche" einfach die Eigenschaft Object die jedes Item einer TStringList hat. In diesem Fall caste ich einfach ein boolean auf dieses Object und werte dies dann im OnDrawItem aus. Der Vorteil ist das ich absolut unabhängig von der Postition des Eintrages in der ListBox bin. Also auch wenn ein Eintrag verschoben wird bleibt die Information über das formatieren erhalten:
Delphi-Quellcode:
Hier noch ein kleines Beispiel um bei einem Eintrag zwichen fett und normal umzuschalten:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: integer;
Rect: TRect; State: TOwnerDrawState); begin with (Control as TListBox) do begin canvas.Font.Style := []; canvas.FillRect(rect); if Assigned (Items.Objects[Index]) then begin if boolean(Items.Objects[Index]) then // Casting nach True/False begin canvas.Font.Style := [fsBold] end; end; canvas.TextOut(Rect.Left + 2, Rect.Top, Items[index]); end; end; procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.AddItem('blubb', TObject(True)); // True = Bold ListBox1.Items.Add('meow'); ListBox1.AddItem('><((((>°>', TObject(True)); ListBox1.Items.Add('wuppdi'); ListBox1.AddItem('Was weis denn ich?', TObject(True)); end;
Delphi-Quellcode:
procedure TForm1.SwitchLBItem(aIndex: integer);
begin if ((aIndex < 0) or (aIndex > ListBox1.Count-1)) then begin raise Exception.Create('Parameter liegt ausserhalb des gültigen Bereichs'); end else begin ListBox1.Items.Objects[aIndex] := TObject(not boolean(ListBox1.Items.Objects[aIndex])); ListBox1.Repaint; end; end; procedure TForm1.Button2Click(Sender: TObject); begin SwitchLBItem(1); end; |
Re: Listbox Eintrag fett machen
:o Besten Dank an alle, vorallem an Sharky!
Wow, die Sache von Sharky sieht am schönsten aus! Das mit der Object-Eigenschaft muss ich mir merken, kann ich da alles reinschreiben was ich möchte? Oder gibts da Begrenzungen, oder ist das unsauber? |
Re: Listbox Eintrag fett machen
Hai,
Die Eigenschaft Object ist eigentlisch dafür da um ein richtigs TObject mit einem Eintrag zu verbinden! Aber... letztendlich ist "Object" ja nur ein Pointer und damit ein einfacher 32-Bit Wert. In diesen kann ich also andere Integer-Werte casten (z.B: TColor,Integer,Boolen). Wenn Du mehrere Informationen zu einem Item haben möchtest solltest Du dir dafür aber ein TObject erzeugen und dieses dann "verknüpfen". Wichtig ist dabei -> Du musst die Obejekte selber wieder freigeben wenn das Item aus der Liste gelöscht wird bzw wenn die ListBox selber freigegeben werden soll (z.B. im OnClose der Form). |
Re: Listbox Eintrag fett machen
Danke für die Info.
|
Re: Listbox Eintrag fett machen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Listbox Eintrag fett machen
Fett als Auszeichnung fuer das aktuell selektierte Element ist definitiv haesslich.
Man sollte sich damit auseinandersetzen wofuer welche Auszeichnung gedacht ist. Dafuer gibt es Regeln. Noch schlimmer ist was MS im Kontrollfeld "Software" macht. Das aktuelle Element ist dort (wesentlich) hoeher. |
Re: Listbox Eintrag fett machen
Danke Sharky für die Demo!
Werd dann mal mein Projekt mit Object ausstatten. :) Sieht wesentlich aufgeräumter aus. :D @Robert Marquardt: Die Hervorhebung ist ja eine Markierung von den Einträgen die Besonders sind, also nicht als Ersatz für den blauen "Kasten". Und als Hervorhebung kam mir eigentlich nur das "Fett" in den Sinn, oder Farbe. Allerdings war mir die Sache mit den Farben ein wenig zu unauffällig. |
Re: Listbox Eintrag fett machen
hi,
bin echt viel am rum Probieren aber habe leider noch keine brauchbare Lösung gefunden! Wie kann ich bei einem Eintrag einen Farbverlauf anwenden so das der Hintergrund des Item einen farbverlauf bekommt? mfg olli |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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-2025 by Thomas Breitkreuz