![]() |
Verschiedene Farben im ListBox-String
Liste der Anhänge anzeigen (Anzahl: 2)
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 |
Re: Verschiedene Farben im ListBox-String
Eine nette Idee. :hi:
Ich habe das mal etwas aufgebohrt. :angel: Damit kann man jetzt fett, kursiv und unterstrichenen Text erzeugen. Die Text- und Hintergrundfarbe kann man beliebig setzen. Ich lass das jetzt mal so stehen, spiele aber mit dem Gedanken, statt dem Paragraphenzeichen die gleichen BBS Codes wie Delphi Praxis zu verwenden.
Delphi-Quellcode:
{***************************************************************
§+B = fett (B steht für Bold) §-B = fett aus §+I = kursiv (I steht für Italic) §-I = kursiv aus §+U = unterstreichen (U steht für Underline) §-U = unterstreichen aus §TCxxxxxxxx = Text Farbe setzen xxxxxxxx ist die Farbe hexadezimal §BCxxxxxxxx = Hintergrund Farbe setzen ****************************************************************} procedure DrawPCodeText(canvas:TCanvas; rect : TRect; text:string); const ESCAPE_CHAR = '§'; procedure OutputText(const s:string); var tlen : Integer; begin Canvas.TextOut(Rect.Left, Rect.Top, s); //Teilstring in das Canvas schreiben tlen := Canvas.TextWidth(s); //Länge des Teilstrings bzw. Platzbedarf im Canvas ermitteln Inc(Rect.Left, tlen); //Zum linken X-Wert der Canvas addieren (für den nächsten Teilstring) end; function ExtractColor(const s : string):TColor; begin Result := StrToInt('$'+s); end; var i, dlen : Integer; tmp : string; color : TColor; begin while text <> '' do begin i := Pos(ESCAPE_CHAR, text); if i <> 0 then begin OutputText(Copy(text, 1, i-1)); Delete(text, 1, i); // ausgegeb. Text + Escapezeichen löschen dlen := 0; tmp := Copy(text,1, 2); if tmp = '+B' then begin canvas.Font.Style := canvas.Font.Style + [fsBold]; dlen := 2; end else if tmp = '-B' then begin canvas.Font.Style := canvas.Font.Style - [fsBold]; dlen := 2; end else if tmp = '+I' then begin canvas.Font.Style := canvas.Font.Style + [fsItalic]; dlen := 2; end else if tmp = '-I' then begin canvas.Font.Style := canvas.Font.Style - [fsItalic]; dlen := 2; // bei kursivem Text braucht man etwas Abstand zum folgenden Text Inc(rect.Left, 3); end else if tmp = '+U' then begin canvas.Font.Style := canvas.Font.Style + [fsUnderline]; dlen := 2; end else if tmp = '-U' then begin canvas.Font.Style := canvas.Font.Style - [fsUnderline]; dlen := 2; end else if tmp = 'TC' then // Text Color begin canvas.Font.Color := ExtractColor(Copy(text,3,8)); dlen := 10; end else if tmp = 'BC' then // Background Color begin canvas.Brush.Color := ExtractColor(Copy(text,3,8)); dlen := 10; end else if tmp[1]=ESCAPE_CHAR then begin OutputText(ESCAPE_CHAR); dlen := 1; end; if dlen > 0 then Delete(text, 1, dlen); end else begin OutputText(text); text := ''; end; end; end; Procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin With TListBox(Control) do begin Canvas.FillRect(Rect); // Hintergrund löschen DrawPCodeText(Canvas, Rect, Items[Index]); end; end; |
Re: Verschiedene Farben im ListBox-String
Hallo Shmia
Schöne Erweiterung. Macht es besser allgemein einsetzbar. Meine Version war an einem Abend geboren und implementiert. Im Moment bin ich dabei, alles auch für RichEdit umzubauen und - weil man hier auch ein Wort selektieren kann- hinter markierten Worten so quasi Hyperlinks für Querverweise aufbauen kann. Läuft schon ganz gut, werde ich hier dann mal hochladen. cu delphi10 |
Re: Verschiedene Farben im ListBox-String
Praktisch ! genauso was habe ich auch vor... Ich möchte eine Klasse ableiten von TListBox und dort alles einbauen was für mich sinvoll ist. Dazu zählt auch sowas. Du brauchst kein RTF einzubauen sondern einfach nur BB-Code Unterstützung.
Für eine ListBox reicht das. weißt du wie ich das meine ? mit Hilfe von BB-Code ist das ganze etwas dynamischer. |
Re: Verschiedene Farben im ListBox-String
Zitat:
Ich werde mal ein Konzentrat aus meinen Sekretionen bilden und dann hochladen. Bis denne cu delphi10 |
Re: Verschiedene Farben im ListBox-String
Nein so meinte ich das eigentlich nicht. Ich meinte das man mit Anweisungen das macht. nicht mit dem Markieren.
Das ich einfach schreiben kann b in [] und schon ist es Fett bis /[] oder so. |
Re: Verschiedene Farben im ListBox-String
Liste der Anhänge anzeigen (Anzahl: 2)
Hi
Ja, gut. Das erreiche ich natürlich auc. Aber wie auch immer. Ich habe mir jetzt ein Hilfesystem aufgebaut, das genau auf die Bedürfnisse meiner Anwender zugeschnitten ist. Es ist, zugegeben, sehr propietär. Meine Ursprüngliche Version habe doch noch auf RichEdit umgestrickt. Geht auch relativ einfach:
Delphi-Quellcode:
Das was ich wollte und wie ich es realisiert habe, habe ich als JPG und TXT mit hochgeladen.
//Habe ich irgendwo im Netz gefunden. Wenn jemand weiß, wer der Autor ist, will ich ihn gern erwähnen.
Procedure AddStyledText(s:string; style1,Style2:TFontStyles;c: TColor; var aRtf:TRichEdit); begin artf.SelStart := strlen(pchar(artf.text)); artf.SelAttributes.Style := style1+style2; artf.SelAttributes.Color := c; artf.SelText := s; end; //Alles vorhergehende ist wie in der ersten Version If (Pos('§',tASt) >= 1) then begin //Für fett, unterstrichen und Blau Delete(tASt,Pos('§',tASt),1); Insert('>',tASt,1); //Muß nicht sein, verdeutlicht aber, dass weitere Info's verfügbar sind AddStyledText(tASt+' ',[fsbold],[fsunderline],clBlue,Form10.Richedit1); end; If (Pos('#',tASt) >= 1) then begin //Für fett und Blau Delete(tASt,Pos('#',tASt),1); //Steuerzeichen wieder löschen AddStyledText(tASt+' ',[fsbold],[],clBlue,Form10.Richedit1); end; //Alles folgende ist wie in der ersten Version Hilfesystem und Hilfetext(Steuer)Datei sind so konstruiert, dass der Anwender den Umfang und Inhalt der Textdatei beliebig erweitern kann, ohne das ich das Programm ändern müßte. Möglicherweise ist das mit BBCode einfacher zu realisieren, ich werde mal versuchen da einzusteigen. cu delphi10 ach so, bevor sich jemand berufen fühlt - für Uli Stein habe ich eine Lizenz. Edit: Ich krieg die Textdatei nicht als Anlage dran. Nochmal versuchen |
Re: Verschiedene Farben im ListBox-String
warum nutzt du nicht einfach CHM oder HLP als Hilfe Format ?
Es gibt genügend Tools dafür. Auch für Delphi. |
Re: Verschiedene Farben im ListBox-String
Zitat:
cu delphi10 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 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 by Thomas Breitkreuz