AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Verschiedene Farben im ListBox-String

Verschiedene Farben im ListBox-String

Ein Thema von delphi10 · begonnen am 26. Jun 2008 · letzter Beitrag vom 30. Jun 2008
Antwort Antwort
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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Verschiedene Farben im ListBox-String

  Alt 27. Jun 2008, 11:37
Eine nette Idee.
Ich habe das mal etwas aufgebohrt.
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 = '+Bthen
         begin
            canvas.Font.Style := canvas.Font.Style + [fsBold];
            dlen := 2;
         end
         else if tmp = '-Bthen
         begin
            canvas.Font.Style := canvas.Font.Style - [fsBold];
            dlen := 2;
         end
         else if tmp = '+Ithen
         begin
            canvas.Font.Style := canvas.Font.Style + [fsItalic];
            dlen := 2;
         end
         else if tmp = '-Ithen
         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 = '+Uthen
         begin
            canvas.Font.Style := canvas.Font.Style + [fsUnderline];
            dlen := 2;
         end
         else if tmp = '-Uthen
         begin
            canvas.Font.Style := canvas.Font.Style - [fsUnderline];
            dlen := 2;
         end
         else if tmp = 'TCthen // Text Color
         begin
            canvas.Font.Color := ExtractColor(Copy(text,3,8));
            dlen := 10;
         end
         else if tmp = 'BCthen // 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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von delphi10
delphi10

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

Re: Verschiedene Farben im ListBox-String

  Alt 28. Jun 2008, 17:59
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
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Verschiedene Farben im ListBox-String

  Alt 28. Jun 2008, 19:59
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von delphi10
delphi10

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

Re: Verschiedene Farben im ListBox-String

  Alt 29. Jun 2008, 16:36
Zitat von mimi:
weißt du wie ich das meine ?
Im großen und ganzen ja. Aber ein einzelnes Wort selektieren durch click oder doubleclick geht meines W. nicht in der Listbox. In der RichEdit gaht das. Ich habe das ganze für ein selbstgesticktes Hilfesystem aufgezogen und bin soweit, dass ich ein unterstrichenes Wort (blau) durch doubleclick auswähle und damit ein Fenster mit zusätzlichen Erläuterungen öffne. Einfach,simple und der User kann den Hilfetext, wenn er will, jederzeit erweitern ohne das ich das Programm ändern müsste.
Ich werde mal ein Konzentrat aus meinen Sekretionen bilden und dann hochladen. Bis denne
cu delphi10
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Verschiedene Farben im ListBox-String

  Alt 29. Jun 2008, 17:52
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.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von delphi10
delphi10

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

Re: Verschiedene Farben im ListBox-String

  Alt 30. Jun 2008, 10:34
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:
//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
Das was ich wollte und wie ich es realisiert habe, habe ich als JPG und TXT mit hochgeladen.
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
Miniaturansicht angehängter Grafiken
hilfetextausgabe_summe_767.jpg  
Angehängte Dateien
Dateityp: txt helptexte_neu_145.txt (2,6 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Verschiedene Farben im ListBox-String

  Alt 30. Jun 2008, 11:49
warum nutzt du nicht einfach CHM oder HLP als Hilfe Format ?
Es gibt genügend Tools dafür. Auch für Delphi.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von delphi10
delphi10

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

Re: Verschiedene Farben im ListBox-String

  Alt 30. Jun 2008, 12:53
Zitat von mimi:
warum nutzt du nicht einfach CHM oder HLP als Hilfe Format ?
Es gibt genügend Tools dafür. Auch für Delphi.
Ja, die Frage ist natürlich berechtigt. Aber ich finde es einfach befriedigender etwas selbst zu durchdenken als vorgekaute Tools zu verwenden. Gut, ich habe jetzt nicht so den Zeitdruck, ich kann mir die Bastelei leisten. Andernfalls würde ich/müßte ich schon auf Fertiges zurückgreifen. Es macht mir einfach Spaß so etwas zu entwickeln und - im Rahmen gewisser Stylegrenzen - dem Programm etwas Individualität zu vermitteln. Meinen Anwendern gefällts und mir macht's halt Spaß.
cu delphi10
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf