Замена слов в рандомном порядке в Memo

Идея такова:

  1. В Memo1.Text находится простой текст.

  2. В Memo2.Text находятся слова для рандомной замены в тексте Memo1. К примеру:

     Слово #1|Замена1|Замена2|Замена3
     Слово №2|Замена1|Замена2|Замена3
     Слово №3|Замена1|Замена2|Замена3
    
  3. То есть в Memo1 расположен сам текст, а в Memo2 словарь синонимов, слов и варианты их замены.

  4. При нажатии на кнопку в Memo1 идет замена слов на синонимы из Memo2.

Вопрос: Где в коде у меня ошибка ? Поскольку у меня получается, что замена идет только первых слов, что в тексте (строках) Memo1, а должна быть замена по всей строке.

Вот мой код и может его можно как упростить?

Var
  SynArr: Array of Array of String;
  SynList: TStringList;
  i, j, m: Integer;
begin
  SetLength(SynArr, 0);
  SynList := TStringList.Create;
  // Тут идет подключение Слов и к ним синонимов в Memo2
  Memo2.Lines[i] := StringReplace(WrapText(Memo2.Lines[i], #13#10, ['|'], 1),
    '|', '', [rfReplaceAll]);
  SetLength(SynArr, Length(SynArr) + 1);
  SetLength(SynArr[High(SynArr)], Memo2.Lines.Count);
   // Обработка в цикле синонимов
  for i := 0 to Memo2.Lines.Count - 1 do
    SynArr[High(SynArr), i] := Memo2.Lines.Strings[i];
  SynList.Free;

  // Замена слов на синонимы в Memo1
  for i := 0 to High(SynArr) do
    for j := 0 to High(SynArr[i]) do
      for m := 0 to Memo1.Lines.Count - 1 do
        Memo1.Lines[m] := StringReplace(Memo1.Lines[m], SynArr[i, j],
          SynArr[i, Random(High(SynArr[i])) + 1], []);

end;

Ответы (1 шт):

Автор решения: MBo

Ну давайте попробуем так:

  • разбиваем каждую строку первого списка на список слов по пробелам и запятым (commatext)
  • проверяем, не содержится ли слово в словаре
  • если да - то заменяем его на один из синонимов, выбирая индекс синонима случайно
  • после обработки всех слов строки собираем их обратно (тот же commatext в обратном направлении)
  • записываем измененную строку назад в список
→ Ссылка