Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
1

Поиск заданного текста в документе Word

29.01.2016, 20:45. Показов 6176. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые форумчане. Подскажите пожалуйста решение такой проблемы в Делфи:
Пытаюсь создать программу по полуавтоматическому созданию документов в Ворде. Застрял на середине. Сейчас у меня стоит проблема в том, что например, при установке галочки в CheckBox - удалялся один из абзацев текста сформированного из шаблона, если галочки нет - то удаляется соответственно другой абзац из этого-же документа. Как это реализовать. Мне необходимо выйти именно на этот абзац в документе. Пытаюсь за образец поиска дать скопированный абзац - не получается.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2016, 20:45
Ответы с готовыми решениями:

Поиск текста в Word документе
Всем привет. Нужен советь по такой теме. Дело обстоить так: Есть папка с Ворд документами. И есть...

Поиск текста в Word-документе
Не работает поиск в Word документе как исправить? Если берешь .txt файл и меняешь расширение то...

Поиск раскрашенного текста в документе Word
Привет всем! Подскажите, пожалуйста, каким образом средствами VBA в открытом документе Word...

Изменение текста в документе Word
Добрый день! просьба помочь, свои программисты ленятся этим заниматься( В Acсess написана прога...

18
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
29.01.2016, 21:22 2
Дай хотя бы часть программы

Вообще, работа с вордом - сущий геморрой

Добавлено через 11 минут
Ты сказал, что работаешь с шаблоном. Тогда в шаблоне можешь поставить закладку на нужные абзацы и затем запросто обращаться к ним.
Выделяешь в ворде нужный фрагмент текста, заходишь в вставка->закладки->добавить (задав нужное имя)

Затем доступ к ним получаешь из своей проги:
WordApp.ActiveDocument.Bookmarks.Item('имя_закладки').Range
0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
30.01.2016, 22:31  [ТС] 3
Добрый вечер уважаемый Joey.
У меня в шаблоне допустиим есть два абзаца: в одном указано что в устройстве Wi-Fi не установлен, в другом что он есть и его номер и т.д.
Я Создаю программу по кирпичикам. Потом вставляю в создаваемую программу.

Думал что код

ПОИСК СЛОВА ИЛИ ТЕКСТА В ОТКРЫТОМ ДОКУМЕНТЕ

Delphi
1
2
3
4
5
6
7
8
var text1:string;
begin
text1:='';
text1:=InputBox('Введите текст',text1,text1);
WAP.Selection.Find.Forward:=true;
WAP.Selection.Find.Text:=text1;
if WAp.Selection.Find.Execute then messagebox(handle,'Поиск завершен успешно','внимание',0);
end;
подойдет нормально, но что-то не пошло. Отдельно код работает. А с образцом искомого текста нет.
Пытался ставить закладку в начало абзаца и в конец - что-то не получается, а мне нужно сделать функцию и для других абзацев в шаблоне документа
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 00:55 4
А что за ошибку выдает? Или просто ничего не происходит?

Добавлено через 5 минут
Может вы вводите в InputBox действительно несуществующий в документе текст?

Добавлено через 26 минут
Можно скинуть свой документ (или просто образец) и то, что вводите в InputBox. Плюч, обратите внимание, что OLEWord работает только с Widestring, вдруг ваш InputBox возвращает не Wide-строку, а какую-то другую, например, ANSI
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 01:03 5
У меня прекрасно работает именно ваш код
Миниатюры
Поиск заданного текста в документе Word   Поиск заданного текста в документе Word   Поиск заданного текста в документе Word  

0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
31.01.2016, 10:52  [ТС] 6
Добрый день! Я не могу решить вот такой вопрос по поиску нужной части текста:
Дело в том, что я по не знанию вставляю вместо InputBox следующее:
text1:= 'В устройстве обнаружен Wi-Fi' (это один абзац текста),
второй абзац текста "В устройстве Wi-Fi не обнаружен".

Эти два абзаца имеются в шаблоне документа. В зависимости от того стоит отметка в Чекбоксе или нет, программа находит нужный абзац и удаляет его из создаваемого документа. Эти два абзаца не будут вводится из InputBox, они изначально будут прописаны в коде программы.
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 15:21 7
Val1966, Открой ворд, выдели первый абзац, зайди в меню "Вставка -> Закладка", введи имя и нажми "Добавить". Например, absaz1, затем то же со вторым абзацем. Сохрони)

Теперь из своей проги:
Delphi
1
2
3
4
5
//открытие документа...
...
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('absac1') then // если найдена закладка
WAP.ActiveDocument.Bookmarks.Item('absac1').Delete;
0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
31.01.2016, 17:55  [ТС] 8
Пишет "Invalid variant operation"

Добавлено через 4 минуты
Если вместо "word.ActiveDocument" ставлю "dok" (dok это "Dok:=Word.Documents.Open(direktoriya);" то не ругается но и ничего не делает.
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 17:58 9
Val1966, напиши точный код, который вводишь
0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
31.01.2016, 19:12  [ТС] 10
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComObj, ExtCtrls, OleServer, WordXP;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    WordParagraphFormat1: TWordParagraphFormat;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Label1Click(Sender: TObject);
    function POISK():string;
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
  met1,met2,met3,met4,met5,met6,met6a, met7,met8,met9,met10,met10b:string;
  What,Which,Count,Name:Variant;
  Dok:Variant;              
  Word:Variant;           
  Table:Variant;          
  Stroka:Variant;         
  Range:Variant;
 
  
 
 
  
    direktoriya : string;
    text1:AnsiString;
implementation
 
{$R *.dfm}
 //*****************************************************************************
//                  
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;             
end;
//****************************************************************************
//
 
 procedure TForm1.Button2Click(Sender: TObject);
 var
 Word:Variant;
 h:OLEVariant;
 j,lengy:integer;
 
begin
  direktoriya := ExpandFileNAme('шаблон документа1.dot');
     try
 
    Word :=CreateOleObject('Word.Application');
 
    Dok:=Word.Documents.Open(direktoriya);
    except
  ShowMessage('Шаблон не открылся');
  exit
  end;
  POISK;
  Word.Visible:=true;
  end;
{*******************************************************************************}
 
procedure TForm1.Label1Click(Sender: TObject);
begin
 if Label1.Visible then Label1.Visible:=false
else  Label1.Visible :=true;
end;
{******************************************************************************}
 
function TForm1.POISK:string;
begin
 
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('vr1') then 
WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
 
end;
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 20:08 11
Мои глазаааа.....

Не по теме:

шучу))



Пока что я вижу только два несхождения:
1. У тебя объявлены две переменные variant с ОДИНАКОВЫМ именем: Word (одна глобальная и одна локальная в Button2Click)
2. В функции POISK ты обращаешься к переменной WAP, хотя в ней ничего нету, потому что в WAP ты никакого Word.Application не создавал. Ты его создал в переменной Word. Понятно, о чем я?

И еще. Локальные переменные, насколько я знаю, уничтожаются из памяти после завершения процедуры/функции, поэтому после того, как процедура Button2Click закончится, в переменной Word у тебя больше ничего не останется. Поэтому вот здесь:
Delphi
1
2
3
procedure TForm1.Button2Click(Sender: TObject);
var
Word:Variant;
удали вот эту строчку Word:Variant;

P.s. Когда пишешь здесь код, используй теги Delphi (для Lazarus-кода вполне подходит), а то модераторы заругают

Добавлено через 14 минут
Вот твой измененный код (если не заработает, отпишись):

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ComObj, ExtCtrls, OleServer, WordXP;
 
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
Label1: TLabel;
CheckBox1: TCheckBox;
WordParagraphFormat1: TWordParagraphFormat;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
function POISK():string;
 
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
 
met1,met2,met3,met4,met5,met6,met6a, met7,met8,met9,met10,met10b: string;
What,Which,Count,Name:Variant;
Dok:Variant;
WAP:Variant;
Table:Variant;
Stroka:Variant;
Range:Variant;
 
direktoriya : string;
text1:AnsiString;
 
implementation
 
{$R *.dfm}
//*****************************************************************************
//
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
//****************************************************************************
//
 
procedure TForm1.Button2Click(Sender: TObject);
var
h:OLEVariant;
j,lengy:integer;
 
begin
direktoriya := ExpandFileNAme('шаблон документа1.dot');
try
WAP :=CreateOleObject('Word.Application');
Dok := WAP.Documents.Open(direktoriya);
except
ShowMessage('Шаблон не открылся');
exit
end;
POISK;
Word.Visible:=true;
end;
{*******************************************************************************}
 
procedure TForm1.Label1Click(Sender: TObject);
begin
if Label1.Visible then Label1.Visible:=false
else Label1.Visible :=true;
end;
{******************************************************************************}
 
function TForm1.POISK:string;
begin
  if CheckBox1.Checked then
    if WAP.ActiveDocument.Bookmarks.Exists('vr1') then
      WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
  if not CheckBox1.Checked then
    if WAP.ActiveDocument.Bookmarks.Exists('vr2') then
      WAP.ActiveDocument.Bookmarks.Item('vr2').Delete;
end;
Я изменил Word на WAP. Странно, что компилятор вообще позволил тебе воспользоваться зарезервированным словом Word, которое вроде означает 2 или 4 байта, не помню
И почему у тебя переменная vr1 нигде не объявлена?
0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
31.01.2016, 20:27  [ТС] 12
В функции поиск я обращаюсь к открытому документу - dok.
Удалил Word:variant; Ничего не изменилось.
Прошу прощения не совсем понимаю , что значит теги Delphi???

Добавлено через 6 минут
Ничего не изменилось

Добавлено через 18 секунд
Нет ничего не изменилось
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 22:20 13
Вот ты сам написал:
Цитата Сообщение от Val1966 Посмотреть сообщение
Delphi
88
89
90
91
92
93
function TForm1.POISK:string;
begin
if CheckBox1.Checked then
if WAP.ActiveDocument.Bookmarks.Exists('vr1') then
WAP.ActiveDocument.Bookmarks.Item('vr1').Delete;
end;
И где здесь обращение к Dok.

Да и вообще, я же переделал твой код и написал тебе, попробуй его:
Цитата Сообщение от Joey Посмотреть сообщение
Вот твой измененный код (если не заработает, отпишись):
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
31.01.2016, 22:24 14
Цитата Сообщение от Val1966 Посмотреть сообщение
что значит теги Delphi
Когда пишешь сообщение на этом форуме и приводишь довольно большой код программы, нужно его выделить и нажать кнопку delphi на панели набора сообщения
Миниатюры
Поиск заданного текста в документе Word  
0
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
02.02.2016, 11:18  [ТС] 15
Joey. К сожалению присланный Вами код не сработал
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
02.02.2016, 12:22 16
Val1966, удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста). Надо удалить или очистить диапазон закладки - тогда удалится соответствующий текст.
---
Пример обработки документа MS Word с использованием закладок: Как записать данные в файл MS Word
1
0 / 0 / 0
Регистрация: 29.01.2016
Сообщений: 11
02.02.2016, 15:00  [ТС] 17
Большое спасибо за помощь всем. Сделал так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//   ФУНКЦИЯ ПОИСКА ТЕКСТА В ШАБЛОНЕ И ЕГО УДАЛЕНИЕ
//сначала в шаблоне выделяем абзац который возможно будет удален и добавляем его
//в закладки(например 'vr1'), также выделяем другой абзац и добавляем его в
//закладки (например 'vr2'), сохраняем шаблон
function TForm1.POISK:string;
var
ud1,ud2,ud3:variant;  //рабочая переменная
rng1,rng2:variant;    //рабочая переменная
 
begin
 if CheckBox1.Checked then    // выстяляем уловие и если оно выполняется то
 begin
 bm1:=dok.Bookmarks.Item('vr1');  //переходим на закладку 'vr1'
 rng1:=bm1.Range;            //ссылаемся на диапазон связанный с закладкой 'vr1'
 rng1.Delete                 //удаляем диапазон связанный с этой закладкой
 end
 else                       //если условие не выполнено то
 begin
 bm2:=dok.Bookmarks.Item('vr2');   //переходим на закладку 'vr2'
 rng2:=bm2.Range;         //ссылаемся на диапазон связанный с закладкой 'vr2'
 rng2.Delete;             //удаляем диапазон связанный с этой закладкой
 end;
 end;
0
Джоуи
1081 / 643 / 240
Регистрация: 05.05.2015
Сообщений: 3,559
Записей в блоге: 2
02.02.2016, 19:40 18
Цитата Сообщение от Mawrat Посмотреть сообщение
удаление закладки не приведёт к удалению связанного с ней диапазона (и соответствующего текста)
Точно. Мое упущение
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
03.02.2016, 11:18 19
Val1966, а почему "dok", а не "doc"? И желательно переменные, предназначенные для OLE взаимодействия, объявлять с типом OleVariant. Это гарантирует, что при OLE взаимодействии будут использованы только те типы, которые соответствуют спецификации COM.
Предлагаю сделать так:
Delphi
1
2
3
4
5
6
7
8
9
  //Выбираем нужную закладку.
  if CheckBox1.Checked then
    bm := doc.Bookmarks['vr1']
  else
    bm := doc.Bookmarks['vr2'];
  //Обработка закладки.
  rng := bm.Range;
  bm.Delete;
  rng.Delete;
0
03.02.2016, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2016, 11:18
Помогаю со студенческими работами здесь

Выделение всего текста в Word документе
Нужно написать часть кода, которая выделяет все обьекты в документе Word макросом из Excel...

Проблема замены текста в документе Word
Столкнулся с проблемой замены текста. Исходный текст находится и выделяется, но не заменяется....

Удаление совпадений текста в документе MS Word
на форме текстовое поле, и кнопка. есть уже созданный файл Word (docx)(путь к файлу word берется из...

Word Поиск таблицы в документе
Есть документ, содержащий 2 заполненные таблицы Set Table =...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru