Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RichEdit Textformatierung (https://www.delphipraxis.net/18887-richedit-textformatierung.html)

Christoph 25. Mär 2004 17:27


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:
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.
Das Ergebnis sieht so aus:

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:
function ConvertKlammern(s: string): string;
begin
    s:=AnsiReplaceStr(s, '{', '');
    s:=AnsiReplaceStr(s, '}', '');
    result:=s;
end;
kommt das hier heraus:

Accomplished thief and information broker. Modified by Jabba to be an effective bounty hunter.

Wer kann helfen?

Danke und Gruß,
Christoph

Xeno-Sebi 25. Mär 2004 17:35

Re: RichEdit Textformatierung
 
hm...lösch als erstes die klammern, und mach die Worte hinterher fett.
(Die Positionen der Klammern musst du irgendwie speichern)

Markus K. 25. Mär 2004 17:49

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

Christoph 25. Mär 2004 19:29

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

fkerber 25. Mär 2004 19:35

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

Xeno-Sebi 25. Mär 2004 20:02

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;

Christoph 26. Mär 2004 14:32

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

Christoph 26. Mär 2004 17:22

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

Xeno-Sebi 26. Mär 2004 17:47

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!

Christoph 29. Mär 2004 14:36

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:
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;
Herzlichen Dank nochmals!

Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
Seite 1 von 2  1 2      

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