Проблемы общения с 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 в документ.
Во-первых, думал, что 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 в документ.
-
- Сообщения: 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;
-
- Сообщения: 407
- Зарегистрирован: 13 сен 2004, 12:05
- Откуда: Курган
- Контактная информация:
Может стоит как-то это все по другому переделать?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто!
Да! Кстати! Ctrl+V реально вставляет!!! ХDD

-
- Сообщения: 407
- Зарегистрирован: 13 сен 2004, 12:05
- Откуда: Курган
- Контактная информация:
Код: Выделить всё
WordApplication1.ActiveDocument.InlineShapes.Item(<index>).
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто!
Да! Кстати! Ctrl+V реально вставляет!!! ХDD

- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
уточню исходный вопрос: нужно в абсолютно пустой лист в произвольное место вставить текст? или просто заполнять переменным содержимым некий шаблон?

>Проблема та-разместить нужные вставки из проги в конкретные места документа, вот я и нашел один из
>способов-это использовать Lablel в документе, а уже в него вставлять текст/цыфры из моей проги.
В приведенной выше статье написано как это сделать.
...
На второй странице в верхний колонтитул тоже вставляем объект надпись. В него мы будем вставлять название документа.
...
vr := 'Text Box 8';
w1.ActiveDocument.Shapes.Item(vr).Select(EmptyParam);
w1.Selection.TypeText('текст на титульной');
Поясняю подробнее:
В нужных местах размещай не label-ы а "надписи" и пихай текст в них. Имя той или иной надписи можно посмотреть в макросе. К статье приложен рабочий пример.
>способов-это использовать 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
- Контактная информация:
Дальше .Object.СвойствоИлиМетодОбъекта как я писал выше.Код:
WordApplication1.ActiveDocument.InlineShapes.Item(<index>).
Нашел вот такое. Что там дальше можно приписать? после items я могу выбрать OLEFormat а вот после этого не могу ничего подобрать.
.Object - это automation object. Delphi IDE во время написания исходного кода ничего не предложит выбрать из списка, так как все библиотеки типов MSOffice могут быть не импортированы в Delphi.
Теперь остается только изучать объектную модель MSOffice....
Вообще странно, что не вышло с переменной Dogovor.....
НЕВЕРЮ


- 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........;
-
- Сообщения: 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;

Еще предложения есть?
-
- Сообщения: 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;