Мы также столкнулись с этой самой проблемой.
Мы делаем тип «почтового слияния», когда у нас есть шаблоны с кодами слияния, которые анализируются и заменяются данными из внешних источников.
Это несоответствие индекса между pos (mystring, RichEdit.Text) и индексом позиционирования в тексте RichEdit с использованием RichText.SelStart прервало наше слияние.
У меня нет хорошего ответа, но я нашел обходной путь,Это немного громоздко (занижение!), Но пока не будет найдено лучшее решение ...
Обходной путь - использовать скрытый TMemo, скопировать в него текст RichEdit и изменить пары CR / LF только на CR.Затем используйте TMemo, чтобы найти правильное позиционирование, используя pos (string, TMemo), и используйте его, чтобы получить позицию самого начала для использования в TRichEdit.
Это действительно отстой, но, надеюсь, этот обходной путь поможет другим в нашей ситуации илиможет, кто-нибудь умнее меня заставит придумать лучшее решение.
Я покажу небольшой пример кода ...
Поскольку мы заменяем текст с помощью seltext, нам нужно заменить текст вОБА И элемент управления RichEdit, и элемент управления TMemo обеспечивают синхронизацию двух.
StartToken и EndToken являются разделителями кода слияния и являются константой.
function TEditForm.ParseTest: boolean;
var TagLength: integer;
var ValueLength: integer;
var ParseStart: integer;
var ParseEnd: integer;
var ParseValue: string;
var Memo: TMemo;
begin
Result := True;//Default
Memo := TMemo.Create(nil);
try
Memo.Parent := self;
Memo.Visible := False;
try
Memo.Lines.Clear;
Memo.Lines.AddStrings(RichEditor.Lines);
Memo.Text := stringreplace(Memo.Text,#13#10,#13,[rfReplaceAll]);//strip CR/LF pairs and replace with CR
while (Pos(StartToken, Memo.Text) > 0) and (Pos(EndToken, Memo.Text) > 0) do begin
ParseStart := Pos(StartToken, Memo.SelText);
ParseEnd := Pos(EndToken, Memo.SelText) + Length(EndToken);
if ParseStart >= ParseEnd then begin//oops, something's wrong - bail out
Result := true;
myEditor.SelStart := 0;
exit;
end;
TagLength := ParseEnd - ParseStart;
ValueLength := (TagLength - Length(StartToken)) - Length(EndToken);
ParseValue := Copy(Memo.SelText, (ParseStart + Length(StartToken)), ValueLength);
Memo.selstart := ParseStart - 1; //since the .text is zero based, but pos is 1 based we subtract 1
Memo.sellength := TagLength;
RichEditor.selstart := ParseStart - 1; //since the .text is zero based, but pos is 1 based we subtract 1
RichEditor.sellength := TagLength;
TempText := GetValue(ParseValue);
Memo.SelText := TempText;
RichEditor.SelText := TempText;
end;
except
on e: exception do
begin
MessageDlg(e.message,mtInformation,[mbOK],0);
result := false;
end;
end;//try..except
finally
FreeAndNil(Memo);
end;
end;