Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Заменить слово в RTF документе


Автор: dma 1.12.2006, 03:24
Господа, помогите пожалуйста, ума не приложу как решить следующую проблему:

Есть текст в файле RTF формата. Необходимо пройтись по тексту, найти данное слово (к примеру ЛАМПА) и заменить его на другое данное слово (к примеру ЛЮСТРА), при этом не нарушая форматирования текста. То есть, к примеру, если заменяемое (ЛАМПА) слово было шрифта 14 и жирное, то чтобы и заменённое слово(ЛЮСТРА) имело такие же  параметры.

Заранее премного благодарен.

Автор: Poseidon 1.12.2006, 04:25
Хех. По моему с форматироанием не осуществимо. Потому как есть будет ЛАМПА, то на какую "ЛЮСТРУ" менять?

Добавлено @ 04:28 
А без форматирования обычный StringReplace...

Автор: gambit 1.12.2006, 11:13
Есть хорошая книга "Программирование документов и приложений MS OFFICE в DELPHI"
Тамопсано все что можно сделать с word и excel. Если надо могу тебе написать код который тебе надо.
Код напишу ближе к вечеру.

Автор: gambit 1.12.2006, 11:36
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  w:variant;                              // переменная
implementation
uses comobj;                           // библиотека

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
w:=createoleobject('word.application');   //создание объекта
w.documents.add('c:\1.doc');              // файл
w.selection.find.text:='Лампа';          // что заменить
w.selection.find.replacement.text:='Люстра'; // чем
w.selection.find.execute(replace:=2);       // фигня без которой неработает
w.activedocument.save;                      // сохранение документы
w.visible:=true;                            // показать word (он был открут, но видно его небыло)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin                                        // закрытие word
w.quit;
w:=unassigned;
end;

end.


Автор: Snowy 1.12.2006, 13:17
Цитата(Poseidon @  1.12.2006,  04:25 Найти цитируемый пост)
Хех. По моему с форматироанием не осуществимо. Потому как есть будет ЛАМПА, то на какую "ЛЮСТРУ" менять?
Это мелочи.
Пусть рич сам меняет по своим стандартным правилам.

Цитата(Poseidon @  1.12.2006,  04:25 Найти цитируемый пост)
А без форматирования обычный StringReplace...
Ну... Так слишком грубо и с потерей форматирования.

gambit, ну ты уж совсем завернул.
Для такой элементарной задачи подтягивать пакет, стоимостью в сотни долларов.
У меня, к примеру, нет M$ Office. Что ж теперь, программа не должна работать?
Вариант с вордом - просто бредовая идея.

Всё делается просто:

Код

const
  ss = 'лампа'; // что меняем
  rs = 'слонёнок'; // на что меняем
var i: integer;
begin
  i := 0;
  with RichEdit1 do
  repeat
    i := RichEdit1.FindText(ss, i, Length(Lines.Text), []);
    if i >= 0 then begin
      SelStart := i; SelLength := Length(ss);
      SelText := rs; inc(i, Length(rs));
    end;
  until i < 0;
end;

Автор: gambit 1.12.2006, 19:22
Snowy, ты заменяеш слово в RichEdit а мой код позволяет редактировать ничего никуда не копирую.
Кроме того не в обиду сказано но word есть у 99% людей.

Автор: Snowy 1.12.2006, 20:13
Цитата(gambit @  1.12.2006,  19:22 Найти цитируемый пост)
Snowy, ты заменяеш слово в RichEdit
Что и требуется из постановки вопроса.

Цитата(gambit @  1.12.2006,  19:22 Найти цитируемый пост)
мой код позволяет редактировать ничего никуда не копирую.
Использовать для этого тяжеловесный платный сторонний пакет?
Ты б ещё 2+2 в ехеле считал бы smile
Такие решения у меня вызывают как минимум недоумение.
Зачем??!

Цитата(gambit @  1.12.2006,  19:22 Найти цитируемый пост)
Кроме того не в обиду сказано но word есть у 99% людей.
Да ты оптимист smile
Для России также верно, как и то, что IE пользуются 99% посетителей этого сайта smile
А для западного мира данный процент ещё меньше.
Пиратство - далеко не тотальное явление.
Процент машин с M$ офисом постоянно падает. Как и процент пользователей IE.
Пройдёт время и данный процент будет меньше половины.
И что делать тогда программе на машине, где нет офиса?
Кричать, извините, я не могу сделать элементарной вещи - купите офис?
Да я и без такой программы спокойно в ОО всё сконверчу smile И совсем бесплатно smile

Автор: gambit 1.12.2006, 20:22
Snowy, 
Цитата

Да ты оптимист

А что плохо чтоли

Цитата

Цитата

Snowy, ты заменяеш слово в RichEdit 

Что и требуется из постановки вопроса.

А теперь вопрос
Цитата

Есть текст в файле RTF формата. Необходимо пройтись по тексту

Нет ничего про загрузку в прогу и так далее.
Ну в общем это вопрс довольо спорный

Автор: Poseidon 1.12.2006, 20:26
Цитата(gambit @  1.12.2006,  20:22 Найти цитируемый пост)
Ну в общем это вопрс довольо спорный 
 Вопрос этот не спорный. Снежок прав. Совершенно не у всех установлен Ворд (не говоря уже обо всем Офисе). И пользователю не очень приятно будет увидеть, что твоя программа, каторая к Ворду ни каким боком, из-за того, что у тебя не уста новлен Word, не захочет работать.

Автор: Snowy 1.12.2006, 20:34
Цитата(gambit @  1.12.2006,  20:22 Найти цитируемый пост)
Нет ничего про загрузку в прогу и так далее.
Абалдеть.
А что, есть способы модифицировать файл на основе его содержимого, не загружая его?


M
Girder
Хватит спорить... на пустом месте! :)

PS: Мнения/замечания высказаны - автору темы решать... что ему использовать :)

Автор: gambit 1.12.2006, 20:48
Snowy, Да!!! Мой способ.


M
Girder
Хватит спорить... на пустом месте! :)

PS: Мнения/замечания высказаны - автору темы решать... что ему использовать :)

Автор: dma 6.3.2007, 20:15
Второй вариант идеален, когда не требуется заменить слово в таблице. Если же заменяемое слово находится в таблице, то всё форматирование сбивается smile

А вот вариант с вордом подходит для таблицы, но можно ли теперь сделать так, чтобы заменялись не все слова в документе, а к примеру пять первых? Буду очень признателен за помощь.

Автор: gambit 6.3.2007, 21:39
Я уже точно не помню, но помоему мой вариант находил первое слово удовлетворяющие запросу и заменяла его. Так что просто прогнать в цикле.

Автор: dma 17.3.2007, 14:53
Нет, твой вариант как раз заменял всё одним махом. То есть был установлен параметр Replase Allю Методом научного тыка я выяснил что этот параметр задаётся как раз в той строчке, которая прокомментирована "фигня без которой неработает".
Так вот если установить этот параметр в 1, то будет заменяться ОДНО слово. Поэтому я сделал так:
Код

for i := 1 to 4 do
begin
  w.selection.find.text:='Лампа';          // что заменить
  w.selection.find.replacement.text:='Люстра'; // чем
  w.selection.find.execute(replace:=1);       // фигня без которой неработает
end;


Но заменилось по прежнему одно слово. Как показал пошаговый проход после первого выполнения цикла заменённое слово остаётся выделенным, а значит, наверное надо это выделение снять, чтобы слова могли искаться дальше.
Так вот вопрос - как сбросить выделение?
А ещё лучше если кто-нибудь ткнёт носом где можно про это всё почитать smile 

Премного благодарен.

Автор: dma 17.3.2007, 16:49
Еле нашёл в интернете эту книжку smile

Вобщем проблема решена:
Код

for i := 1 to 4 do
begin
  w.selection.find.forward := true;    //просмотр вперёд
  w.selection.find.text:='Лампа';          // что заменить
  w.selection.find.replacement.text:='Люстра'; // чем
  w.selection.find.execute(replace:=1);       
  w.selection.start := w.selection.end; //сбрасываем выделение
end;


Всем кто помог - большое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)