Как выделить и заменить определенное слово в memo?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
AlexGordon
новенький
Сообщения: 28
Зарегистрирован: 07.12.2010 20:02:15

Как выделить и заменить определенное слово в memo?

Сообщение AlexGordon »

Например, при нажатии на кнопку должно искаться слово pipes в memo, и заменяться на trubi.
Причем, если текст мемо следующий:

Код: Выделить всё

pipes
asdasd
gdgsff
asdda pipes asdasd
asdasd


То должно получиться следущее:

Код: Выделить всё

trubi
asdasd
gdgsff
asdda trubi asdasd
asdasd


т.е. искаться и заменяться должно по всему memo. Как это сделать?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Предполагаю, что стоит рассматривать содержимое Memo как TStringList (чем оно по сути и является), а дальше уже заниматься разбором каждой строки в отдельности.
И в модуле StrUtils есть много интересных функций и процедур по замене фрагментов текста (например, AnsiReplaceText)
AlexGordon
новенький
Сообщения: 28
Зарегистрирован: 07.12.2010 20:02:15

Сообщение AlexGordon »

А поподробнее?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Код: Выделить всё

var
  i: integer;
  S:AnsiString;
begin
for i:=0 to Memo1.Lines.Count -1 do
begin
  S := '';
  S := AnsiReplaceText(S, 'pipes', Memo1.Lines[i]);
  Memo1.Lines[i] := S;
end;


что-то типа такого. писалось сразу в браузере, т.е. могут быть ошибки
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Можно и всё содержимое Memo рассматривать как одну строку - Memo.Lines.Text. Замена - аналогично предложенному Padre_Mortius.
Kubanych
новенький
Сообщения: 73
Зарегистрирован: 15.10.2008 10:02:18

Сообщение Kubanych »

Можете посмотреть примеры к моей книге http://freepascal.ru/download/zips/windows-samples.7z. В папке \Примеры\К главе 6\TMemo. Там рассмотрены способы организации поиска в TMemo. Найденный фрагмент текста выделяется.
Способ замены - как предложил Padre_Mortius.
AlexGordon
новенький
Сообщения: 28
Зарегистрирован: 07.12.2010 20:02:15

Сообщение AlexGordon »

Padre_Mortius, а что твой код заменяет словом Pipes? я не понял просто
Iv_
новенький
Сообщения: 36
Зарегистрирован: 08.01.2011 21:52:44

Сообщение Iv_ »

AlexGordon писал(а):Padre_Mortius, а что твой код заменяет словом Pipes? я не понял просто

Я так понимаю, что - пробел.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Нет. В коде ошибка (а об ошибках Padre_Mortius честно предупредил). Чтобы понять, нужно смотреть документацию по AnsiReplaceText. Там написано, в вольном переводе, следующее:

Код: Выделить всё

function AnsiReplaceText(
  const AText: String;
  const AFromText: String;
  const AToText: String
):String;

Параметры:

AText -- Строка, в которой производится поиск и замена.
AFromText -- Строка, которую нужно найти
AToText -- Строка, на которую нужно заменить

Т.е. правильно будет:

Код: Выделить всё

var
  i: integer;
begin
  for i := 0 to Memo1.Lines.Count - 1 do
    Memo1.Lines[i] := AnsiReplaceText(Memo1.Lines[i], 'pipes', 'trubi');
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

RegExpr использовать не пробовали ?
(ессно, не RTL-овский, а более навороченный - модуль приаттачен )

function ReplaceRegExpr (const ARegExpr, AInputStr, AReplaceStr : RegExprString;
AUseSubstitution : boolean{$IFDEF DefParam}= False{$ENDIF}) : RegExprString; //###0.947
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить