Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.28;
Скачать: CL | DM;

Вниз

Word, замена найденного текста удалением строки...   Найти похожие ветки 

 
asafr ©   (2003-04-14 18:32) [0]

Здравствуйте. Как еще (кроме приведенного ниже способа) можно эффективно заменить определенную переменную в Word-e удалением строки документа, где эта переменная находится?
Функционирующий код, приведенный ниже, работает очень медленно и, поэтому, малоэффективен в даже не очень больших документах. (использую закладку Delphi-> Servers)
a, b, Vstart, Vend, OldStr:OleVariant;
WordLength , j, k, n :integer;
KeyStop : Boolean;
...............................
...............................
j :=0;
KeyStop:=False;
n :=? //Задается необходимая величина
repeat
a:=j;
b:=j+n;
if WordDocument1.Range(a,b).Text=oldStr then begin
Vstart :=j;
Vend :=j+n;
KeyStop :=True;
end;
Inc(j);
until (j=WordLength-n) or (KeyStop=True) ;
WordDocument1.Range(Vstart,Vend).Select;
WordApplication1.Selection.Delete(EmptyParam,EmptyParam);

, где WordLength - длина текста документа...


 
asafr ©   (2003-04-15 13:52) [1]

Переиначим вопрос...
Как в документе Word97 можно найти заданную строку и выделить ее способом, отличным от вышеприведенного?


 
MBo ©   (2003-04-15 14:05) [2]

How to search and replace text in a Word document
--------------------------------------------------------------------------------


Answer 1:

You should use a variant because the Find.Execute method is a bit buggy. Something like this, for example:



{ ... }
var
Rnge: OleVariant;
{ ... }

Rnge := Doc.Content;
Rnge.Find.Execute("old", Wrap := wdFindContinue, ReplaceWith := "new", Replace := wdReplaceAll);
{ ... }



Tip by Deborah Pate




Answer 2:



{ ... }
{ Create the OLE Object }
WordApp := CreateOLEObject("Word.Application");
WordApp.Documents.Open(yourDocFile);
WordApp.Selection.Find.ClearFormatting;
WordApp.Selection.Find.Text := yourOldStr;
WordApp.Selection.Find.Replacement.Text := yourNewStr;
WordApp.Selection.Find.Forward := True;
WordApp.Selection.Find.Wrap := 1; {wdFindContinue}
WordApp.Selection.Find.Format := False;
WordApp.Selection.Find.MatchCase := False;
WordApp.Selection.Find.MatchWholeWord := False;
WordApp.Selection.Find.MatchWildcards := True;
WordApp.Selection.Find.MatchSoundsLike := False;
WordApp.Selection.Find.MatchAllWordForms := False;
WordApp.Selection.Find.Execute(Replace := 2); {wdReplaceAll}
{Or as alternative: WordApp.Selection.Find.Execute(Replace := 1); for one replace}
WordApp.ActiveDocument.SaveAs(yourNewDocFile);
WordApp.Quit;
WordApp := Unassigned;
{ ... }



Tip by Mike Shkolnik


 
asafr ©   (2003-04-15 14:44) [3]

MBo, спасибо, но это стандартный способ замены одной строки на другую...
А вопрос состоит в том, чтобы найти заданную строку и выделить ее и все...
WordDocument1.Range(a,b)...


 
asafr ©   (2003-04-15 14:52) [4]

Не дописал выражение в предыдущий раз..
Что-то вроде:
WordDocument1.Range(a,b).Select


 
MBo ©   (2003-04-15 15:00) [5]

Subj был, BTW: замена найденного текста удалением строки

насколько я понимаю, во втором примере можно остановиться на строчке
WordApp.Selection.Find.Text := yourOldStr;


 
asafr ©   (2003-04-15 15:37) [6]

Нет... Этим ты просто задаешь один из параметров поиска, но не останавливаешься на yourOldStr


 
asafr ©   (2003-04-15 16:18) [7]

Решил. Запоминайте, вещь полезная - потом пригодится. Данные в Word заносятся из некого массива Store, сформированного раньше...
var
oldStr, newStr, replace :OleVariant;
....................................
....................................
Replace:=1;
repeat
Inc(Step);
..................
WordApplication1.Selection.Find.ClearFormatting; WordApplication1.Selection.Find.Replacement.ClearFormatting;
WordApplication1.Selection.Find.Text:=oldStr;
if WordApplication1.Selection.Find.Execute(oldStr,EmptyParam,......,replace) then begin
if Massif^[Step]="" then //Удаляем строку, если данных нет
WordApplication1.Selection.Delete(EmptyParam,EmptyParam)
else
WordApplication1.Selection.TypeText(newStr); //Позволяет заменять строку длиной более 256 символов
end;
.................................
until Step=FullStep


 
asafr ©   (2003-04-15 16:19) [8]

Опа... вот мои оплошности... Вместо Store в коде написана ссылка на Massif, но сути это не меняет



Страницы: 1 вся ветка

Текущий архив: 2003.04.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
9-91137
seemann
2002-10-06 19:05
2003.04.28
Непослушный спрайт


8-91407
Nikolai_S
2003-01-22 19:00
2003.04.28
Как быстро нарисовать пунктирную линию на TCanvas?


7-91569
Soft
2003-03-11 02:26
2003.04.28
Как получить сообщение о том, что Com порт выдал данный


14-91525
VID
2003-04-10 00:22
2003.04.28
XL REPORT


1-91300
Alta
2003-04-15 11:56
2003.04.28
файл - чтение и запись