Рис.: Стандартный диалог Windows для определения OLE объекта.
В этом диалоге есть список всех зарегистрированных в системе OLE-серверов (регистрация происходит при инсталляции программы). Тип OLE-объекта определяется как раз тем сервером, который Вы укажете. Если Вы создаете новый объект (Create New), то при нажатии кнопки OK запустится программа OLE-сервер, в которой и формируется новый объект. После выхода из программы-сервера новый OLE объект включается (embedded object) в программу. OLE объект можно создать используя уже имеющийся файл в формате одного из OLE-серверов. Для этого нужно выбрать пункт Create from File (см. рис.2)
Рис.: Выбор OLE-объекта, хранящегося в файле.
Выбранный объект можно как включить в приложение, так и присоединить, отметив пункт Link.
Итак, давайте при создании нашего проекта создадим новый объект, выбрав для этого, например, Microsoft Word Document (рис.1). Нажмите OK и после того, как запустится MS Word, наберите там любой текст ("Это OLE-объект Microsoft Word document"). Для завершения работы в меню есть специальный пункт "File|Close and Return to Form1" (Win'95+MS Word 7.0). Запустите проект, он будет выглядеть примерно так:
Рис.: Простое приложение с OLE-контейнером.
Щелкните дважды мышкой на OLE-контейнер - запустится MS Word с документом из OLE-объекта, который можно редактировать, при этом все изменения сохраняются в OLE-объекте.
!!! Если во время дизайна Вы выбираете объект для включения в OLE-контейнер, то он полностью записывается в файл формы (FORM1.DFM) и в дальнейшем прикомпилируется к EXE файлу. В случае очень больших объектов это может привести во время дизайна к длительным паузам и даже к возникновению ошибки "Out of resource". Поэтому рекомендуется большие объекты делать присоединенными (linked).
TOLEContainer позволяет отображать в программе объект в его непосредственном виде (с различной степенью увеличения или уменьшения - свойство Zoom) или в виде пиктограммы, определяемой в диалоге на рис.1 (Display as Icon).
Выбор OLE-объекта может происходить не только во время дизайна, но и во время выполнения программы (об этом чуть ниже). Результаты работы с этим объектом можно сохранить в виде файла и в следующий раз восстановить его оттуда, для этого TOLEContainer имеет два метода SaveToFile и LoadFromFile.
Пример OLE приложения
Среди демонстрационных примеров, входящих в Delphi есть два, относящихся к работе с OLE-объектами (в директориях X:\DELPHI\DEMOS\OLE2 и X:\DELPHI\DEMOS\DOC\OLE2). Более полным является второй, который, кроме всего прочего является примером построения MDI приложения. Данная программа демонстрирует все основные возможности TOLEContainer и позволяет:
создавать новый OLE контейнер во время выполнения программы;
инициализировать OLE объект либо в стандартном диалоге Windows "Insert Object", либо с помощью Clipboard, либо с помощью техники "перенести и бросить" (drag-and-drop);
сохранить OLE объект в файле и восстановить его оттуда;
Рис.4: MDI OLE приложение.
На рис.4 показан пример MDI приложения, содержащий два дочерних окна с OLE объектами. Для создания нового OLE объекта нужно выбрать пункт меню File|New и далее Edit|Insert Object. Появится стандартный диалог Windows для инициализации OLE объекта (см. рис.1). Если приложение OLE-сервер имеет возможность сохранять информацию об OLE объекте в Clipboard, то проинициализировать объект можно с помощью пункта меню Edit|Paste Special.
Достаточно интересной является возможность применения техники drag-and-drop в применении к OLE объектам. Запустите MS Word (разместите его окно так, чтобы было видно и OLE приложение), наберите какой-нибудь текст, выделите его и с помощью мышки перетащите и бросьте на главное MDI окно приложения. Появится новое дочернее окно с OLE контейнером, содержащим этот текст. Программирование данной возможности достаточно сложно. Полное описание технологии построения данного OLE приложения есть в документации в коробке с Delphi (User's guide), этому посвящена отдельная глава.
Сохранение OLE объекта в базе данных
Иногда необходимо хранить OLE объекты не в файлах, а в базе данных (BLOB поле в таблице). Конечно, в данном случае OLE объект должен быть присоединенным (embedded) в целях переносимости. К сожалению, в стандартной поставке Delphi нет специального объекта типа TDBOLEContainer для данных целей, но OLE объект можно сохранять и восстанавливать с помощью методов SaveToStream и LoadFromStream. Например:
procedure TOLEForm.SaveOLE(Sender: TObject);
var
BlSt : TBlobStream;
begin
With Table1 do
BlSt:=TBlobStream.Create(BlobField(FieldByName('OLE')),
bmReadWrite);
OLEContainer.SaveToStream(BlSt as TStream);
BlSt.Free;
Рис.4: MDI OLE приложение.
На рис. показан пример MDI приложения, содержащий два дочерних окна с OLE объектами. Для создания нового OLE объекта нужно выбрать пункт меню File|New и далее Edit|Insert Object. Появится стандартный диалог Windows для инициализации OLE объекта (см. рис.1). Если приложение OLE-сервер имеет возможность сохранять информацию об OLE объекте в Clipboard, то проинициализировать объект можно с помощью пункта меню Edit|Paste Special.
Достаточно интересной является возможность применения техники drag-and-drop в применении к OLE объектам. Запустите MS Word (разместите его окно так, чтобы было видно и OLE приложение), наберите какой-нибудь текст, выделите его и с помощью мышки перетащите и бросьте на главное MDI окно приложения. Появится новое дочернее окно с OLE контейнером, содержащим этот текст. Программирование данной возможности достаточно сложно. Полное описание технологии построения данного OLE приложения есть в документации в коробке с Delphi (User's guide), этому посвящена отдельная глава.
Сохранение OLE объекта в базе данных
Иногда необходимо хранить OLE объекты не в файлах, а в базе данных (BLOB поле в таблице). Конечно, в данном случае OLE объект должен быть присоединенным (embedded) в целях переносимости. К сожалению, в стандартной поставке Delphi нет специального объекта типа TDBOLEContainer для данных целей, но OLE объект можно сохранять и восстанавливать с помощью методов SaveToStream и LoadFromStream. Например:
procedure TOLEForm.SaveOLE(Sender: TObject);
var
BlSt : TBlobStream;
begin
With Table1 do
BlSt:=TBlobStream.Create(BlobField(FieldByName('OLE')),
bmReadWrite);
OLEContainer.SaveToStream(BlSt as TStream);
BlSt.Free;
end; end;
Интеграция в Web.
Параллельно с развитием средств автоматизации бизнес-процессов на базе традиционных приложений, шло бурное развитие электронной коммерции. Со временем электронная коммерция сама по себе стала эффективным средством ведения бизнеса, и понятие web-приложения ушло от обычного web-сайта, сместившись по своей функциональности в область привычных «классических» приложений. С той лишь разницей, что web-приложения исторически и по самой своей сути удовлетворяют принципам многоуровневой архитектуры - разделения хранилища информации, бизнес-логики и представления данных, а средства оформления интерактивных пользовательских сред, доступные web-разработчикам, уже давно и по возможностям, и, самое главное, по дешевизне разработки превосходят средства, доступные в обычных настольных приложениях. Причем все клиенты обладают лишь самым необходимым средством отображения - браузером. Фактически, отображение посредством браузера (и все связанные с этим принципы организации приложения) и является основной чертой, по которой мы можем отличить web-приложение. Развитие средств интернет-коммерции естественным образом потребовало создания средств коммуникации между web-приложениями. То есть с этого момента развитие web-технологий влилось в общее русло развития индустрии IT, столкнувшись с проблемами интеграции, перед которыми стояла и вся индустрия в целом. И именно типичный для web-технологий (под web-технологиями в данном случае я понимаю технологии, выросшие из гипертекста) подход в итоге привел к созданию web-сервисов, которые являются универсальным решением для интеграции гетерогенных сред. Ниже мы более подробно рассмотрим технологии интеграции на базе web, которые получают все большее распространение.
XML
Датой рождения XML принято считать 1998 год, когда консорциумом W3C была утверждена соответствующая спецификация. Однако, идеи, заложенные в XML, не были новы. Технология XML основывается на языке SGML (Standart Generalized Murkup Language - Стандартный обобщенный язык разметки), который, фактически, представляет собой мета-язык для написания языков разметки. Из-за своей сложности данный язык не получил широкого распространения, однако он сыграл не последнюю роль в развитии web-технологий. Именно на SGML был основан всем известный язык разметки HTML. Но необходимо было существенно расширить возможности HTML, не впадая в крайность SGML. Простым увеличением числа стандартных тегов данную проблему решить было не возможно. Единственным разумным решением этой задачи стало использование концепции иерархически-структурированных самописательных документов, что и было реализовано в рамках XML. На данный момент XML чаще понимается не как конкретный язык разметки, а как совокупность технологий работы со структурированными данными, которые способны стать неким общим знаменателем для представления данных в распределенных системах. В состав этого набора входят такие технологии, как, собственно, язык XML, XSLT – язык, определяющий способы представления элементов XML-документа, XML Schema – возможность формального описания элементов XML-документа с целью верификации на соответствие некоторому шаблону, XPath, используемый для адресации элементов XML-документа, SOAP (Simple Object Access Protocol), используемый как транспортный уровень распределенных систем на основе сервисов, WSDL - язык описания web-сервисов и др. Все эти технологии были созданы как ответ на возникшую необходимость в едином стандарте описания данных, передаваемых между частями разнородных систем. Эти технологии стали своеобразным каркасом, на котором может быть основано взаимодействие в распределенных системах. Собственно, именно так XML-технологии и используются - в качестве оболочек программ среднего уровня для преодоления противоречий, созданных стремлением к распределенным вычислениям и, в то же время, отсутствием универсальных технологий построения распределенных систем. В силу специфики своего появления и изначального предназначения, XML еще теснее связал web-технологии с традиционными приложениями, обеспечив достаточные средства для коммуникации различных сред и предоставив необходимый базис для интеграции приложений предприятия (Enterprise Application Integration). Если говорить упрощенно, то XML как надстройка над ПО среднего уровня помимо собственно коммуникации между элементами распределенных систем, значительно упрощает представление благодаря естественной интеграции с web-приложениями. То есть браузер становится необходимым и достаточным средством отображения, а XML - связующим звеном между web-приложениями и иными распределенными системами.