AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RichEdit Textformatierung

Ein Thema von Christoph · begonnen am 25. Mär 2004 · letzter Beitrag vom 14. Jan 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#1

RichEdit Textformatierung

  Alt 25. Mär 2004, 18:27
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Xeno-Sebi

Registriert seit: 14. Mär 2004
Ort: Witterschlick (bei Bonn)
51 Beiträge
 
Delphi 6 Professional
 
#2

Re: RichEdit Textformatierung

  Alt 25. Mär 2004, 18:35
hm...lösch als erstes die klammern, und mach die Worte hinterher fett.
(Die Positionen der Klammern musst du irgendwie speichern)
  Mit Zitat antworten Zitat
Markus K.

Registriert seit: 26. Jan 2004
Ort: Halle
346 Beiträge
 
Delphi 2005 Personal
 
#3

Re: RichEdit Textformatierung

  Alt 25. Mär 2004, 18:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#4

Re: RichEdit Textformatierung

  Alt 25. Mär 2004, 20:29
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#5

Re: RichEdit Textformatierung

  Alt 25. Mär 2004, 20:35
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
Frederic Kerber
  Mit Zitat antworten Zitat
Xeno-Sebi

Registriert seit: 14. Mär 2004
Ort: Witterschlick (bei Bonn)
51 Beiträge
 
Delphi 6 Professional
 
#6

Re: RichEdit Textformatierung

  Alt 25. Mär 2004, 21:02
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;
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#7

Re: RichEdit Textformatierung

  Alt 26. Mär 2004, 15:32
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#8

Re: RichEdit Textformatierung

  Alt 26. Mär 2004, 18:22
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Xeno-Sebi

Registriert seit: 14. Mär 2004
Ort: Witterschlick (bei Bonn)
51 Beiträge
 
Delphi 6 Professional
 
#9

Re: RichEdit Textformatierung

  Alt 26. Mär 2004, 18:47
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!
  Mit Zitat antworten Zitat
Benutzerbild von Christoph
Christoph

Registriert seit: 23. Jan 2004
Ort: Heidelberg
48 Beiträge
 
Delphi 6 Personal
 
#10

Re: RichEdit Textformatierung

  Alt 29. Mär 2004, 15:36
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
'Bist 900 Jahre alt wirst aussehen Du nicht gut!'
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz