Здравствуйте, Kensh1n.
На сколько я понял, расширение документа у тебя ".rtf". Документы в формате RTF сохраняются в виде обогащенного, а не обычного текста. Подробнее о структуре можешь посмотреть
тут. Впринцыпе, твоим методом можно заменять слова в таком тексте, но это опасно, т.к. можно случайно заменить тэги и тогда структура документа испортится. Для примера открой свой rtf файл обычным блокнотом. Ты увидишь там много разнообразных тэгов. Чтоб не испортить структуру документа, можно сделать алгоритм игнорирования тегов и замены только в тексте. Но, можно зделать попроще. Если хорошо посмотреть, то видно, что закладки в документе rtf обозначаются тэгами {\*\bkmkstart zakladka}{\*\bkmkend zakladka}, где zakladka - имя закладки. И тогда надо будет немного расширить твою процедуру, например так (смотри во вложении). bkmName1 и bkmName2 - это имена первой и второй закладок (между которыми надо заменять).
P.S. Еще могу посоветовать замену не между двух закладок, а внутри одной. В ворде надо выделить таблицу, и сделать её полностью закладкой. В процедуре надо будет искать позиции не открывающих тегов двух закладок, а открывающего (\bkmkstart) и закрывающего (\bkmkend) тега одной закладки. И указывать надо будет не 2 закладки, а одну (мне кажется так проще). Но это уже твоё дело.
Приложение:
procedure FileRep(const FileName, searchstring, replacestring: string;
const bkmName1, bkmName2:string);
var
fs1: TfileStream;
S: string;
S1, S2:string;
n1, n2:integer;
begin
// Читаем из файла в S
fs1 := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
try
SetLength(S, fs1.Size);
fs1.ReadBuffer(S[1], fs1.Size);
finally
fs1.Free;
end;
// режем текст на 3 части: в первой текст до первой закладки
// во второй от первой до второй
// в третьей от второй до конца файла
n1:=Pos('\bkmkstart '+bkmName1, S); // Ищем первую закладку
if n1=0 then
begin
ShowMessage('В документе нет закладки "'+bkmName1+'"');
Exit;
end;
n1:=n1+Length('\bkmkstart '+bkmName1); // Смещаем, чтоб не заменять внутри тега закладки (не принципиально)
n2:=Pos('\bkmkstart '+bkmName2, S); // Ищем вторую закладку
if n2=0 then
begin
ShowMessage('В документе нет закладки "'+bkmName2+'"');
Exit;
end;
S1:=copy(S, 1, n1-1); // Достаём первую часть
S2:=copy(S, n2, Length(S)-n2+1); // Достаём последнюю часть
S:=copy(S, n1, n2-n1); // Средняя часть (в которой будем заменять)
S:=StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]); // Замена только в тексте меж закладками
// Склеиваем обратно в одну строку
S:=S1+S+S2;
// Пишем обратно в файл
fs1 := TFileStream.Create(filename, fmCreate);
try
fs1.WriteBuffer(S[1], Length(S));
finally
fs1.Free;
end;
end;
// Протестировал у себя на Delphi 7 и Word 2007. Всё работает в пределах допустимого. :-)