// Da beim Ersetzen von Zeichen in einem TRichEdit mittels
// StringReplace nicht "ganzes Wort" ausgewählt werden kann,
// habe ich mir das folgende WordReplace zusammengebastelt.


// Getestet mit RS 10.4 unter
Win11

function WordReplace(TCRE: TCustomRichEdit; 
  const oldPattern, newPattern: String; kind: TSearchtypes): Integer; 
var 
  S: String; 
  from, corrected, I, lop, place, lnp, displacement: Integer; 
  Table: Array of Integer; 
begin 
  Screen.Cursor := crHourGlass; 
  try 
    if (stWholeWord in kind) and (AnsiLastChar(oldPattern) = #32) then 
      Result := -2 
    else 
    begin 
      S := StringReplace(TCRE.Text, #$D, '', [rfReplaceall]); 
      corrected := Length(S); 
      SetLength(Table, corrected); // falls alles gleiche Zeichen 
      I := 0; 
      from := 0; 
      Result := 0; 
      lop := Length(oldPattern); 
      lnp := Length(newPattern); 
      repeat 
        from := TCRE.FindText(oldPattern, from, corrected, kind); 
        if (from < 0) or (from >= corrected) then 
          break; 
        Table[I] := from; 
        inc(I); 
        inc(from, lop); 
        inc(Result); 
      until false; 
      SetLength(Table, Result); 
      displacement := 0; 
      for I := 0 to High(Table) do 
      begin 
        place := Succ(Table[I]) - I * lop + displacement; 
        delete(S, place, lop); 
        insert(newPattern, S, place); 
        inc(displacement, lnp); 
      end; 
      TCRE.Text := S; 
    end; 
  except 
    Result := -1; 
  end; 
  Table := nil; 
  Screen.Cursor := crDefault; 
end;

 
// Beispielaufruf 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  RichEdit1.Lines.LoadFromFile('D:\Test.txt'); // z.B. 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  hlp: String; 
  number: Integer; 
  kind: TSearchtypes; 
begin 
  kind := [stWholeWord, stMatchCase]; // z.B. 
 
  number := WordReplace(RichEdit1, 'das', 'dieses ', kind); 
 
  if number = -1 then 
    ShowMessage('Es ist ein Fehler aufgetreten.') 
  else if number = -2 then 
    ShowMessage('Bei Auswahl "ganzes Wort" darf kein Leerzeichen ' + 
      'am Ende des Suchbegriffs stehen.'#13#10#10 + 
      'Der Vorgang wurde abgebrochen.') 
  else 
  begin 
    if number = 1 then 
      hlp := '' 
    else 
      hlp := 'e'; 
    ShowMessage(IntToStr(number) + ' Begriff' + hlp + ' ersetzt.'); 
  end; 
end;


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke