Delphi-PRAXiS

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 , Text ersetzen aber Formate erhalten (https://www.delphipraxis.net/6632-richedit-text-ersetzen-aber-formate-erhalten.html)

JoelH 17. Jul 2003 10:30


RichEdit , Text ersetzen aber Formate erhalten
 
Kann mir jemand einen Tip geben wie man in einem RTF-Text am einfachsten Wörter ersetzt ohne das die Formatierung des restlichen Textes zerstört wird ?

Konkretes Problem, ichhabe eine Wordvorlage mit Makro, das will ich komplett ersetzen indem ich das File als RTF abspeichere und dann Delphi die Sachen ersezten lasse die vorher das Wordmakro ersetzt hat,
zB. einfach '<<Adresse1>>' durch 'Jonas' ersetzen.

Wie mach ich dass am besten ?

JoelH 17. Jul 2003 10:57

Re: RichEdit , Text ersetzen aber Formate erhalten
 
ich hab mal hier einen Versuch gestartet
Delphi-Quellcode:
procedure Tform2.ersetzeText(bildschirmrtf:TRichEdit;finden,ersetzen:String);
var position, lf, le : integer;
    helprtf : TRichEdit;
begin
  helprtf := TRichEdit.Create(self);
  helprtf.parent := bildschirmrtf.Parent;
  lf := length(finden);
  le := length(ersetzen);
  helprtf.Text := ersetzen;
  helprtf.SelStart := pos(ersetzen,helprtf.text)-1;
  helprtf.SelLength := le;
  helprtf.CutToClipboard;
  bildschirmrtf.SelStart := pos(finden,bildschirmrtf.text)-1;
  bildschirmrtf.SelLength := lf;
  bildschirmrtf.PasteFromClipboard;
  helprtf.destroy;
end;
Ersetzen tut er es aber leider ist der neu Text nicht im selben Format wie der ersetzte.
Wie kann ich die diese Formatatribute am besten zwischenspeichern und dann wieder zurückschreiben ? Vor allem weil ja die Textlängen verschieden sein können !

Christian Seehase 17. Jul 2003 11:16

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

hast Du auch mal versucht SelAttributes zu speichern und wiederherzustellen?

JoelH 17. Jul 2003 11:23

Re: RichEdit , Text ersetzen aber Formate erhalten
 
ich lauf gerade in die richtung aber irgendwie hab ich mich wohl verzettelt :(
momentaner Codestand
Delphi-Quellcode:
procedure Tform2.ersetzeText(bildschirmrtf:TRichEdit;finden,ersetzen:String);
var position, lf, le : integer;
    helprtf : TRichEdit;
    attrib : TTextattributes;
begin
  helprtf := TRichEdit.Create(self);
  helprtf.parent := bildschirmrtf.Parent;
  lf := length(finden);
  le := length(ersetzen);
  bildschirmrtf.SelStart := pos(finden,bildschirmrtf.text)-1;
  bildschirmrtf.SelLength := lf;
  attrib := bildschirmrtf.DefAttributes;
  helprtf.Text := ersetzen;
  helprtf.SelStart := pos(ersetzen,helprtf.text)-1;
  helprtf.SelLength := le;
  helprtf.SelAttributes := attrib;
  helprtf.CutToClipboard;
  bildschirmrtf.DefAttributes := attrib;
  bildschirmrtf.PasteFromClipboard;
  bildschirmrtf.SelStart := pos(ersetzen,bildschirmrtf.text)-1;
  bildschirmrtf.SelLength := le;
 
  helprtf.destroy;
end;
Irgendwie verwechsle ich da was :(

Christian Seehase 17. Jul 2003 11:25

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

warum nimmst Du denn hier DefAttributes?

Delphi-Quellcode:
attrib := bildschirmrtf.DefAttributes;

JoelH 17. Jul 2003 11:45

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Weil ich gerne die Attribute des selektierten Textes haben will.

Christian Seehase 17. Jul 2003 11:46

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

deshalb ja auch SelAttributes und nicht DefAttributes.

JoelH 17. Jul 2003 12:31

hmm,
 
aber selattributes ist doch zu setzen da oder verstehe ich die Hilfe falsch ? Aber wie auch immer auch dies brigt irgendwie nix :(

JoelH 17. Jul 2003 13:05

hmm,
 
Jipee,

es geht jetzt, ich dacht schon ich bin doof. Hatte mich wohl etas mit dem Def und Sel verzettelt. Die OnlineHilfe dazu ist aber auch mau.

Delphi-Quellcode:
procedure Tform2.ersetzeText(bildschirmrtf:TRichEdit;finden,ersetzen:String);
var position, lf, le : integer;
    helprtf : TRichEdit;
    attrib : TTextattributes;
begin
  helprtf := TRichEdit.Create(self);
  helprtf.parent := bildschirmrtf.Parent;
  lf := length(finden);
  le := length(ersetzen);
  helprtf.Clear;
  bildschirmrtf.SelStart := pos(finden,bildschirmrtf.text)-1;
  bildschirmrtf.SelLength := lf;
  attrib := bildschirmrtf.SelAttributes;
  helprtf.Lines.add(ersetzen);
  helprtf.SelAttributes := attrib;
  helprtf.SelStart := pos(ersetzen,helprtf.text)-1;
  helprtf.SelLength := le;
  helprtf.SelAttributes.Size := attrib.size;
  helprtf.SelAttributes.Name := attrib.Name;
  helprtf.CopyToClipboard;
  bildschirmrtf.PasteFromClipboard;
  bildschirmrtf.SelStart := pos(ersetzen,bildschirmrtf.text)-1;
  bildschirmrtf.SelLength := le;
  bildschirmrtf.SelAttributes := attrib;
  helprtf.destroy;
end;

Christian Seehase 17. Jul 2003 13:57

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

mir ist im Moment nicht ganz klar, wozu Du ein zweites RichEdit brauchst, wenn Du sowieso Text und Attribute getrennt sicherst.
Ausserdem halte ich es für nicht besonders sauber den Austausch über das Clipboard vorzunehmen.

Eine Anwendung die mir ungefragt den Inhalt des ClipBoards zerschiesst hätte auf meinem Rechner keine grosse Überlebenschance ;-)

JoelH 17. Jul 2003 17:18

hmm,
 
das Programm schaufelt eh Daten ins Clipboard und die eghen weiter nach Word, daher ist das Clipboard eh in gebrauch. Ausserdem war mir nicht ganz klar wie ich das sonst handlen soll, also hab ich es mal übers Clipboard realisiert um zu sehen wie, bzw. ob überhaupt, es funktioniert.Ich hab noch ein Paar probleme damit aebr es wird langsam.

Alexander 17. Jul 2003 17:21

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Du kannst die Zwischenablage ja vorher "sichern", dann deine SAchen reinschieben und wieder die alte Zwischenablage herstellen. Das wäre denke ich wesentlich besser...
Ich sichere mir zb kurzzeitug meinen DelphiSource darin, wenn ich was ausprobieren möchte...Es gibt zwar noch ne Rückgängig-Funktion, aber wenn man dann mal auf Speichern kommt....:mrgreen:

Christian Seehase 17. Jul 2003 17:23

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

Zitat:

Zitat von JoelH
das Programm schaufelt eh Daten ins Clipboard und die eghen weiter nach Word

dadurch wird's ja nicht wirklich besser ;-)

Vielleicht kannst Du Dir ja mit einer Temp Datei behelfen, oder einem MemoryStream.

JoelH 17. Jul 2003 18:49

hmm,
 
ihr verkennt die Situation, das sind gewachsene Strukturen, die ich nur weiterbetreue, die sind nicht von mir, darum will ich ja den Wordkram ablösen und im rtf Format weiterentwickeln. Das ganze dann irgenwann Datenbankbasierend, ohne irgendwelche M$ Komponenten irgendeiner Art, naja aber da ich noch nichts mit den Richtextboxen gemacht hab war es heute einfach nur ein Versuch. Mir is auch klar dass dies nicht der Weissheit letzter Schluss ist, es sind quasi empierische Versuche mich in die Materie einzuarbeiten.
Trotzdem, wer Tips hat oder Anleitunen Tutorials, links zum Thema RTF und Delphi(4) dem bin ich sehr dankbar !

Christian Seehase 17. Jul 2003 19:04

Re: RichEdit , Text ersetzen aber Formate erhalten
 
Moin Joel,

okay, das kann man fast schon gelten lassen :D

Was meinst Du mit Tutorials zum Thema RTF?
Das Format kannst Du Dir bei www.wotsit.org besorgen.
Ausserdem hält auch das PSDK so manche Information bereit was mit RichEdit so möglich ist, aber bei Delphi nicht implementiert wurde, teilweise weil es das bei der jeweilgen Version noch nicht gab.

joehd 26. Nov 2019 17:26

AW: RichEdit , Text ersetzen aber Formate erhalten
 
Hy das ist zwar ein alter Code aber ich war mit der Lösung nicht glücklich. Hatten ja einige vorher schon geschrieben. Hier meine Lösung ohne Hilfs RTF

Delphi-Quellcode:
///////////////////////// ERSETZE IM RTF ////////////////////////////////
procedure ersetzeText(myrtf:TRichEdit;finden,ersetzen:String);
var position, lf, le : integer;
    attrib : TTextattributes;
begin
 
  lf := length(finden);
  le := length(ersetzen);
  if pos(finden,myrtf.text) > 0  then
  Begin
   myrtf.SelStart := pos(finden,myrtf.text)-1;
   myrtf.SelLength := lf;
   attrib := myrtf.SelAttributes;
   myrtf.SelText := ersetzen;
   myrtf.SelLength := le;
   myrtf.SelAttributes := attrib;
  End;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 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