Разработка интегрированных прикладных программ (Меньшикова К. Г.). Разработка интегрированных прикладных программ (Меньшикова К. Г.. Методическое пособие по курсу Проектирование программного обеспечения автоматизированных систем для студентов, обучающихся по направлению Прикладная математика и информатика
Скачать 313.5 Kb.
|
3.2.Серверы MS Office и позднее связываниеПриложения Microsoft Office созданы с соблюдением всех правил COM и поэтому обладают рядом свойств, обязательных для серверов автоматизации. Подробный перечень свойств можно найти в [3]. В табл. 1 перечислены только обязательные свойства и методы. Таблица 1. Обязательные свойства и методы объекта втоматизации
В общем случае любой контроллер автоматизации (не только для офиса) должен проверить, запущена ли уже копия приложения-сервера, и решить, запускать ли новую копию или подключиться к имеющейся. После окончания работы с сервером закрыть приложение (если сервер был запущен контроллером) или отключиться от него. Рассмотрим программный код, который позволяет это сделать. Создадим в C++Builder новое приложение с двумя кнопками (Button1-> Caption=Connect и Button2-> Caption=Disconnect). Включим в текст строку #include Объявим логическую переменную, которая будет помнить, запустил ли контроллер приложение-сервер (true) или подключился к работающей копии (false): bool RunServer; Вариантные переменные будут представлять в контроллере объекты сервера (приложение и коллекцию рабочих книг): Variant App, WorkBs; Код обработчика первой кнопки попытается связаться с запущенной копией сервера, передав в качестве параметра строку, содержащую имя объекта автоматизации (ProgID – программные идентификаторы содержатся в реестре и независимы от версии). При неудаче возникнет системное исключение и тогда контроллер сам создаст объект автоматизации: void __fastcall TForm1::Button1Click(TObject *Sender) {AnsiString AppProgID; AppProgID="Excel.Application"; RunServer=False; if (VarType(App)!=varDispatch) { try {App=GetActiveOleObject(AppProgID);} catch (EOleSysError&) {App=CreateOleObject(AppProgID);RunServer=true;} } if (VarType(App)==varDispatch) { App.OlePropertySet("Visible",true); WorkBs=App.OlePropertyGet("Workbooks"); WorkBs.OleProcedure("Add"); } } Вторая кнопка закроет сервер (если контроллер его сам стартовал) и освободит указатели на все полученные интерфейсы: void __fastcall TForm1::Button2Click(TObject *Sender) { if (RunServer) App.OleProcedure("Quit"); WorkBs=NULL; App=NULL; } Если окно сервера видимо, то пользователь может непредсказуемо вмешаться в совместную работу приложений. Поэтому при создании контроллеров таких приложений не рекомендуется давать доступ конечному пользователю к интерфейсу сервера. Проще всего этого достичь, установив свойство Visible=false, а чтобы сервер не выводил на экран диагностические сообщения для пользователя, то установить свойство DisplayAlerts=false. 3.3.Контроллер на C++ Builder (позднее связывание)Для организации позднего связывания контроллера с сервером MS Excel, естественно, понадобятся переменные типа Variant: AppE (объект Application), Workbs (коллекция рабочих книг), Workb (рабочая книга), Workshs (коллекция листов рабочей книги), Worksh (рабочий лист), work (ячейка таблицы). После создания приложения (объект Application) AppE=CreateOleObject ("Excel.Application"); с помощью метода OlePropertyGet можно получить доступ к другим объектам MS Excel: Workbs=AppE.OlePropertyGet("Workbooks"); Workb=Workbs.OlePropertyGet("Item",1); Workshs=Workb.OlePropertyGet("Worksheets") ; Worksh=Workshs.OlePropertyGet("Item",2); Для добавления нового объекта к коллекции (например, рабочей книги) используется процедура Add, для вызова которой придется использовать метод OleProcedure: Workbs.OleProcedure("Add"); Для изменения свойств используется метод OlePropertySet: AppE.OlePropertySet("Visible",true); Workshs.OlePropertyGet("Item",1).OlePropertySet ("Name","Исходная таблица"); Доступ к ячейкам таблицы организуется совместной работой методов: // запись значения в ячейку (числа или формулы) Worksh.OlePropertyGet("Cells").OlePropertyGet ("Item",3,1).OlePropertySet("Value",-34); Worksh.OlePropertyGet("Cells").OlePropertyGet ("Item",11,1).OlePropertySet ("Value","=СУММ(A1:A10)"); // оформление ячейки таблицы work=Worksh.OlePropertyGet("Cells").OlePropertyGet ("Item",3,2); work.OlePropertyGet("Font").OlePropertySet ("Color",clBlue); work.OlePropertyGet("Font").OlePropertySet ("Bold",true); Для организации позднего связывания c MS Word также понадобятся переменные типа Variant: AppW (объект Application), WordDs (коллекция документов WordDocuments), WordD (документ Document), WordPars (коллекция Paragraphs), Rng (объект Range). После создания приложения-сервера AppW=CreateOleObject ("Word.Application"); доступ к его свойствам (среди свойств есть и такие, которые представляют коллекции других объектов) можно получить через функцию OlePropertyGet: WordDs=AppW.OlePropertyGet("Documents"); WordD=AppW.OlePropertyGet("ActiveDocument"); WordPars=WordD.OlePropertyGet("Paragraphs"); Для установки значений свойств используется OlePropertySet: AppW.OlePropertySet("Visible",true); AppW.OlePropertySet("Width",200); Для доступа к конкретному объекту коллекции документов или параграфов используется функция OleFunction, а для создания новых объектов необходимо использовать метод OleProcedure, например: WordD = WordDs.OleFunction ("Item",2); WordDs.OleProcedure("Add"); WordPars.OleProcedure("Add"); Для работы с документом потребуется сочетание перечисленных функций и методов: //получение количества документов и активизация документа int j=(int) (WordDs.OlePropertyGet("Count")); WordD =WordDs.OleFunction ("Item",2).OleProcedure ("Activate"); // доступ к частям документа Rng=WordD.OleFunction("Range",10,15); Rng= WordPars.OleFunction ("Item",1). OlePropertyGet("Range"); // вставка текста в документ Rng.OleProcedure("InsertBefore","Текст 1"); WordPars.OleFunction("Item",1).OlePropertyGet("Range"). OleProcedure("InsertAfter","Текст 33"); // изменение цвета букв Rng.OlePropertyGet("Font").OlePropertySet("Color",clRed); |