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

Не работает добавление текста в Word - InsertAfter и InsertBefore

28.09.2018, 18:47. Показов 2072. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь добавить текст в word до и после выделенной области. Документ открывается, а текст не добавляется, в чём может быть проблема?
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, ComObj, ComCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  MSWord: OLEVariant;
  DocName, Doc1 : OleVariant;
  WordApplication1: OLEVariant;
  vstart, vend: OleVariant;
begin
 
  DocName  := 'C:\Doc3.docx';
  
  try
    MsWord := GetActiveOleObject('Word.Application');
  except
    try
      MsWord := CreateOleObject('Word.Application');
      WordApplication1 := CreateOLEObject('Word.Application');
      Doc1 := WordApplication1.Documents.Open(DocName);
 
 
      RichEdit1.Text:=Doc1.Range.Text;
      WordApplication1.Visible := True;
 
       vstart := 10;
       vend := 20;
       Doc1.Range(vstart, vend).Select;
       Doc1.Selection.InsertAfter('text1');
       Doc1.Selection.InsertBefore('text2');
 
    except
      Exception.Create('Error');
    end;
  end;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2018, 18:47
Ответы с готовыми решениями:

Удаление текста из ячейки таблицы, вставленного методом InsertAfter
Здравствуйте, есть такой макрос (не мой) по вычислению функций в ячейке после поля с...

Добавление срок в таблицу Word при заполнении документа Word из данных Excel
Всем привет! Я новичок в этом деле и нужна помощь. Есть таблица Excel с данными на основании...

ParentNode.insertBefore
Почему при таком раскладе срабатывает только parentNode.insertBefore ? а appendChild нет.. ...

При открытии документа word 2013 в word 2010 меняется структура текста
Здравствуйте. Для вуза сделал в ворд 2013 два реферата. Пошел распечатывать. Оказалось, что в том...

9
70 / 12 / 4
Регистрация: 17.01.2017
Сообщений: 524
30.09.2018, 22:11  [ТС] 2
Я решила проблему, не думайте что я её решала всё это время на самом деле у меня были другие дела, а проблему я решила сегодня примерно за час. Вот код:
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
procedure TForm1.Button2Click(Sender: TObject);
var
  MSWord, vstart, vend, DocName, Doc1: OleVariant;
  ilengy: Integer;
begin
  DocName  := 'C:\Doc1.docx';
  try
    MsWord := GetActiveOleObject('Word.Application');
  except
    try
      MsWord := CreateOleObject('Word.Application');
      Doc1 := MsWord.Documents.Open(DocName);
      MsWord.Visible := True;
    except
      Exception.Create('Error');
    end;
  end;
  vstart := 10;
  vend := 40;
  Doc1.Range(vstart, vend).Select;
  MSWord.Selection.InsertBefore('txt1');
  MSWord.Selection.InsertAfter('txt2');
  MSWord.ActiveDocument.SaveAs('C:\Doc2.doc');
end;
Сейчас объясню как он работает, вдруг кому-то пригодится. Переменные vstart - это начало строки, vend - конец строки.
Delphi
1
Doc1.Range(vstart, vend).Select;
Выделить буквы в ворде начиная с 10 и заканчивая 40.
Delphi
1
2
MSWord.Selection.InsertBefore('txt1');
MSWord.Selection.InsertAfter('txt2');
Вставка слова (txt1) до выделения и (txt2) после выделения.
Потом всё сохраняется в документ и открывается автоматически в ворде, там мы видим результат.
Примечания: Во время тестирования программы используйте exe файл. В delphi она работать не будет (по крайне мере в delphi 7).
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
01.10.2018, 13:34 3
Цитата Сообщение от Katerina1993 Посмотреть сообщение
В delphi она работать не будет (по крайне мере в delphi 7).
Да? Почему? Ну-с, протестируем...

Добавлено через 17 минут
Всё норм у меня работает...

Добавлено через 1 минуту
Правда, я бы сделал "убивание ссылок" в конце:
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
procedure TForm1.Button2Click(Sender: TObject);
var
  MSWord, vstart, vend, DocName, Doc1: OleVariant;
  //ilengy: Integer;
begin
  DocName := 'C:\Doc1.docx';
  try
    try
      MsWord := GetActiveOleObject('Word.Application');
    except
      try
        MsWord := CreateOleObject('Word.Application');
        Doc1 := MsWord.Documents.Open(DocName);
        MsWord.Visible := True;
      except
        Exception.Create('Error');
      end;
    end;
    vstart := 10;
    vend := 40;
    Doc1.Range(vstart, vend).Select;
    MSWord.Selection.InsertBefore('txt1');
    MSWord.Selection.InsertAfter('txt2');
    MSWord.ActiveDocument.SaveAs('C:\Doc2.doc');
  finally
    Doc1 := Unassigned;
    MSWord := Unassigned;
  end;
end;
0
70 / 12 / 4
Регистрация: 17.01.2017
Сообщений: 524
03.10.2018, 12:36  [ТС] 4
У меня тоже работает, если дважды нажать Run (F9). Потому, что при первом запуске выдаёт сообщение об ошибке. "Операция не доступна". Если же использовать exe-файл, то такой ошибки не будет.
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
03.10.2018, 12:53 5
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Потому, что при первом запуске выдаёт сообщение об ошибке. "Операция не доступна".
Ничего такого у меня нет... А Вы пробовали заключить в try-finally код, как я написал?
Может, стоит скрывать окно MSWord после того, как Вы создали этот объект?
0
70 / 12 / 4
Регистрация: 17.01.2017
Сообщений: 524
03.10.2018, 16:19  [ТС] 6
Всё равно выдаёт ошибку, может просто запущен какой-нибудь процесс, который мешает запустить программу с первого раза.

Добавлено через 7 минут
Короче всё больше не выдаёт ошибку я переписала код, теперь работает без ошибок:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.....
uses ComObj;
.....
var DocName, MSWord, Doc1, vstart, vend: OleVariant;
.....
procedure TForm1.Button1Click(Sender: TObject);
begin
 try
  DocName:='C:/doc1.docx';
  MSWord:=CreateOleObject('Word.Application');
  MSWord.Visible:=True;
  Doc1:=MSWord.Documents.Open(DocName);
  vstart := 10;
  vend := 40;
  Doc1.Range(vstart, vend).Select;
  MSWord.Selection.InsertBefore('txt1');
  MSWord.Selection.InsertAfter('txt2');
  MSWord.ActiveDocument.SaveAs('C:\Doc2.doc');
  finally
    Doc1 := Unassigned;
    MSWord := Unassigned;
  end;
end;
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
03.10.2018, 16:28 7
Ну, некоторые try-except можно было оставить А то Вы так с плеча...
Например,у создания объекта.
Дело в том, что когда Вы питаетесь запустить активный word, то делфи ищет нужный процесс. А так как Вы их не закрываете, то в процессах болтается несколько word'ов и возникает запара - к какому из них подключаться.
0
70 / 12 / 4
Регистрация: 17.01.2017
Сообщений: 524
03.10.2018, 19:18  [ТС] 8
На одном сайте, где я сейчас изучаю работу delphi c word не используется try-except
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
03.10.2018, 20:10 9
Цитата Сообщение от Katerina1993 Посмотреть сообщение
На одном сайте, где я сейчас изучаю работу delphi c word не используется try-except
И? Всегда, когда работаете с OLE-объектами, заключайте основные моменты в try-except. Причина проста: симбиоз дельфи и MS Office - редкий геморрой, если их и использовать, то лишь из-за нескольких функций, позволяющих оптимизировать работу MS Office.
0
70 / 12 / 4
Регистрация: 17.01.2017
Сообщений: 524
03.10.2018, 20:28  [ТС] 10
Просто я не знала, учту на будущее.
0
03.10.2018, 20:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2018, 20:28
Помогаю со студенческими работами здесь

Команда insertBefore класса DomNode
Добрый вечер. При разборе команды insertBefore, возникла сложность ее использования. Код: ...

При добавлении текста в Word часть добавляемого текста сделать жирным
Здравствуйте. Добавляю текст в Word операторами (переменные CalcValue, Str: String формируются...

(Исправление/добавление) текста в textBox. Курсор ввода уходит в конец текста
Добрый день! Написал текст в textBox, хочу исправить один или два символа в середине текста или...

Добавление текста в Мемо из файла (с сохранением уже имеющегося текста)
procedure TForm1.FormCreate(Sender: TObject); begin if FileExists('c:\1.txt') then ...


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

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