Einzelnen Beitrag anzeigen

Benutzerbild von delphi10
delphi10

Registriert seit: 9. Mai 2008
Ort: Salzgitter
14 Beiträge
 
Delphi 2007 Professional
 
#1

Verschiedene Farben im ListBox-String

  Alt 26. Jun 2008, 14:46
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
Miniaturansicht angehängter Grafiken
ausgabe_192.jpg  
Angehängte Dateien
Dateityp: txt ausgabe_193.txt (225 Bytes, 31x aufgerufen)
  Mit Zitat antworten Zitat