...
...

Применение OLE - от простого к сложному

Если Вы не только программист, но и творческая личность, вероятно, Вы не раз обращали внимание, что Вашим программам не хватает функций по обработке текста, как в MS Word, гибкости в обработке различных типов данных в одной таблице, как в Excel, печати разнообразных отчетов, как в этих программах. Все это является результатом многолетнего труда тысяч программистов, и одному его не повторить. Можно ли это заставить работать в других программах?

В таких случаях и приходит на помощь технология Object Linking and Embedding - объектное связывание и внедрение. Прямым назначением механизма OLE является доступ к объектам из внешних программ.

Практически каждый уважающий себя пользователь использует OLE, вставляя картинки в документы Word и диаграммы в таблицы Excel. Кто слегка покруче, тот вставляет таблицы и документы друг в друга либо использует слияние документов.

Точно таким же образом весьма полезным применением Office 97 может стать использование его объектов в Ваших программах. OLE-объектами являются не только MS Graph или Equation или WordArt, но и сами приложения Office - Word, Excel, Access, PowerPoint... Поэтому все разнообразие возможностей Office открыто для всех желающих.

Например, Вы можете создать объект-наследник от "Excel.Application" и вызывать методы этого объекта в своей программе. В таком случае Ваше приложение станет гордо именоваться OLE-клиентом. При этом Excel запустится как OLE-сервер, а вызовы методов будут транслироваться в вызовы функций OLE-сервера. Это можно применить, в частности, для передачи данных и формирования отчетов своей программой внутри Excel, при этом Вам будет совершенно безразлично, как он это реализует и какова структура его электронных таблиц.

Допустим, Вы работаете в СУБД Visual FoxPro. Создайте новую программу (через меню "File/New", далее выберите "Program" и "New File") и сохраните ее под именем "UsingOLE.PRG". Краткий пример программы будет выглядеть следующим образом:
proc usingOLE
*создание объекта
MyObject= CREATEOBJECT("Excel.Application")
*инициализация объекта - запуск Excel
MyObject.Run
*сделать окно Excel видимым - необязательно
MyObject.Visible=.t.
*** Работа с объектом ***
*Открытие существующей книги
MyObject.Workbooks.Open("C:\Мои документы\Учет тепла.xls")
*Закрытие активной книги
MyObject.ActiveWindow.Close
*Создание новой
MyObject.Workbooks.Add
*Перенос данных в ячейку C7
MyObject.Range("C7").Value = 1234
*Выбор ячейки C8
MyObject.Range("C8").Select
*Присваивание формулы либо значения
MyObject.ActiveCell.FormulaR1C1 = "4321"
MyObject.Range("C9").FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)"
*Сохранение под другим именем
MyObject.ActiveSheet.SaveAs("C:\Training.XLS")
*выход из Excel
MyObject.Quit
return

Теперь запускайте свое творение через меню "Program/Do" и наслаждайтесь чувством превосходства.

Как нетрудно догадаться, можно записать свои ручные действия над таблицей Excel в виде макроса VBA, а потом с небольшими изменениями использовать полученный исходник в программе на Visual FoxPro, добавляя для каждого вызова метода имя своего OLE-объекта.

Если же Вы предпочитаете работать в MS Access и вызывать из него, скажем, Word, то будет еще проще. В своей базе данных создайте новый модуль, а внутри его запишите этот пример процедуры на языке Visual Basic:
Sub usingOLE()
Set MyObject = CreateObject("Word.Application")
MyObject.Visible = True
MyObject.Documents.Add
MyObject.Selection.TypeParagraph
MyObject.Selection.TypeText("Hello world!")
MyObject.ActiveDocument.SaveAs("C:\Мои документы\Hello world.doc)
MyObject.Quit
End Sub

Теперь в любом макросе своей БД Вы можете вызывать эту процедуру с помощью команды "ОткрытьМодуль".

Аналогично, Вы можете в любой среде разработки, поддерживающей OLE, запрограммировать работу с любым OLE-сервером.

Конечно, везде есть свои "НО". Во-первых, внутри макросов зачастую используются константы, специфичные для каждого конкретного приложения, значения которых явно не заданы и Вашей программе неизвестны. Чаще всего константы используются в методах форматирования документов. Это препятствие можно обойти. Например, в Excel достаточно будет програм-мно присвоить константу какой-нибудь ячейке - и она сразу же отобразит значение. Для этого создайте пустой макрос и введите в него следующий код:
Sheets("Лист1").Select
ActiveCell.Value = xlMinimized 'константы состояния окна
Range("A7").Value = xlMaximized

Далее, через меню "Сервис/Макрос/Выполнить" запустите свой макрос и увидите результаты.

Во-вторых, не все методы объектов Office доступны извне. Я еще не встречал хоть какого-нибудь руководства, описывающего доступные методы в Office 97 (может, плохо искал:-), поэтому для каждого приложения в отдельности приходится применять метод проб и ошибок.

Небольшие примеры находятся в печатных томах "Руководства по программированию на Visual Basic for Applications", которое поставляется вместе с лицензионными копиями Office 97. Они достойны внимания программистов, начинающих штурмовать OLE уже после освоения объектного программирования в других языках. Кстати, в руководстве по Visual FoxPro они тоже есть, правда, на английском языке, что для большинства программистов, к сожалению, является непреодолимой преградой (примите мои соболезнования). Желаю успеха.

P. S. Приведенные выше примеры работают только с Office 97. Для ранних версий Office используются другие имена объектов и другие методы.

Виктор Маковчик

© Компьютерная газета

полезные ссылки
Регистрация компаний в Великобритании