![]() |
Einzelne Wörter in TListBox fett zeichnen
Hallo,
tut mir leid, wenn ich euch schon wieder zur Hilfe ziehen muss, aber leider gibt es wohl noch kein entsprechendes Thema oder eine passende Hilfe auf Google. Also: Ich habe eine TListBox. Wie man ganze Einträge (also Zeilen) fett zeichnen kann, weiß ich ja. Nur, wie kann ich mit DrawItem nur einzelte Wörter oder Buchstaben fett zeichnen? Die Methode OnDrawItem kennt ja leider keinen Zeichenindex, sondern nur einen Zeilenindex. Gibt es hier auch eine Möglichkeit, dieses evtl. zu bekommen? MFG |
AW: Einzelne Wörter in TListBox fett zeichnen
Indem du den Text der gerade zu zeichnenden Zeile zerlegst und separat ausgibst.
Nehmen wir an, alle Ziffern sollen Fett geschrieben werden. In etwa würde ich mir das dann (ganz primitiv) so vorstellen:
Delphi-Quellcode:
var i:integer; s:string;
begin with TListBox(Sender), Canvas, Font do begin PenPos:=Rect.TopLeft; s:=Items[Index]; for i:=1 to Length(s) do begin if s[i] in ['0'..'9'] then Style:=[fsBold] else Style:=[]; TextOut(PenPos.X,PenPos.Y,s[i]); end; end; end; |
AW: Einzelne Wörter in TListBox fett zeichnen
Danke bis hierhin schonmal.
Nun hätte ich noch drei andere Fragen. Und zwar:
Ich hoffe, ihr könnt mir auch hier wieder kurz Hilfe leisten. Danke. |
AW: Einzelne Wörter in TListBox fett zeichnen
Bei der API Funktion Drawtext kannst du mit den Flags bestimmen, wie Tabs behandelt werden sollen.
|
AW: Einzelne Wörter in TListBox fett zeichnen
Zitat:
OwnerDrawVariable = Zeilenhöhe für jede Zeile separat bestimmen. Dann wird vor OnDrawItem ein OnMeasureItem ausgelöst, in dem du die Zeilenhöhe festlegen kannst. Zitat:
Vielleicht postest du mal deinen Code? |
AW: Einzelne Wörter in TListBox fett zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
MFG und Danke bis hierhin; Dennis |
AW: Einzelne Wörter in TListBox fett zeichnen
Zitat:
Zitat:
Wie soll man dir helfen, wenn man nicht weiß, wie du die Texte ausgibst. |
AW: Einzelne Wörter in TListBox fett zeichnen
Ich würde einfach TJvHTListBox aus der JVCL verwenden. Da kannst du einfach HTML zur Formatierung nutzen. Das ist sicher ein klein wenig langsamer, aber in einer Listbox hat man ja auch kaum tausende von Einträgen.
|
AW: Einzelne Wörter in TListBox fett zeichnen
Hallo,
Ich habe noch keine OnDrawItem-Prozedur für DIESE ListBox, da ich es im Grunde nur für den Highlight des jeweiligen Texts zwischen dem Zeichen #9 und : brauche. Das ist die erste ListBox. Die zweite, die man auch auf dem Screenshot meines letzten Beitrags sehen kann, hat folgenden Code:
Delphi-Quellcode:
TfmChat = class(TForm)
public { Public-Deklarationen } NickName: String; //Anzeigename end; { ... } procedure TfmChat.lbPeopleDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); { Eigenen Namen fett anzeigen } begin if Index = lbPeople.Items.IndexOf(NickName) then begin (Control as TListBox).Canvas.Font.Style := [fsBold]; end else begin (Control as TListBox).Canvas.Font.Style := []; end; with Control as TListBox do begin Canvas.Pen.Color := lbPeople.Color; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left + 2,Rect.Top - 1,Items[Index]); end; end; |
AW: Einzelne Wörter in TListBox fett zeichnen
Zitat:
Das hast du mit
Delphi-Quellcode:
so vorgegeben.
Canvas.TextOut(Rect.Left + 2,Rect.Top - 1,Items[Index]);
Mit Rect.Top-1 positionierst du den Text 1 Pixel oberhalb der Zeile. Abhilfe:
Delphi-Quellcode:
Das "FillRect" kannst du dir dann auch sparen.
Canvas.TextRect(Rect,Rect.Left+2,Rect.Top-1,Items[Index]);
|
AW: Einzelne Wörter in TListBox fett zeichnen
Danke, das hat (zumindest für WinAero) schonmal geholfen.
Der Grund, weshalb ich den einen Pixel abziehen musste war, dass es sonst auf WinXP im Klassischen Design zu genau dem umgekehrten Fehler kam. MFG |
AW: Einzelne Wörter in TListBox fett zeichnen
Könnte mir evtl. jemand mal ein beispiel zu den fetten Wörtern in der TListBox geben, irgendwie kriege ich das nicht mal in ansätzen richtig hin.
Danke ;D |
AW: Einzelne Wörter in TListBox fett zeichnen
Hallo, kann mir denn keiner hier helfen?
Außerdem stehe ich nach wie vor vor dem Problem mit den Tabsprüngen, die beim Draw-en nicht richtig angezeigt werden. Meine Suchen bisher waren leider erfolglos. MFG |
AW: Einzelne Wörter in TListBox fett zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Mach es dir doch nicht so schwer... ich habe dir oben schon eine sehr einfache Lösung gepostet... ein Beispiel, folgender Text in der TJvHTListBox:
Zitat:
Delphi-Quellcode:
Heraus kommt dann das (links: TJvHTListBox mit obigem Text, rechts: selbst gezeichnet):
procedure TForm246.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
const TextToHighlight = 'Dennis:'; var MyListBox: TListBox; CurrentItem: string; CurrentRect: TRect; CurrentPaintLeft: Integer; FormatValue: Integer; begin MyListBox := Control as TListBox; CurrentItem := MyListBox.Items[Index]; CurrentRect := Rect; FormatValue := DT_LEFT or DT_EXPANDTABS or DT_TABSTOP; LongRec(FormatValue).Bytes[1] := 14; // Tabbreite in Buchstaben if AnsiSameText(Copy(CurrentItem, 1, Length(TextToHighlight)), TextToHighlight) then begin Delete(CurrentItem, 1, Length(TextToHighlight)); DrawText(MyListBox.Canvas.Handle, CurrentItem, Length(CurrentItem), CurrentRect, FormatValue); // erst den Text dahinter MyListBox.Canvas.Font.Style := [fsBold]; DrawText(MyListBox.Canvas.Handle, TextToHighlight, Length(TextToHighlight), CurrentRect, FormatValue); // nun den Namen vorne end else DrawText(MyListBox.Canvas.Handle, CurrentItem, Length(CurrentItem), CurrentRect, FormatValue); end; Anhang 39164 |
AW: Einzelne Wörter in TListBox fett zeichnen
Hm, danke schonmal.
Wieso erstellst du eine neue TListBox ("MyListbox")? Wir haben doch schon eine? |
AW: Einzelne Wörter in TListBox fett zeichnen
Die TListBox wird im Sender als TWinControl übergeben, das hat aber keinen Canvas. Also caste ich den Sender auf TListBox, wobei as vorher prüft, ob das auch wirklich eine TListBox ist.
So kann der Code benutzt werden ohne eine bestimmte TListBox anzusprechen, ich bekomme sie ja im Sender. Eine neue erstellt wird da nirgends. |
AW: Einzelne Wörter in TListBox fett zeichnen
hm, kann ich nicht einfach statt dem MyListBox da die Listbox einsetzen, mit der ich das mache?
Also ich habe ja schon im OI eine Listbox platziert, und mit der will ich das auch machen. Wenn ich die also mit Namen anspreche, wird diese ja nicht als WinControl übergeben, sondern als TListBox. Falls das der Grund für die neue TListBox war, so müsste dies eigentlich auch funktionieren, oder? |
AW: Einzelne Wörter in TListBox fett zeichnen
Zitat:
Ich habe die auch im OI gesetzt. Das OnDrawItem bekommt diese Listbox als Sender übergeben, aber als Vorfahrtyp, nicht konkret als TListBox. Deshalb muss der Typ noch auf TListBox gecastet werden, damit man als TListBox damit arbeiten kann. Das bleibt dabei aber immer noch die selbe Listbox. |
AW: Einzelne Wörter in TListBox fett zeichnen
Achso, das war mir noch nicht so ganz klar gewesen.
Werde ich gleich morgen ausprobieren, danke. MFG |
AW: Einzelne Wörter in TListBox fett zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Hm, also entweder habe ich beim copy&paste erheblich was falsch gemacht, oder es funktioniert nicht.
Der Quelltext, so wie beschrieben, kann gar nicht funktionieren, da DrawText den HighlightText als PChar benötigt. Und selbst wenn man das Problem dann behoben hat, so hat das Resultat kaum etwas mit dem gemeinsam, was ich brauche. 1. Der Text wird nicht ge-highlighted. 2. Das einzige, was sich ändert ist, dass ich nun so hässliche permanente FocusRects überall habe, und der Selected-Hintergrundfokus nicht über die Gesamte Breite verläuft. (Screenshot beiliegend) Danke trotzdem bis hierher. |
AW: Einzelne Wörter in TListBox fett zeichnen
Das mit dem PChar liegt daran, dass du Delphi 7 hast, darauf hatte ich nicht weiter geachtet. Damals (ist ja nun immerhin 11 Jahre alt) gab es die Stringversion von DrawText noch nicht.
Das mit der Markierung war noch ein Fehler, da fehlte ein FillRect um die Markierung aufzuräumen. Mit Delphi 7 funktioniert es bei mir so:
Delphi-Quellcode:
procedure TForm246.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
const TextToHighlight = 'Dennis:'; var MyListBox: TListBox; CurrentItem: string; CurrentRect: TRect; CurrentPaintLeft: Integer; FormatValue: Integer; begin MyListBox := Control as TListBox; CurrentItem := MyListBox.Items[Index]; CurrentRect := Rect; MyListBox.Canvas.FillRect(Rect); FormatValue := DT_LEFT or DT_EXPANDTABS or DT_TABSTOP; LongRec(FormatValue).Bytes[1] := 14; // Tabbreite in Buchstaben if AnsiSameText(Copy(CurrentItem, 1, Length(TextToHighlight)), TextToHighlight) then begin Delete(CurrentItem, 1, Length(TextToHighlight)); DrawText(MyListBox.Canvas.Handle, PChar(CurrentItem), Length(CurrentItem), CurrentRect, FormatValue); // erst den Text dahinter MyListBox.Canvas.Font.Style := [fsBold]; DrawText(MyListBox.Canvas.Handle, PChar(TextToHighlight), Length(TextToHighlight), CurrentRect, FormatValue); // nun den Namen vorne end else DrawText(MyListBox.Canvas.Handle, PChar(CurrentItem), Length(CurrentItem), CurrentRect, FormatValue); end; |
AW: Einzelne Wörter in TListBox fett zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Ehm, zumindest danke für die Mühe bis hierher.
Zuerst die gute Nachricht: Die optischen "Zwischenfälle" sind nun behoben, es funktioniert nun wieder alles. Nur leider wird auch nichts ge-highlighted (siehe Screenshot). |
AW: Einzelne Wörter in TListBox fett zeichnen
Naja, die Abfrage, ob der Text in der Zeile vorkommt, musst du schon anpassen...
Delphi-Quellcode:
Das war ja nur ein Beispiel, in dem wie im Screenshot zu sehen der Text "Dennis:" am Anfang der Zeile steht...
if AnsiSameText(Copy(CurrentItem, 1, Length(TextToHighlight)), TextToHighlight) then
// ... |
AW: Einzelne Wörter in TListBox fett zeichnen
Hey, danke, jetzt hat alles funktioniert.
Habe gerade noch mal ~6h dran gesessen, und es scheint alles zu funktionieren. Vielen Dank für die Hilfe. MFG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 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