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 Wörteraustauschen (https://www.delphipraxis.net/25855-richedit-woerteraustauschen.html)

Reini64 13. Jul 2004 21:54


Richedit Wörteraustauschen
 
Hi,

ich habe folgendes Problem mit "Richedit".

ich habe in meinen Richedit meinen Text formatiert und ausgerichtet. Nun möchte ich die eingebauten Platzhalter (z.B. &&name) durch einen anderen Eintrag ersetzen. Ich verwende dazu folgenden Code:

Delphi-Quellcode:
  var
  n,m,k : integer;
  S,S1: string;

  Suchfeld: array[1..12] of string;
  Ersetzenmit: array[1..12] of string;


begin
  suchfeld[1] := '&&anrede';
  suchfeld[2] := '&&vname';
  suchfeld[3] := '&&strasse';
  suchfeld[4] := '&&plz';
  suchfeld[5] := '&&ort';
  suchfeld[6] := '&&name';
  suchfeld[7] := '&&datum';

  Ersetzenmit[1] := dbedit3.Text;
  Ersetzenmit[2] := dbedit1.Text + ' ' + dbedit2.text;
  Ersetzenmit[3] := dbedit4.Text + ' ' + dbedit5.text;
  Ersetzenmit[4] := dbedit6.Text;
  Ersetzenmit[5] := dbedit7.Text;
  Ersetzenmit[6] := dbedit1.Text;
  Ersetzenmit[7] := formatdatetime('DD. mmmm.YYYY', now);

  if OpenDialog1.Execute then
     begin
       F0002_anschreiben.QRRichText1.Lines.LoadFromFile(OpenDialog1.FileName);
     end;
  S := F0002_anschreiben.QRRichText1.Lines.Text;


       for n :=1 to 7 Do
         Begin
           M:= 1;
           K := length(suchfeld[n]);
           while Pos(suchfeld[n], lowercase(S)) > 0 do
             Begin
               M:= M + 1;
               i := Pos(suchfeld[n], lowercase(S));
               if copy(lowercase(S),I,k) = suchfeld[n] then
                 Begin
                   Delete(S,I,k);
                   Insert(Ersetzenmit[n],S,I);
                 end;
               if M = 500 then break;
             end;
         end;



 F0002_anschreiben.QRRichText1.Lines.text := s;
 F0002_anschreiben.QuickRep1.Preview;
Nach diesen Durchgang sind zwar die Einträge geändert worden ab die Formatierung ist weg.

Was mach ich falsch, wie wäre es richtig ?

Dank für Eure Unterstüzung
:roll:

Ultimator 14. Jul 2004 12:19

Re: Richedit Wörteraustauschen
 
Schau dir mal stringreplace an, das spart viel Arbeit ;-)

Delphi-Quellcode:
stringreplace(Richedit1.Text,'&&name','Hans Müller');

sakura 14. Jul 2004 16:54

Re: Richedit Wörteraustauschen
 
@Reini64: Einmal den Thread zu eröffnen reicht vollkommen. Der andere ist gelöscht :roll:

...:cat:...

Keldorn 14. Jul 2004 17:39

Re: Richedit Wörteraustauschen
 
Hallo

mit stringreplace wird das gleiche werden, da du hier zwangsläufig wieder den text zum richedit zuweist und damit gehen dir wieder die Formatierungen flöten.

Eine andere Variante wäre die Findtext methode des richedits zum suchen und seltext quasi zum ersetzen zu nutzen. In der Hilfe zu richedit.findtext ist auch ein Bsp, das man umbasteln kann: hier mal gaaaanz grob, nur zum probieren:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  FoundAt: LongInt;
  StartPos, ToEnd: Integer;
begin
  with RichEdit1 do
  begin
    { Suchbeginn nach der aktuellen Markierung (falls vorhanden), }
    { andernfalls am Textanfang starten }

    if SelLength <> 0 then
      StartPos := SelStart + SelLength
    else
      StartPos := 0;
    { ToEnd ist die Länge von StartPos bis zum Ende des Textes im RTF-Eingabefeld }
    ToEnd := Length(Text) - StartPos;
    FoundAt := FindText('&&name', StartPos, ToEnd, [stMatchCase]); //<<-
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length('&&name'); //<<-
      seltext := 'Hans Müller'; //<<-
    end;
  end;
end;
du müßtest halt noch den suchbeginn anpasen und das ganze solange durchlaufen, bis keine Worte mehr gefunden werden. Da ist noch ein bissel Arbeit notwendig, die Formatiereungen bleiben aber erhalten.

Mfg Frank

p0w3r5tr34m3r 15. Jul 2004 04:50

Re: Richedit Wörteraustauschen
 
such ma bei torry.net nach TSuperMask..
dann haste weniger code, aber gleiches result ;)

Powerstreamer


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