// 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;
|