Главная страница
    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.008 c
14-91481
Supreme 2
2003-04-09 17:50
2003.04.28
Хорошо ли быть фанатом?


14-91493
DiamondShark
2003-04-09 18:27
2003.04.28
Хочу поделиться радостью


1-91388
Kron
2003-04-16 12:52
2003.04.28
В MessageDlg кнопки на русском языке


14-91524
Pitay
2003-04-10 21:25
2003.04.28
Клавиатура


1-91357
shurik
2003-04-15 21:30
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский