![]() |
RichEdit Textformatierung
Hallo!
Ich habe ein interessantes Problem, für das ich noch eine Lösung suche. Ich möchte einen String in einem RichEdit-Element darstellen. Innerhalb dieses Strings möchte ich bestimmte Worte fett markieren. Die zu markierenden Worte sind im String mit geschweiften Klammern [Bsp.: '{Wortfett}'] markiert. Ich habe ein Lösung, mit der ich das Wort inklusive der geschweiften Klammern fett markiert darstellen kann. Allerdings sollen die fett markierten Worte *ohne* Klammern angezeigt werden. Im String kommen öfters auch mehrere Worte vor, die markiert werden sollen. Insgesamt gibt es 30 verschiedene Worte, die - sofern sie im String vorkommen - fett markiert werden sollen. Bsp. für einen String mit mehreren zu markierenden Worten: 'Accomplished {thief} and {information broker}. Modified by Jabba to be an effective {bounty hunter}.' Ich habe die 30 Worte in ein array [KeyWords] eingelesen und lasse alle Strings [TextString] auf die dort enthaltenen Worte abprüfen [Hier mal eine Version zum Copy&Paste mit 3 Worten:]
Delphi-Quellcode:
Das Ergebnis sieht so aus:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, StrUtils; procedure TForm1.Button1Click(Sender: TObject); var a: integer; FettAnfang, FettEnde: integer; KeyWords: array[0..2] of string; TextString: string; begin KeyWords[0]:='{information broker}'; KeyWords[1]:='{bounty hunter}'; KeyWords[2]:='{thief}'; TextString:='Accomplished {thief} and {information broker}. Modified by Jabba to be an effective {bounty hunter}.'; RichEdit1.Text:=TextString; a:=0; while a < High(KeyWords)+1 do begin if AnsiContainsText(TextString, KeyWords[a]) then begin FettAnfang:=Pos(KeyWords[a], TextString)-1; FettEnde:=FettAnfang+(Length(KeyWords[a])+1); RichEdit1.SelStart:=FettAnfang; RichEdit1.SelLength:=(FettEnde-1)-FettAnfang; RichEdit1.SelAttributes.Style:=[fsBold]; end; inc(a); end; end; end. Accomplished {thief} and {information broker}. Modified by Jabba to be an effective {bounty hunter}. Ich würde es aber gerne so hinbekommen: Accomplished thief and information broker. Modified by Jabba to be an effective bounty hunter. Wenn ich aber mit einer Funktion (z.B. mit AnsiReplaceStr) aus dem Textstring die '{}' herauslösche, denn wird der String kürzer und die Fett-Formatierung stimmt dann nicht mehr. Bsp.: Mit dieser Funktion angewendet auf RichEdit1.Text
Delphi-Quellcode:
kommt das hier heraus:
function ConvertKlammern(s: string): string;
begin s:=AnsiReplaceStr(s, '{', ''); s:=AnsiReplaceStr(s, '}', ''); result:=s; end; Accomplished thief and information broker. Modified by Jabba to be an effective bounty hunter. Wer kann helfen? Danke und Gruß, Christoph |
Re: RichEdit Textformatierung
hm...lösch als erstes die klammern, und mach die Worte hinterher fett.
(Die Positionen der Klammern musst du irgendwie speichern) |
Re: RichEdit Textformatierung
Hallo Christoph,
ich würde vorschlagen, dass du als erstes nach diesen Wörtern suchst und dann die Startposition ermittelst. Danach ersetzt du {thief} mit thief, errechnest dir den Endpunkt und markierst dann diesen Bereich Fett. Tschüß Markus |
Re: RichEdit Textformatierung
Hallo!
Schonmal herzlichen Dank für die ersten Tipps. Wenn ich aus dem String zunächst die Startpositionen der Klammern auslese, dann geht das nur beim Vorkommen eines Wortes in Klammern. Dann ist es unproblematisch. Das Problem besteht, wenn mehrere Worte fett werden sollen, denn dann stimmt ja beim zweiten Wort der Startpunkt nicht mehr (ist also dann Startpunkt-2, wenn bereits ein Wort vorher vorkam, bei dem ich dann die Klammern entfernt habe). Oder muss ich erstmal zählen wie viele Worte vorkommen und dann jeweils den Startpunkt berechnen? Das kann´s doch nicht sein... Gruß, Christoph |
Re: RichEdit Textformatierung
Hi!
Wenn du den textzeichenweise durchgehst und das mit Seltext etc. machst, dann gibt dir ja Selstart genau den Startwert des gefundenen wortes zurück. Ciao fkerber |
Re: RichEdit Textformatierung
probier mal hiermit rum (so hab ichs bei mir selbst gemacht!)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var temptext:TRichEdit; Begin temptext:=TRichEdit.Create(Form1); temptext.PlainText:=true; temptext.text:='{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil MS Sans Serif;}}\viewkind4\uc1\pard\f0\fs16'; temptext.text:=temptext.text+StringReplace(DEINTEXT, '{', '\b ', [rfIgnoreCase,rfReplaceAll]); temptext.text:=StringReplace(temptext.text, '}', '\b0', [rfIgnoreCase,rfReplaceAll]); temptext.text:=StringReplace(temptext.text, chr(13), '\par', [rfIgnoreCase,rfReplaceAll])+'}'; DEINTEXT:=temptext.text; end; |
Re: RichEdit Textformatierung
Hallo Xeno-Sebi,
ich werde Deinen code so schnell ich dazu komme mal ausprobieren. Kannst Du ihn mir evtl. noch kurz kommentieren? Dann lerne ich auch was dabei ;) Danke und Gruß, Christoph |
Re: RichEdit Textformatierung
Nochmal Hallo Xeno-Sebi,
leider kann ich mit Deinem Code wenig anfangen, da ich nicht verstehe, was er genau tut. Soll 'DEINTEXT' der String 'Accomplished {thief} and {information broker}. usw' sein? Gruß, Christoph |
Re: RichEdit Textformatierung
yo genau, DEINTEXT ist dieser Text (bzw. das richedit, in dem er steht)
also mein code erstellt erst mal ein temporäres richedit (mir fällt grade auf, dass TStringList genau so gut ginge^^) und schreibt an den Anfang den rtf-header (den hab ich aus irgendeiner rtfdatei geklaut, da ich den rtfcode auch nicht ganz verstehe...) dann wird "{" durch "\b" (\b=rtf für bold) und "}" durch "\b0" (steht für "ende bold") ersetzt das mit \par ist nur nötig, falls zeilenumbrüche vorkämen... am Ende wird dann noch "}" angefügt (bei delphi/pascal entspräche das dem "end.") dann wird das ganze wieder an DEINTEXT zurückgegeben (richedit1.text:=temptext.text) also geht mein beispielcode davon aus, dass da noch ganz unformatiert der ausgangstext steht, da { direkt durch die formatierung ersetzt wird (und nicht wie bei dir erst geboldet und erst hinterher wird "{" gelöscht) WICHTIG: wenn am anfang der text an die replace funktionen übergeben wird, darf er noch kein rtfcode sein, sondern regulärer "memo oda edit-text", da sonst die im rtfcode enthaltenen "{"s bzw. "}"s auch ersetzt werden! |
Re: RichEdit Textformatierung
Hallo Xeno-Sebi,
habe mein Problem mit Deinem Tipp gelöst. Vielen Dank. Ist sogar noch etwas einfacher als gedacht, denn das schließende '}' beendet automatisch das bold tag ('{\b fetter Text}'). Sieht jetzt so aus:
Delphi-Quellcode:
Herzlichen Dank nochmals!
var
TempRichEdit:TRichEdit; begin // rtf schreiben TempRichEdit:=TRichEdit.Create(Form1); TempRichEdit.Text:='{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil MS Sans Serif;}}\viewkind4\uc1\pard\f0\fs16'; TempRichEdit.Text:=TempRichEdit.Text+StringReplace(MEINSTRINGTEXT,'{', '{\b ', [rfIgnoreCase,rfReplaceAll]); // Ausgabe formatiert aus dem temporären RichEdit Form1.RichEdit.Text:=TempRichEdit.Text; Gruß, Christoph |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 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-2025 by Thomas Breitkreuz