Страница 2 из 3

Добавлено: 11 окт 2005, 20:45
Naeel Maqsudov
Извиняюсь.
Во-первых, думал, что 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 в документ.

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

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

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

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

If vartype(Dogovor)=varDispatch then Dogovor.visible:=true; 
И все равно не канает. Есть еще предложения?

Добавлено: 12 окт 2005, 08:12
Dr_Grizzly
Может стоит как-то это все по другому переделать?

Добавлено: 12 окт 2005, 08:19
Dr_Grizzly

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

WordApplication1.ActiveDocument.InlineShapes.Item(<index>).
Нашел вот такое. Что там дальше можно приписать? после items я могу выбрать OLEFormat а вот после этого не могу ничего подобрать.

Добавлено: 12 окт 2005, 14:21
Игорь Акопян
уточню исходный вопрос: нужно в абсолютно пустой лист в произвольное место вставить текст? или просто заполнять переменным содержимым некий шаблон?

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

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

Поясняю подробнее:
В нужных местах размещай не label-ы а "надписи" и пихай текст в них. Имя той или иной надписи можно посмотреть в макросе. К статье приложен рабочий пример.

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

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

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


Вообще странно, что не вышло с переменной Dogovor.....
НЕВЕРЮ :) ...И Delphi нету, чтобы попробовать. :(

Добавлено: 12 окт 2005, 19:36
Naeel Maqsudov
Впринципе не обязательно пользователю видеть документ, можно ведь сначала сделать изменения, а потом уже показать его?
Эврика! Не надо заморачиваться с показом\непоказом

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

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

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

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

Var
  Doc: Variant;
.....

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

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

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

Обязательно попробуйте и напишите получилось или нет....

Добавлено: 13 окт 2005, 11:37
Dr_Grizzly

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

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"не являеться свойством) Истина где-то рядом ;)
Еще предложения есть?

УРА!!!!!!!!!

Добавлено: 13 окт 2005, 11:40
Dr_Grizzly

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

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 и получалось что он как бы открыт,от этого не перехватывала то что мне надо