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