
- •Тема 6. Особенности разработки пакетов прикладных программ
- •Определение ппп и его составные части
- •. 2.16. Вариант классификации ппп по функциональному назначению
- •Иными словами, функциональная связь в модели предметной области представляется:
- •Способы применения ппп и задача управления процессами
- •Способы динамического запуска вычислительных процессов
- •. Рис. 2.18. Запуск внешней программы с замещением родительского процесса
- •Например, оператор
- •If (execlp("f1.Ехе","Fl.Exe", null)) ShowMessage ("Программа Fl.Exe не выполнена");
- •Реализация динамического обмена данными методом dde
- •Таким образом, взаимодействие dde может выполнять следующие операции:
- •Во время же выполнения программы эти свойства могут быть установлены методом SetLink, который описывается следующим образом:
- •Основы архитектуры сом
- •Основы автоматизации ole
- •Элементы управления ActiveX
- •Организация приложений с несколькими потоками
- •Заголовочный файл Unit2.H:
Элементы управления ActiveX
Первоначально управляющие элементы ActiveX назывались элементами OLE или OCX. Затем Microsoft внесла некоторые изменения в элементы OCX, обеспечив ряд новых возможностей, сделавших эти элементы более подходящими для применения в Интернет-технологиях (например, управляющий элемент ActiveX может хранить свои данные на web-сервере либо может быть загружен с web-сервера и затем запущен на стороне клиента). Чтобы отразить наличие новых возможностей, название «управляющий элемент OLE» было заменено на «элемент ActiveX». С точки зрения модели СОМ элементы управления ActiveX являются внутренними серверами, поддерживающими технологию Automation. Таким образом, платформа ActiveX, по существу, представляет собой адаптацию к Web существующих технологий Microsoft, базирующихся на механизмах OLE и СОМ. Первоначально термин ActiveX относился именно к технологиям, связанным с Интернетом. Однако со временем значение термина ActiveX было расширено и его стали использовать для обозначения различных технологий Microsoft на основе СОМ, ранее известных под именем OLE (OLE Automation, OLE Documents, OLE Controls и т. п.). Тем не менее, не совсем правильно отождествлять технологии OLE и ActiveX — элементы ActiveX являются модификацией управляющих элементов OLE, но не их полными аналогами. Библиотеки элементов ActiveX имеют меньший объем по сравнению с библиотеками управляющих элементов OLE и обеспечивают более высокую скорость взаимодействия с клиентами. Сохранилась и совместимость — любой программный компонент OLE будет работать с библиотеками ActiveX.
ActiveX и компонентное программирование
Элемент управления ActiveX представляет собой сервер, поддерживающий технологию автоматизации, реализованный в виде динамической библиотеки, исполняемый в адресном пространстве вызывающего его приложения и допускающий визуальное редактирование. Разработчики программ могут использовать такие элементы в приложениях, чтобы получить преимущества функциональных возможностей существующего программного обеспечения. Таким образом, приложение строится из готовых частей. Такой подход к разработке программных продуктов называется компонентным программированием. В виде элемента ActiveX может быть реализовано все что угодно — от обычной кнопки до полнофункциональной электронной таблицы.
Программирование с использованием компонентов имеет много достоинств. При использовании компонентного подхода приложение (которое может представлять собой большую и сложную систему) разбивается на более мелкие и простые для понимания части. В результате этого:
систему можно наращивать постепенно, по мере создания частей;
значительно упрощается процесс отладки, так как каждый компонент системы
можно отлаживать отдельно;
систему легче адаптировать под требования заказчика, так как можно изменять не всю систему в целом, а лишь некоторые ее компоненты;
компоненты системы можно повторно использовать в последующих разработках;
компоненты системы могут находиться в любом доступном через сеть месте, в том числе и на другом компьютере;
компоненты могут быть написаны на разных языках программирования;
значительно упрощается модернизация системы, так как систему можно модифицировать по частям, поставляя новые версии компонентов.
Технология ActiveX хорошо соответствует идее компонентного программирования и в настоящее время является своего рода стандартом компонентного подхода для разработки приложений Windows. Возможность создания и использования компонентов ActiveX реализована практически во всех современных средствах разработки (Visual Basic, Visual C++, Borland Delphi, Borland C++ Builder, любые средства разработки на Java).
ПРИМЕЧАНИЕ. Несмотря на большое количество достоинств, элементы ActiveX не лишены и некоторых недостатков, среди которых наиболее существенными являются следующие: 1. Полноценная поддержка ActiveX имеется только в операционной системе Windows. В настоящее время этот недостаток, вероятно, не очень существенен ввиду монополии Windows как операционной системы для настольных компьютеров. Однако не исключено, что в скором времени ситуация может измениться и появятся операционные системы, способные составить конкуренцию Windows в этом секторе рынка программного обеспечения. 2. Компоненты ActiveX не позволяют в полной мере реализовать объектно-ориентированный подход. У элементов ActiveX (как и у объектов СОМ) отсутствует механизм наследования и, естественно, не реализуется полиморфизм. Поэтому программы, построенные на основе иерархии объектов СОМ, имеют очень сложную структуру (вспомните, например, структуру объектов приложений MS Office, которую мы рассматривали в предыдущей главе).
Использование и создание элементов ActiveX в Delphi
Среда разработки Delphi позволяет работать с элементами управления ActiveX точно так же, как и с компонентами VCL. В стандартную поставку Delphi входит несколько элементов ActiveX, которые располагаются на странице ActiveX палитры компонентов. Единственным, пожалуй, отличием элементов ActiveX от компонентов VCL является то, что их нельзя использовать в качестве предков при создании новых компонентов.
Существует громадное количество различных элементов ActiveX, созданных многочисленными разработчиками. В сети Интернет можно найти множество как коммерческих, так и бесплатных компонентов, реализующих самые разные функции. Поэтому если при разработке приложений возникает необходимость в каком-либо нестандартном элементе управления, то не всегда имеет смысл разрабатывать его самостоятельно — можно сначала поискать, не существует ли уже что-нибудь похожее на то, что вам требуется. (Однако к компонентам VCL и ActiveX, загруженным из Интернета, все же следует относиться с осторожностью, так как они могут стать источником трудно обнаруживаемых ошибок).
Создание собственных элементов ActiveX и форм ActiveForm
Элементы ActiveX в Delphi создаются на основе компонентов VCL или на основе форм. Во втором случае создаваемая форма называется ActiveForm и представляет собой набор визуальных и невизуальных компонентов.
Наиболее простым способом создания элемента ActiveX является преобразование существующего компонента VCL в элемент ActiveX. Таким образом, если вам требуется создать какой-либо новый элемент ActiveX, то вначале следует создать компонент VCL, а затем преобразовать его в ActiveX.
ПРИМЕЧАНИЕ. Напрямую в ActiveX могут быть преобразованы только те компоненты VCL, которые являются потомками TWinControl. В принципе можно создать элемент ActiveX на основе любого визуального компонента VCL, но здесь мы этот вопрос рассматривать не будем. Такая задача, во-первых, довольно сложна и ее рассмотрение потребовало бы значительного увеличения объема данной главы. Во-вторых, этот вопрос лежит вне области рассмотрения данной книги, так как представляет собой чисто программистскую задачу.
Преобразование компонента VCL в элемент ActiveX выполняется очень просто. Для этого используется специальный мастер, который запускается при выборе значка ActiveX Control на вкладке ActiveX окна диалога New Items. (Напомним, что это окно открывается при выборе команды File > New главного меню Delphi IDE).
В элемент ActiveX можно преобразовать не только компонент VCL, но и целую форму. Причем в этом случае на форму можно помещать и невизуальные компоненты. Следовательно, в формах ActiveForm можно использовать компоненты для доступа к данным.
Никаких ограничений на действия, выполняемые в формах ActiveForm, не накладывается. Единственное, что необходимо учитывать, — то, что клиентам будут недоступны свойства, методы и события компонентов, размещенных на форме. Если такой доступ необходим, то следует добавить в класс формы свойства и методы, через которые клиент сможет изменять свойства внутренних компонентов формы.
Методы взаимодействия с сервером автоматизации
Как уже было сказано выше, современным способом взаимодействия между различными приложениями является использование технологии OLE Automation. Работа с сервером автоматизации мало отличается от работы с обычным объектом в системах ООП. Как уже отмечалось, различают два метода доступа к серверу автоматизации: позднее связывание и раннее связывание. Остановимся на назначении и функционировании каждого из них более подробно.
При использовании позднего связывания компилятору Delphi не требуется никакой информации об используемом объекте. Этот факт следует отнести к недостаткам позднего связывания, так как компилятор не может проверить синтаксис кода, используемого для доступа к серверу автоматизации.
Для получения доступа к серверу автоматизации используется функция Delphi Created eObject: function CreateOleObjecKconst ClassName: string): IDispatch;
С помощью параметра ClassName передается строковый идентификатор программы, связанный с объектом автоматизации. Функция Created eObject возвращает указатель на интерфейс IDi spatch, который используется для связи с объектом
ПРИМЕЧАНИЕ. Функция CreateOleObject находится в модуле ComObj, поэтому при ее использовании необходимо включить данный модуль в раздел uses, Переменная, которая будет являться указателем на интерфейс (то есть которой присваивается значение, возвращаемое функцией CreateOleObject), должна иметь тип 01 eVari ant, специально предназначенный для работы с объектами автоматизации.
После получения ссылки на объект автоматизации можно вызывать любые методы данного объекта.
Пример использования позднего связывания
Рассмотрим простой пример передачи текста в MS Word с использованием функции CreateOleObject. Создайте в Delphi новое приложение, разместите на форме кнопку и задайте для нее следующий метод-обработчик события OnCl ick:
procedure TForml.ButtonlClick(Sender: TObject); var W : OleVariant; begin W:=Create01eObject('Word.Basic'): W.AppShow; W.FileNew; W.Insert('Пример создания нового документа'+#13): W.InsertCn передачи в него текста'+#13);; end;
Если теперь откомпилировать и запустить приложение, то после нажатия на кнопку, с которой связан приведенный выше обработчик события, откроется редактор MS Word, в нем будет создан новый документ, в который будут добавлены две строки, указанные в качестве параметра метода Insert.
Прокомментируем приведенный фрагмент кода более подробно. В первой строке мы вызвали функцию Created eObject и получили указатель на интерфейс объекта автоматизации Basic сервера автоматизации Word. После этого мы имеем возможность обращаться к методам и свойствам сервера Word, поддерживаемых интерфейсом объекта Basic так же, как и к методам обычных объектов Delphi. При вызове функции Created eObject производится запуск приложения MS Word. Однако окно редактора не будет отображаться на экране компьютера. Чтобы пользователь мог увидеть его, вызывается метод AppShow. Следующие строки содержат команды создания нового документа (вызывается метод Fi I eNew) и команды вставки строк текста в документ (метод Insert).
ВНИМАНИЕ: Обратите внимание, что компилятор Delphi ничего не «знает» о методах и свойствах объекта Word, и если попытаться вызвать несуществующий метод, программа все равно будет откомпилирована. Ошибка проявится только во время выполнения программы. Это является очень серьезным недостатком позднего связывания, так как не позволяет выявлять ошибки в вызовах методов объекта автоматизации на стадии компиляции.
ПРИМЕЧАНИЕ. В рассмотренном примере мы использовали интерфейс, управляющий приложением MS Word с использованием команд языка Word Basic, который использовался для написания макросов в старых версиях Word (до 6-й версии включительно). Сейчас макросы Word и других приложений MS Office пишутся на языке Visual Basic for Application (VBA) — разновидности языка Visual Basic. Однако сохранилась поддержка и языка WordBasic. Мы использовали WordBasic вследствие его большей простоты и наглядности. При использовании VBA фрагмент кода, выполняющий те же самые действия, был бы более громоздким и менее понятным. Для использования VBA в качестве параметра функции CreateOleObject следует указать строку Word.Application.
При использовании раннего связывания компилятор должен получить информацию о методах и свойствах, которыми обладает объект автоматизации. Информация такого рода содержится в библиотеках типов, которые поставляются вместе с сервером автоматизации. Это могут быть файлы в одном из следующих форматов:
Type Library (.tlb);
Object Type Library (.olb);
в файлах элементов управления ActiveX (.ocx);
в файлах ресурсов, скомпонованных с исполняемыми файлами (*.ехе) или динамически загружаемыми библиотеками (*.dll).
В библиотеках типов обычно содержится следующая информация:
информация о перечислениях, используемых сервером автоматизации;
описания обычных интерфейсов, интерфейсов диспетчеризации и классов составных объектов;
ссылки на описания типов в других библиотеках.
Чтобы импортировать информацию о типах в проект, используется команда Project > Import Type Library главного меню Delphi IDE. При выборе этой команды открывается окно диалога Import Type Library (рис. 18.1), в котором содержится список всех серверов автоматизации и элементов ActiveX, зарегистрированных в системе. Список классов, описанных в библиотеке, приводится в списке Class names.
Для импорта библиотеки типов в проект следует выбрать нужный сервер и щелкнуть на одной из кнопок Install или Create Unit. В обоих случаях Delphi сгенерирует файл, содержащий описание типов выбранной библиотеки в синтаксисе языка Object Pascal, и добавит его к текущему проекту. Отличие между ними состоит в том, что при щелчке на кнопке Install Delphi дополнительно к созданию модулей предложит включить их в пакет (новый или уже существующий), который затем будет откомпилирован и установлен. Использование пакетов удобно в том случае, если выбранная библиотека типов будет, затем, использована во многих проектах или при установке визуальных элементов управления ActiveX. автоматизации.
Резюме
Таким образом, новая особенность, появившаяся в OLE 2.0, — это автоматизация OLE, которая обеспечивает доступ к объектам приложения и манипуляцию с ними извне. Такие объекты, предоставленные (экспонированные) для внешнего пользования, называются автоматными объектами OLE.
Главное отличие автоматных объектов от обычных объектов OLE состоит в том, что автоматные объекты доступны только программно, они создаются и используются при помощи программного кода и, следовательно, в принципе временны. Они не могут быть внедрены или связаны. Они могут существовать только в течении времени выполнения ваших программ и не видны непосредственно конечному пользователю.
Ключом к успеху является модульность этих компонентов. Они могут покупаться, модернизироваться или заменяться поодиночке или группами, причем это никак не влияет на работу целого.
Типы объектов, которые могут быть экспонированы, так же разнообразны, как и сами приложения Windows. Текстовый процессор мог бы экспонировать в качестве автоматного объекта документ, абзац или предложение. Электронная таблица могла бы экспонировать таблицу, диаграмму, ячейку или группу ячеек.