![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена строки в Memo [D7, WinXP]
Костя © (2006-02-24 16:24:00)Доброго времени суток !
У меня вопрос возник, подскажите пожалуйста.
У меня есть файл txt, я его загружаю в Memo и делаю поиск и замену строки:
вот так выглядит файл
/////////////////////////////////
// City //
// Planet //
// Money //
/////////////////////////////////
Например я ищу строку Money и хочу её заменить на строку введённую в Edit, вот такая процедурка эта делает у меня:
procedure TForm1.Button1Click(Sender: TObject);
var mm:string;
begin
mm:=StringReplace(Memo1.Text, 'Money', Edit1.Text, [rfReplaceAll]);
Memo1.Text:=mm;
end;
но допустим ввели мы слово длинее чем слово Money например NoneMoney, соответственно оно заменяет его, но тогда съезжает форматирование файла (косые линии) взависимости от того если короче то съзжает влево, а если длинее то вправо.
Помогите пожалуйста, как реализовать нормальную замену без искажения форматирования документа.
Заранее всем благодарен.
Desdechado (2006-02-26 16:41:00) [1]много строк - это несколько раз по одной
неужели трудно догадаться?!
Костя (2006-02-26 16:15:00) [2]
> Мне кажется, что зря все попытки помочь автору поста. Поскольку
> задача до некоторой степени очень надумана (файл, отображение
> в Мемо, особенно с ///).
> Предложение автору: сформулируй конкретнее свои проблемы.
> Объясни для какой цели служат '/////...', какую они несут
> информацию? Можно все это понять, если это какой-либо собственный
> тренинг
>
Поясняю.
В Memo грузится файл тхт, // - штуки нужны просто так, вместо них можно любое подставить, важно не то какие они, а то как вставить текст так, что б рисунок не исказился. Нечто похожее есть в ASCII.
была идея что надо вставить одну строку, я её уже решил, но вот как вставить многострочное, для меня проблема.
Alarm (2006-02-26 14:45:00) [3]Мне кажется, что зря все попытки помочь автору поста. Поскольку задача до некоторой степени очень надумана (файл, отображение в Мемо, особенно с ///).
Предложение автору: сформулируй конкретнее свои проблемы. Объясни для какой цели служат '/////...', какую они несут информацию? Можно все это понять, если это какой-либо собственный тренинг
Anatoly Podgoretsky (2006-02-26 14:20:00) [4]А как ты этого достиг?
Костя (2006-02-26 12:47:00) [5]Извините пожалуйста, задание немного усложняется.
Есть такой файл, но немного переработаный:
/////////////////////////////////
// City //
// //
// Planet //
// //
// Money //
// Yes //
// //
/////////////////////////////////
Надо заменить Money Yes на например NoneMoney GameOver
и чтобы оно выглядело так:
/////////////////////////////////
// City //
// //
// Planet //
// //
// NoneMoney //
// GameOver //
// //
/////////////////////////////////
причём NoneMoney GameOver вводиться только с Memo
в виде:
NoneMoney
GameOver
Как опять же сделать так что б неисказился рисунок границы в файле при вводе с Memo данных.
Очень хотелось бы кода побольше увидеть чем теории, так как только начинаю програмировать, а в коде мне легче разобраться.
Ещё раз всем большое спасибо.
П.С. У меня получается что рисунок искажается вот так:
/////////////////////////////////
// City //
// //
// Planet //
// //
// NoneMoney
GameOver //
// //
/////////////////////////////////
API (2006-02-24 18:50:00) [6]Belorus © (24.02.06 18:43) [3]
А что Ваш код делает?
Belorus (2006-02-24 18:43:00) [7]s:='// ABCDEFG //';
nw:='slovco';
cs:=s;
For x:=4 to Length(s-2) do
For x2:=1 to Length(nw) do
cs[x]:=nw[x2];
API (2006-02-24 18:30:00) [8]Помогите пожалуйста, как реализовать нормальную замену без искажения форматирования документа.
Первое, что напрашивается:
- использовать для TMemo непропорциональный шрифт, например, Courier, Courier New, И
- замену производить на строку той же длины (количество символов), добавляя, если нужно, пробелы.
Однако, если новая строка заведомо длиннее старой строки, то такой метод применить не удастся.
В такой ситуации надо писать уже довольно серьезный "текстовый процесор", который будет задокументированно использовать символы "/" в качестве "визуального оформления", и будет уметь находить визуальную границу (как в примере), и производить корректировку (а методы уже могут быть разные).
Desdechado (2006-02-24 18:29:00) [9]1. меняем короткое на длинное: дополнить пробелами заменяемое короткое
2. меняем длинное на короткое: дополнить пробелами заменяющее короткое
а потом StringReplace
ps дополнять пробелами можно спереди, сзади, с обеих сторон