Hallo
Für die farbige Textausgabe aus Listboxen etc. steht ja die Möglichkeit ListBox1DrawItem() zur Verfügung um einzelne Zeilen unterschiedlich einzufärben. Die Variante, ein einzelnes Wort aus einem String zu beeinflussen, ist damit aber nicht möglich.
Das wollte ich aber realisieren, habe aber nichts einschlägiges gefunden. Also habe ich ListBox1DrawItem() etwas abgeändert. Statt den gesamten String auszugeben, löse ich ihn in einzelne Worte auf und gebe die nacheinander aus. Durch voranstellen eines Steuerzeichens kann das einzelne Wort jetzt fast beliebig formatiert werden. Gewählt habe ich § für Farbe und Fett, das # für Farbe, Fett und kursiv. Die Auswahl der Steuerzeichen ist etwas eingeschränkt, man will sie ja vielleicht auch im normalen Text verwenden können.
Delphi-Quellcode:
Procedure TForm10.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
Var
ASt, //Ausgabestring
tAst: String; //Teilausgabestring (einzelnes Wort)
m, //Zähler durch den Ausgabestring
l: Integer; //Länge des Teilstrings im Canvas
begin
tAst := '';
m := 1;
With TListBox(Control) do
begin
Form10.Listbox1.Font.Name := 'Arial';
Canvas.Font.Size := 10;
Form10.ListBox1.ItemHeight := 18;
ASt := Items[Index];
Repeat
// ++++++++++++++++++++++++++++++++++++++++++++++++++
// Löst den Ausgabestring in einzelne Worte auf. Delimiter ist space
If Ast <> '' then
repeat
tAst := tAst + Ast[m];
inc(m);
until (Ast[m] = ' ') or (m >= length(Ast)+1);
// ++++++++++++++++++++++++++++++++++++++++++++++++++
// Entsprechend des Steuerzeichens das einzelne Wort behandeln
If (Pos('§',tAst) >= 1) or (Pos('#',tAst) >= 1) then
begin
If (Pos('§',tAst) >= 1) then
begin
Canvas.Font.Color:=clBlue;
Canvas.Font.Style:=[fsbold];
Delete(tAst,Pos('§',tAst),1);
end;
If (Pos('#',tAst) >= 1) then
begin
Canvas.Font.Color:=clRed;
Canvas.Font.Style:=[fsItalic] + [fsBold];
Delete(tAst,Pos('#',tAst),1);
end;
end else
begin
Canvas.Font.Style:=[];
Canvas.Font.Color:=clHotLight;
end;
Canvas.TextOut(Rect.Left+4, Rect.Top, tAst); //Teilstring in das Canvas schreiben
l := Canvas.TextWidth(tAst); //Länge des Teilstrings bzw. Platzbedarf im Canvas ermitteln
Rect.Left := Rect.Left + l; //Zum linken X-Wert der Canvas addieren (für den nächsten Teilstring)
If tAst = '' then Exit;
tAst := '';
until m >= length(Ast);
end;
end;
Ein Beispiel habe ich mal angehängt. Es geht möglicherweise eleganter, aber vielleicht kann's ja jemand gebrauchen. Feedback ist willkommen.
Gruß Delphi10