Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.013 c
1-91363
maxon
2003-04-15 12:17
2003.04.28
про предков


11-91238
SPeller
2002-07-20 10:51
2003.04.28
Глюк в тулбаре ?


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


6-91418
max2057
2003-03-03 12:38
2003.04.28
apache под WIN2000, CGI и безопасность


1-91277
Fighter
2003-04-17 12:03
2003.04.28
Как реализовать автоподстановку?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский