Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 425
1

Работа метода Word.Selection.Find при поиске в документе Word

05.11.2016, 23:01. Показов 8656. Ответов 4
Метки нет (Все метки)

Дорого времени суток!

никак не могу разобраться в механизме работы range.find
Запускаю:
Delphi
1
2
3
4
5
6
.........................
      word1.Documents.Open(filename);
      Word1.Selection.Find.Text :=edit1.text;
      Word1.Selection.Find.Replacement.Text := edit2.text;
      Word1.Selection.Find.Execute(Replace := wdReplaceAll, MatchWholeWord:=true);
.........................
в результате выполнения кода текст из edit1.text меняется на текст из edit2.text

а вот как сказать delphi, что если текст edit1.text найден, то делать то-то, а если не найден, то делать другое.
Иными словами как программно задать условие , что в результате выполнения метода Find.Execute с такими то параметрами что то найдено и заменено?

Спасибо!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2016, 23:01
Ответы с готовыми решениями:

Что именно возвращает функция Selection.Find из библиотеки Word?
Кто-нибудь может подсказать что именно возвращает функция appWd.Selection.Find ? И как...

Поиск в документе Word через Find, но с конца документа к его началу
Здравствуйте, как организовть поиск в документе Ворд Финдом но с конца документа к его началу ...

Работа с колонтитулами в документе MS Word
Доброго времени суток! Возможно, эта тема поднималась, и не раз, но я либо туплю, либо плохо гуглю...

"работа с выделением Selection объекта word.Bookmarks и .shapes через excel"
Доброе время суток. Возникла проблема: Суть имеется 2 макроса оба запускаются из excel 1-ый...

4
13068 / 5854 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
08.11.2016, 08:52 2
Цитата Сообщение от Landser Посмотреть сообщение
а вот как сказать delphi, что если текст edit1.text найден, то делать то-то, а если не найден, то делать другое.
Delphi
1
2
3
4
5
6
7
8
9
10
if Word1.Selection.Find.Execute(Replace := wdReplaceAll, MatchWholeWord:=true) then
begin
  //Действия, если шаблон найден.
  //...
end
else
begin
  //Действия, если шаблон НЕ найден.
  //...
end;
1
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 425
08.11.2016, 11:11  [ТС] 3
Mawrat Спасибо огромное за ответ! но к сожалению это не работает.

в случае, если шаблон найден (слово полностью)
Delphi
1
2
3
4
 if Word1.Selection.Find.Execute(Replace := wdReplaceAll, MatchWholeWord:=true) then
begin
 showmessage('!!!');
end;
выскакивает '!!!'

в случае если шаблон не найден как слово полностью, но присутствует в тексте как часть слова - тоже выскакивает '!!!', хотя должно появляться сообщеие '???'
Delphi
1
2
3
4
 if not Word1.Selection.Find.Execute(Replace := wdReplaceAll, MatchWholeWord:=true) then
begin
 showmessage('???');
end;
например я запустил поиск и замену, заменил все вхождения как слова полностью слова ум на $$ , получил '!!!', потом прогоняю поиск по второму разу, и если есть слова разУМ, сУМка и тд, снова получаю '!!!', если же нет таких слов, в котороых искомый текст встречается как часть слова, то только тогда получаю '???'. Не могу понять...
0
13068 / 5854 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
08.11.2016, 12:26 4
Да, видимо, баг какой-то. Надо разбираться с этим. Я сейчас попробовал вот такой код выполнить:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  wdReplaceAll = 2;
var
  wdApp, wdDoc, wdRng, wdFind : OleVariant;
begin
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не могу запустить Microsoft Word');
  end;
  wdApp.Visible := True;
  wdDoc := wdApp.Documents.Add;
  wdRng := wdDoc.Range; //Диапазон документа.
  wdRng.Text := 'ум, умный';
 
  wdFind := wdDoc.Range.Find;
  wdFind.Text := 'ум';
  wdFind.Replacement.Text := 'разум';
  wdFind.Forward := True;
  //if wdFind.Execute(FindText:='Слово', ReplaceWith:='Слово1', Replace:=wdReplaceAll, MatchWholeWord:=True) then
 
  if wdFind.Execute(Replace:=wdReplaceAll, MatchWholeWord:=True) then
    ShowMessage('Целые слова найдены и заменены.')
  else
    ShowMessage('Целые слова не найдены.');
 
  if wdFind.Execute(Replace:=wdReplaceAll, MatchWholeWord:=True) then
    ShowMessage('Целые слова найдены и заменены.')
  else
    ShowMessage('Целые слова не найдены.');
 
  wdFind.Text := 'разум';
  wdFind.Replacement.Text := 'ум';
  if wdFind.Execute(Replace:=wdReplaceAll, MatchWholeWord:=False) then
    ShowMessage('Подстроки найдены и заменены.')
  else
    ShowMessage('Подстроки не найдены.');
end;
В режиме поиска целых слов, если эти слова в тексте являются только подстроками, то метод Execute() всё равно возвращает True. Хотя замены в этом случае не выполняются (как и должно быть).
1
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 425
08.11.2016, 15:53  [ТС] 5
спасибо за ответ. я ещё пробовал искать и заменять слова на латинице, но результат был тот же. Word у меня 2007, но дело не в этом наверное. даже и не знаю, что делать.. интересно подобную прогу на basic сделать, реализовать тот же механизм, и посмотреть что будет.

Добавлено через 2 часа 1 минуту
попробовал на VBA, чтобы проверить сам механизм работы метода .Find (да простит меня модератор за оффтоп)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub Poisk()
    
    Selection.Find.ClearFormatting
    Selection.Find.replacement.ClearFormatting
    With Selection.Find
        .Text = "***"
        .replacement.Text = "@@@"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute Replace:=wdReplaceAll
     If .Execute Then MsgBox "Нашли"
     If Not .Execute Then MsgBox "Не нашли"
End With
 
End Sub
все вхождения слова полностью меняются как надо, но всегда выскакивает "Не нашли". То есть в случае с Delphi Execute всё время true, а здесь всё время false, так что ли?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2016, 15:53

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Почему ЗАВИСАЕТ компьютер при поиске по Word-файлам?
Почему ЗАВИСАЕТ компьютер при поиске по Word-файлам? (100-файлов отрабатывает нормально, далее...

Ошибка при выводе информации в документе Microsoft Word
Здравствуйте. Подскажите, пожалуйста, как исправить такую ошибку, из DataGridView нужно вывести...

Delphi + Таблица в документе Word - ошибка при форматировании заголовка
Программа создает при помощи объекта WordDocument документ Word, который содержит большое...

Delphi+MS Word. selection
Вечер добрый! Проблема заключается в следующем. Из буфера обмена в документ вставляется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.