Проблемы общения с Word из Дельфы

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Извиняюсь.
Во-первых, думал, что Dogovor - это экземпляр класса Document, а оказывается Application. Во-вторых забыл, что ThisDocument не является экземпляром класса Document, а оддельным классом - наследником Document....

Все гораздо сложнее.
У Application надо найти документ. Попробуйте для начала использовать Dogovor.ActiveDocument. Однако, учитывая, что пользователю видно окно, то это не лучший прием. В последствии прийдется просканировать коллекцию Documents.

Итак добрались до документа. Теперь элементы управления. Они могут располагаться "в тексте" или "поверх текста" и их надо соответственно искать в коллекциях InlineShapes и Shapes

Dogovor.ActiveDoument.InlineShapes[1] даст первый по тексту элемент управления.
Допустим это Label

Вот теперь нам надо сделать
Dogovor.ActiveDoument.InlineShapes[1].OLEFormat.Object.Caption := 'qwe';

Т.е. сам Shape - это абстрактный класс для представления автофигур и элементов управления в документе. Используя свойство Object можно получить наконец интерфейс самого Label1 и вот только теперь можно использовать любый свойства, которые видны в окне свойств при добавлении Label в документ.
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Однако, учитывая, что пользователю видно окно, то это не лучший прием.
Впринципе не обязательно пользователю видеть документ, можно ведь сначала сделать изменения, а потом уже показать его?
Пробую

Код: Выделить всё

 Dogovor.ActiveDoument.InlineShapes[1].OLEFormat.Object.Caption := 'qwe'; 
И все равно говорит:
Method "ActiveDocument" is not supported by automation object
Уже убирал строку

Код: Выделить всё

If vartype(Dogovor)=varDispatch then Dogovor.visible:=true; 
И все равно не канает. Есть еще предложения?
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Может стоит как-то это все по другому переделать?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Код: Выделить всё

WordApplication1.ActiveDocument.InlineShapes.Item(<index>).
Нашел вот такое. Что там дальше можно приписать? после items я могу выбрать OLEFormat а вот после этого не могу ничего подобрать.
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

уточню исходный вопрос: нужно в абсолютно пустой лист в произвольное место вставить текст? или просто заполнять переменным содержимым некий шаблон?
Изображение
YurikGL
Сообщения: 142
Зарегистрирован: 16 фев 2005, 21:54
Откуда: Уфа
Контактная информация:

>Проблема та-разместить нужные вставки из проги в конкретные места документа, вот я и нашел один из
>способов-это использовать Lablel в документе, а уже в него вставлять текст/цыфры из моей проги.

В приведенной выше статье написано как это сделать.
...
На второй странице в верхний колонтитул тоже вставляем объект надпись. В него мы будем вставлять название документа.
...
vr := 'Text Box 8';
w1.ActiveDocument.Shapes.Item(vr).Select(EmptyParam);
w1.Selection.TypeText('текст на титульной');

Поясняю подробнее:
В нужных местах размещай не label-ы а "надписи" и пихай текст в них. Имя той или иной надписи можно посмотреть в макросе. К статье приложен рабочий пример.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Код:
WordApplication1.ActiveDocument.InlineShapes.Item(<index>).
Нашел вот такое. Что там дальше можно приписать? после items я могу выбрать OLEFormat а вот после этого не могу ничего подобрать.
Дальше .Object.СвойствоИлиМетодОбъекта как я писал выше.

.Object - это automation object. Delphi IDE во время написания исходного кода ничего не предложит выбрать из списка, так как все библиотеки типов MSOffice могут быть не импортированы в Delphi.

Теперь остается только изучать объектную модель MSOffice....


Вообще странно, что не вышло с переменной Dogovor.....
НЕВЕРЮ :) ...И Delphi нету, чтобы попробовать. :(
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Впринципе не обязательно пользователю видеть документ, можно ведь сначала сделать изменения, а потом уже показать его?
Эврика! Не надо заморачиваться с показом\непоказом

Dogovor.Documents.Open
или
Dogovor.Documents.New

это функции!
Возвращают ссылку на интерфейс объекта типа Document.

Настоятельно рекомендую вместо использования TWordApplication попробовать еще так:

Код: Выделить всё

Var
  Doc: Variant;
.....

Doc := Dogovor.Documents.Open('.....');
Doc.InlineShapes.........;

//кстати, не уверен, но и самый первый вариант может сработать, т.е.

Doc.Label1........;

Обязательно попробуйте и напишите получилось или нет....
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Код: Выделить всё

Var 
  Doc: Variant; 
..... 

Doc := Dogovor.Documents.Open('.....'); 
Doc.InlineShapes.........; 

//кстати, не уверен, но и самый первый вариант может сработать, т.е. 

Doc.Label1........; 

Ни одна запись не проканала, ругаеться, но вот что-то по новому:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
doc:Variant;
begin
Dogovor:=CreateOleObject('Word.Application');
Doc:=Dogovor.Documents.Open('C:\Диплом\Doc1.doc');

!!! Doc.InlineShapes[1].Caption := 'qwe';

  If vartype(Dogovor)=varDispatch then
       begin
            Dogovor.Displayalerts:=false;
            Dogovor:=Unassigned;
       end;

end;
На строку пемеченную "!!!" Говорит: ("Item"не являеться свойством) Истина где-то рядом ;)
Еще предложения есть?
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Код: Выделить всё

Dogovor:=CreateOleObject('Word.Application');
Doc:=Dogovor.Documents.Open('C:\Диплом\Doc1.doc');

Doc.Label1.Caption := 'qwe';

If vartype(Dogovor)=varDispatch then Dogovor.visible:=true;
  If vartype(Dogovor)=varDispatch then
       begin
            Dogovor.Displayalerts:=false;
            Dogovor:=Unassigned;
       end; 
ЗАРАБОТАЛА!!!! Но как-то странна, со второго раза, я так думаю, когда закрывал приложение после ошибки, не закрыл в процессах WINWORD и получалось что он как бы открыт,от этого не перехватывала то что мне надо
Ответить