Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заменить слово в RTF документе 
V
    Опции темы
dma
  Дата 1.12.2006, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.12.2006
Где: Belarus, Minsk

Репутация: нет
Всего: 1



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

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

Заранее премного благодарен.
PM MAIL ICQ Skype GTalk   Вверх
Poseidon
Дата 1.12.2006, 04:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
gambit
Дата 1.12.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Есть хорошая книга "Программирование документов и приложений MS OFFICE в DELPHI"
Тамопсано все что можно сделать с word и excel. Если надо могу тебе написать код который тебе надо.
Код напишу ближе к вечеру.
PM MAIL ICQ Skype   Вверх
gambit
Дата 1.12.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Код

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.


PM MAIL ICQ Skype   Вверх
Snowy
Дата 1.12.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(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;

PM MAIL   Вверх
gambit
Дата 1.12.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Snowy, ты заменяеш слово в RichEdit а мой код позволяет редактировать ничего никуда не копирую.
Кроме того не в обиду сказано но word есть у 99% людей.
PM MAIL ICQ Skype   Вверх
Snowy
Дата 1.12.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(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
PM MAIL   Вверх
gambit
Дата 1.12.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Snowy, 
Цитата

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

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

Цитата

Цитата

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

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

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

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

Нет ничего про загрузку в прогу и так далее.
Ну в общем это вопрс довольо спорный
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 1.12.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 1.12.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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


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

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

PM MAIL   Вверх
gambit
Дата 1.12.2006, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Snowy, Да!!! Мой способ.


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

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

PM MAIL ICQ Skype   Вверх
dma
Дата 6.3.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.12.2006
Где: Belarus, Minsk

Репутация: нет
Всего: 1



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

А вот вариант с вордом подходит для таблицы, но можно ли теперь сделать так, чтобы заменялись не все слова в документе, а к примеру пять первых? Буду очень признателен за помощь.
PM MAIL ICQ Skype GTalk   Вверх
gambit
Дата 6.3.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Я уже точно не помню, но помоему мой вариант находил первое слово удовлетворяющие запросу и заменяла его. Так что просто прогнать в цикле.
PM MAIL ICQ Skype   Вверх
dma
Дата 17.3.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.12.2006
Где: Belarus, Minsk

Репутация: нет
Всего: 1



Нет, твой вариант как раз заменял всё одним махом. То есть был установлен параметр 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 

Премного благодарен.
PM MAIL ICQ Skype GTalk   Вверх
dma
Дата 17.3.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.12.2006
Где: Belarus, Minsk

Репутация: нет
Всего: 1



Еле нашёл в интернете эту книжку 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;


Всем кто помог - большое спасибо!
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.