Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einzelne Wörter in TListBox fett zeichnen (https://www.delphipraxis.net/174396-einzelne-woerter-tlistbox-fett-zeichnen.html)

Dennis07 20. Apr 2013 00:14

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

Amateurprofi 20. Apr 2013 02:42

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;

Dennis07 20. Apr 2013 10:16

AW: Einzelne Wörter in TListBox fett zeichnen
 
Danke bis hierhin schonmal.
Nun hätte ich noch drei andere Fragen. Und zwar:
  • Wann muss ich als TListBox.Style OwnerDrawFixed und wann OwnerDrawVariable einsetzen?
  • Wie kann ich verhindern, dass Fett gedruckter Text in manchen Windows-Designs so hässlich über den Rand der TListbox steht?
  • In meinem bisherigen Versuch werden Tabstopps beim Draw-Vorgang ignoriert und erscheinen am Ende nicht in der Listbox. Wie kann ich das beheben?

Ich hoffe, ihr könnt mir auch hier wieder kurz Hilfe leisten.
Danke.

Luckie 20. Apr 2013 20:31

AW: Einzelne Wörter in TListBox fett zeichnen
 
Bei der API Funktion Drawtext kannst du mit den Flags bestimmen, wie Tabs behandelt werden sollen.

Amateurprofi 20. Apr 2013 20:51

AW: Einzelne Wörter in TListBox fett zeichnen
 
Zitat:

Wann muss ich als TListBox.Style OwnerDrawFixed und wann OwnerDrawVariable einsetzen?
OwnerDrawFixed = immer gleiche Zeilenhöhe.
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:

Wie kann ich verhindern, dass Fett gedruckter Text in manchen Windows-Designs so hässlich über den Rand der TListbox steht?
Ist mir noch nie paasiert. Wenn du in den Canvas der ListBox zeichnest dann kann m.E. auch nur innerhalb der ListBox gezeichnet werden.

Vielleicht postest du mal deinen Code?

Dennis07 20. Apr 2013 22:13

AW: Einzelne Wörter in TListBox fett zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Amateurprofi (Beitrag 1212211)
OwnerDrawFixed = immer gleiche Zeilenhöhe.
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.

Okay. Und wie kann ich das genau machen, d.h. wie kann ich herausfinden, wie viel platz eine Zeile benötigt, um richtig dargestellt werden zu können?

Zitat:

Zitat von Amateurprofi (Beitrag 1212211)
Ist mir noch nie paasiert. Wenn du in den Canvas der ListBox zeichnest dann kann m.E. auch nur innerhalb der ListBox gezeichnet werden.

Nein, so meine ich das nicht. Was ich meine ist: Es wird über das Item der Listbox hinaus das Rect des fetten Texts gezeichnet, wenn dieser Eintrag makiert wurde (siehe Screenshot).


Zitat:

Zitat von Amateurprofi (Beitrag 1212211)
Vielleicht postest du mal deinen Code?

Ehm, da müsstest du mir sagen, welche Teile relevant für dich sind. Der Code ist zu lang, als dass ich es jemandem zumuten könnte, ich zu lesen. Außerdem werdende ich (ein bischen) Code von anderen, müsste also erst den Papierkram erledigen.

MFG und Danke bis hierhin;
Dennis

Amateurprofi 22. Apr 2013 02:23

AW: Einzelne Wörter in TListBox fett zeichnen
 
Zitat:

Zitat von Dennis07 (Beitrag 1212214)
Zitat:

Zitat von Amateurprofi (Beitrag 1212211)
OwnerDrawFixed = immer gleiche Zeilenhöhe.
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.

Okay. Und wie kann ich das genau machen, d.h. wie kann ich herausfinden, wie viel platz eine Zeile benötigt, um richtig dargestellt werden zu können?

Indem du die Höhe des auszugebenden Textes berechnest, mit Canvas.TextHeight zum Beispiel.


Zitat:

Zitat von Dennis07 (Beitrag 1212214)
Zitat:

Zitat von Amateurprofi (Beitrag 1212211)
Vielleicht postest du mal deinen Code?

Ehm, da müsstest du mir sagen, welche Teile relevant für dich sind. Der Code ist zu lang, als dass ich es jemandem zumuten könnte, ich zu lesen. Außerdem werdende ich (ein bischen) Code von anderen, müsste also erst den Papierkram erledigen.

Na ja, die ListBoxDrawItem Procedure, denke ich.
Wie soll man dir helfen, wenn man nicht weiß, wie du die Texte ausgibst.

jaenicke 22. Apr 2013 09:34

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.

Dennis07 22. Apr 2013 12:16

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;

Amateurprofi 22. Apr 2013 13:37

AW: Einzelne Wörter in TListBox fett zeichnen
 
Zitat:

Wie kann ich verhindern, dass Fett gedruckter Text in manchen Windows-Designs so hässlich über den Rand der TListbox steht?
Ich vermute, du meinst, dass oberhalb des Textes 1 Pixel oberhalb der eigentlichen Zeile blau eingefärbt ist.
Das hast du mit
Delphi-Quellcode:
Canvas.TextOut(Rect.Left + 2,Rect.Top - 1,Items[Index]);
so vorgegeben.
Mit Rect.Top-1 positionierst du den Text 1 Pixel oberhalb der Zeile.
Abhilfe:
Delphi-Quellcode:
Canvas.TextRect(Rect,Rect.Left+2,Rect.Top-1,Items[Index]);
Das "FillRect" kannst du dir dann auch sparen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 Uhr.
Seite 1 von 3  1 23      

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