![]() ![]() ![]() ![]() |
Интеграция CA-Visual Objects с Microsoft Word и Excel | 1/4 |
Первое что мы должны обсудить, это разницу между тем, что я буду называть
"Уровень интеграции данных" и "Уровень интеграции кода" . В зависимости
от Ваших требований эти два понятия вместе, или раздельно могут проявлятьс
как решения конкретных задач в ваших приложениях.
Уровень интеграции данных
Разработчики программ под DOS не имели эффективного пути для интеграции своих разработок с другими программными пакетами. Не считая, конечно, команды RUN (или эквивалентную команду, осуществляющую SWAPING на диск образа текущей памяти). Эта техника очень ограничивает контроль над данными и эффективность их использования, особенно, когда архитектура памяти у вас на машине оставляет желать лучшего.
Однако большинство программ осуществляло контроль над данными путем непосредственного разделения этих данных между приложениями на низком уровне. Не стоит и говорить о том, что путь этот тернист и сложен, так как форматов данных существует бесчисленное множество и отдельному независимому разработчику угнаться за прогрессом в этом случае весьма проблематично. В современном CA-Visual Objects 2.0 интеграция данных осуществляется посредством 32 разрядного ODBC (Open Data Base Connectivity). И вопрос доступа к необходимым данным сводиться к приобретению драйвера для этих данных.
В добавление к ODBC среда Windows позволяет осуществлять доступ к данным
через механизм DDE (Dynamic Data Exchenge) и обмен данных через буфер Windows
(Clipboard). Сама операционная система как бы примеряет данные разных форматов,
пропуская их через свой внутренний механизм. Веяния недавнего прошлого
- спецификация OLE (Object Linking and Embedding). В настоящее время эта
спецификация является наиболее перспективной и наиболее используемой. Она
и применяется для интеграции приложений и данных в CA-Visual Objects 2.0
Уровень интеграции кода
К сожалению интеграция данных часто показывает свою слабую сторону - невозможность модифицировать, изменять, удалять данные из внешнего источника кода, которым в большинстве случаев является Ваше приложение. Интеграци на уровне кода, с другой стороны, предоставляет большую целостность данных с момента подключения к данным. Технология OLE попадает именно в эту категорию.
Методология команды RUN, тоже подпадает под категорию интеграции кода,
но сами понимаете, как она соотноситься с методологией OLE, Именно поэтому
в настоящее время используется именно OLE.
До всеобъемлющего объяснения техники интеграции в Word и Excel из CA-Visual
Objects, основанной на технологии OLE я коротко попытаюсь объяснить как
это сделать более древними методами - DDE и Clipboard.
Буфер обмена данными Clipboard
На ранней стадии разработки MS-Windows, появилась необходимость реализовать
такие операции как Past и Cut для текстовой и графической информации между
двумя Windows приложениями. Windows Clipboard - это внутренний буфер, через
который осуществляются данные акции. В буфере сохраняется либо последовательность
текста, либо точечный рисунок (BitMap). Любой из этих объектов может быть
восстановлен из буфера в другом приложение любое количество раз (так как
это буфер).
В любом современном приложение под Windows поддерживается Clipboard,
в том числе и в Word и Excel. За примерами далеко ходить не надо, для написани
исходного кода ниже я использовал именно Clipboard, в который я занес часть
кода из Code-Editor в CA-Visual Objects, а потом перенес его в MS-Word
7.0, в котором я имею честь редактировать данный документ. Для того, чтобы
проделать подобную вещь ничего не требуется, кроме самого Windows. Дл
большинства случаев процесс заполнения буфера и извлечения из него информации
сопровождается действиями оператора, но это можно сделать и автоматически.
Как показано ниже.
Возможность сохранения в буфере обмена разнородной информации, как то текстовые строки или растровые картинки , или что либо другое являетс весьма полезным свойством, так как Вам может потребоваться в приложении информация самого различного формата. Форматы, которые можно хранить в Clipboard стандартизированы. Существует целый набор функций, определяющих что за формат данных хранит Clipboard. CA-Visual Object 2.0 понимает только текстовый и растровый форматы.
Нет способов проверки, есть ли что-либо в буфере обмена данными, все процедуры по обмену данными будут сделаны вручную. В отличие от DDE, которое может поддерживать связь данных между двумя приложениями, если содержимое буфера изменится, Вы потеряете данные.
Вы также никогда не можете быть уверенным в том, что Вы получите, даже если содержимое буфера строка или растровое изображение - Windows никогда не фильтрует и не форматирует содержимое буфера. Другой недостаток буфера обмена - общий интерфейс с другими приложениями. Представьте себе следующую ситуацию:
METHOD Dispatch(oEvent) CLASS
ClipboardWindow
LOCAL nLoop
AS SHORTINT
LOCAL cString := "", cBuffer, cOldWord,
cOldExcel AS STRING
LOCAL oClip
AS Clipboard
LOCAL nSize
AS WORD
// Сперва проверим сообщение на время
IF oEvent:Message == WM_TIMER
// Потом нам нужно проверить формат
// Excel поддерживает форматы 1, 2, 3, 4,
5, 7, 8, 9, 14, 16
// Word поддерживает форматы 1, 3, 7, 14,
16
// Далее мы должны создать "маску" в цикле
по 16 позициям
// Если маска совпадает с маской Word или
Excel выдаем сообщения.
FOR nLoop := 1 UPTO
16
IF IsClipboardFormatAvailable(nLoop)
cString += "1"
ELSE
cString += "0"
ENDIF
NEXT
IF cString == EXCEL_MASK
oClip := Clipboard{}
nSize := oClip:GetItemSize(STRINGFORMAT)
cBuffer := oClip:RetrieveString(nSize)
IF cBuffer != cOldExcel .AND.
!Empty(cBuffer)
TextBox{,"EXCEL",cBuffer}:Show()
ENDIF
cOldExcel := cBuffer
oClip := NULL_OBJECT
ELSEIF cString == WORD_MASK
oClip := Clipboard{}
nSize := oClip:GetItemSize(STRINGFORMAT)
cBuffer := oClip:RetrieveString(nSize)
IF cBuffer != cOldWord .AND.
!Empty(cBuffer)
TextBox{,"WORD",cBuffer}:Show()
ENDIF
cOldWord := cBuffer
oClip := NULL_OBJECT
ENDIF
ENDIF
RETURN SUPER:Dispatch(oEvent)
Эта процедура также может обеспечить адекватную проверку ошибок, после некоторой доработки, особенно для листов Excel-таблицы. Вообще это есть достаточно уникальный случай - использование формата #4 (SYLK формат) Clipboard. К сожалению интерфейс Clipboard оставляет желать много лучшего.
DDE (Dynamic Data Exchange, использование IPC классов)
Dynamic Data Exchange, далее именуемая как DDE, позволяет пересылать данные и ключевые строки между двумя программами, это есть весьма значительный прогресс по сравнению с буфером обмена данными. В процессе пересылки данных фигурируют понятия DDE сервера и DDE клиента. Клиент запрашивает данные у сервера, сервер обрабатывает запросы и отсылает результаты этих запросов программе клиенту. Одно приложение может работать как клиент, так и как сервер, представляя двойственный обмен данными. Соединение между двумя приложениями называется "conversation" (разговор). Я его буду называть сеансом связи.
CA-Visual Objects поддерживает два вида связи между приложениями: "горячая" и "холодная" связи, и связь должна быть установлена перед любым сеансом работы. В случае горячей связи сервер будет автоматически посылать сообщени приложению клиенту любые актуальные данные последних изменений в сервере (изменение содержания клетки на странице Excel например); в случае холодной связи нет никакой автоматики - что запросили, то и получили.
В CA-Visual Objects механизм DDE реализован через IPC классы. Термин IPC ("Inter-Process Communication") достался в наследство от продукта фирмы CA CA-CommonView. Наверное это была операционная система, или что-то в этом духе, но не это главное, а главное то, что термин "Inter-Process Communication" наиболее приемлем для много платформенной архитектуры, в отличие от термина DEE, который характерен только для MS-Windows. Классы IPC присутствуют в обеих версиях CA-Visual Objects 1.0 и CA-Visual Objects 2.0. Однако перенос приложений, использующих IPC классы, из 16-разрядной архитектуры в 32-разрядную не столь тривиален как это может показаться с первого раза.
Наиболее важная концепция в DDE, которую стоит запомнить, - это возможность пересылки данных между двумя приложениями. DDE позволяет эффективно трансформировать данные между программами, которые в других случаях были бы не доступны. Формат вызовов стандартизирован. Это значит, что если приложение поддерживает DDE (неважно в каком качестве - клиента и/или сервера), то это дает возможность интегрировать приложение с другими программами, поддерживающими DDE. MS-Word и MS-Excel поддерживают спецификации клиента и сервера DDE, также как и CA-Visual Objects.
В мире нет ничего совершенного на 100%. Так и механизм DDE иногда весьма непредсказуем и при некоторых пересылках данных могут возникнуть исключительные ситуации. Однако эти ситуации поддаются обработке с выводом пользователю предупреждающих сообщений. DDE поддерживает множество различных протоколов обмена в одно и тоже время, поэтому Вы получаете достаточно гибкий механизм в свое распоряжение. Мне осталось пожелать Вам умело им воспользоваться.
Доступ к данным, используя ODBC
Большинство разработчиков считают эту технику настолько очевидной, что она не требует никаких дополнительных разъяснений. И действительно, настроил источник данных, и вперед стандартными SQL классами. Эта техника весьма полезна, когда Вы разделяете данные между несколькими процессами и относитс к типу интеграции данных. CA-Visual Objects поставляется вместе с драйверами для Excel 4 и Excel 5 и позволяет обмениваться данными между страницами книг Excel и Вашим приложением. К сожалению для работы необходим строгий формат в таблицах Excel, что не есть хорошо.
Механизм OLE (Object Linking and Embedding)
Object Linking and Embedding (OLE) - связь и внедрение объектов пришло
в мир Windows совсем недавно. OLE было создано Microsoft для более легкой
и мощной связи между Windows приложениями. Связь (Linking) означает возможность
внедрения в Ваше приложение объектов из других приложений.
Когда Вы используете OLE, Вы не помещаете код одного приложения в свое
(это было бы внедрением (Embedding)), но создаете некую вызывающую процедуру,
грубо говоря функцию на языке Visual Objects.
Гипотетическим примером этого могло бы служить внедрение Excel таблицы
или документа Word в Ваше приложение, в котором пользователь получил бы
доступ к меню, Toolbar и другим органам управления вызываемой программы.
Вы не хотите внедрять код чужого приложения в код Вышей программы, Вы просто
устанавливаете с ним связь.
OLE предоставляет Вам также возможность вызова кода объектов автоматизации, которые осуществляют более полный контроль над вызываемым приложением. В случае с DDE программа могла только использовать совместно данные, OLE позволяет нечто много большее.
В CA-Visual Objects 2.0 Вы можете связаться с OLE объектом, или внедрить его в свое приложение или форму (в DataWindow, например).
OLE автоматизация имеет небольшую разницу с тем, что обсуждалось выше (Object Linking and Embedding). Специфичным свойством для OLE автоматизации является то, что она работает с очень многими различными языками и продуктами, и подсоединяется к каждому, используя стандартную спецификацию. В отличие от DDE, которое основано на пересылке данных, OLE автоматизация позволяет программам контролировать данные также хорошо, как и код.
CA-Visual Objects 2.0 позволяет Вам создавать клиенты OLE автоматизации, которые будут вызывать сервера OLE автоматизации, такие как Microsoft Word и Excel. Через использование логики автоматизации "на лету" и "предопределенные" классы Вы можете легко управлять сервером автоматизации из Вашей CA-Visual Objects программы.
![]() |
![]() |