Технология DDE Что такое DDE ?

Динамический обмен данными, или DDE,обеспечивает простейший канал передачи сообщений между двумя программами ,работающими под управлением Windows. Канал DDE - это связь, служащая для передачи информации. Обычно по этому каналу передаётся текст, но некоторые программы могут передавать также графику. В Visual Basic for Application по каналу DDE может передаваться только текст или числа.

Во всех коммуникациях на базе DDE участвуют две программы: сервер DDE и клиент DDE. Сервер DDE - это программа , содержащая данные, которые необходимы программе-клиенту. Программа-клиент инициирует обмен по коммуникации на базе DDE , запросив данные от сервера. Обычно информация направляется от сервера к клиенту.

Однако существуют директивы DDE, позволяющие передавать данные и от клиента к серверу. Кроме того, данные, посылаемые серверу, могут быть директивами, которые указывают серверу на необходимость выполнить некоторые действия, например открыть файл.

Следует воздерживаться устанавливать двухстороннюю связь, система может зациклиться. Связи DDE работают в двух "температурных" режимах - горячем и холодном. Горячие связи DDE автоматически обновляют данные клиента при изменении связанных данных на сервере. Холодные связи обновляют данные только в том случае, когда серверу посылается директива DDERequest. Visual Basic for Application автоматически управляет только холодными связями. Горячие связи необходимо организовывать программным путём.

Применение DDE.

Чтобы использовать DDE , вначале нужно установить коммуникационный канал между двумя программами. Чтобы установить этот канал и определить, что будет по нему передаваться, потребуются 3 элемента информации: программа, тема и элемент. Значение этих 3 элементов зависит от той программы , с помощью которой вы пытаетесь осуществить коммуникацию, и используемых этой программой способов обработки данных.

Программа - это имя программы-сервера , с которой вы хотите связаться. Программы , подлежащие DDE, зарегистрированы в операционной системе Windows. Имя такой программы не обязательно является тем именем , которое отображается в окне Program Manager. Имена программ, зарегистрированных в системе Windows, приведены в табл.

Таблица. Зарегестрированые имена программ, поддерживающих DDE

Программа Зарегистрированное имя

Word for Windows WinWord

Excel Excel

Project Project

Access MSAccess

FoxPro FoxPro

Windows Program Manager ProgMan

Visual Basic for Windows имя_программы*

*Для интерпретированной программы имя_программы является именем окна Project этой программы ; для компилированной программы имя_программы - это имя исполняемого файла без расширения .EXE.

Тема - это имя документа , содержащего необходимые данные, а элемент - некий логический элемент этого документа . Для Excel тема - это имя таблицы, а элемент - область ячеек. Для программы на Visual Basic for Windows тема - это имя бланка, а элемент - элемент управления в этом бланке , содержащий необходимые данные . Для Word тема - это имя документа , а элемент - либо закладка , либо селектор Word Basic вроде \ StartOfDoc, указывающий на начало документа (Word Basic это встроенная в текущую версию Word средство программирования на Basic). Для получения перечня всех возможных тем и элементов обратитесь к документации на программу , которую вы хотите использовать, или посмотрите интерактивную подсказку данной программы.

Открытие коммуникационного канала DDE.

Чтобы открыть канал DDE с другой программой , эта программа в первую очередь должна быть запущена. Для запуска используйте операторы Shell и AppActivate. Будьте осторожны при использовании оператора Shell: эта команда запускает программу не синхронно и следующий оператор вашей программы может выполниться прежде , чем начнёт работать вторая программа. После команды Shell потребуется пауза , которая позволит пропустить время инициализации и старта указанной программы.

Для инициализации связи между двумя выполняющимися программами используется метод DDEIniate, который имеет следующий синтаксис:

канал = DDEInitiate(программа, тема)

Аргументы программа и тема являются строками. Чтобы определить, какие значения аргументов используются, обратитесь к документации на программу. Этот метод возвращает номер канала, используемый в других командах Visual Basic для идентификации данного коммуникационного канала. При выполнении метода устанавливается соединение DDE между Visual Basic for Applications и другой программой.

Закрытие канала DDE.

После завершения использования канала DDE его необходимо закрыть с помощью метода DDETerminate, имеющего следующий синтаксис:

DDETerminate(канал)

В данном случае канал - это номер канала, полученный от метода DDEInitiate.

Получение информации от сервера.

Чтобы запросить данные от сервера по открытому коммуникационному каналу, используется метод DDERequest, имеющий следующий синтаксис:

Переменная = DDERequest(канал, элемент)

Аргумент канал является номером канала , возвращённым методом DDEInitiate, а элемент указывает на определённую часть необходимых данных. Переменная представляет собой имя переменной, принимающей указанные данные. Эта переменная должна быть типа Variant.

В качестве примера создайте в Excel страницу диалога, которая использует DDE для получения строки текста из Word. В Word выделите предложение , укажите директиву Edit/Bookmark и назовите полученную закладку BookMark1. Затем переключитесь в Excel и запишите в модуле три приведённые ниже процедуры . Замените в этих процедурах ссылку на документ 26VBAOR.DOC ссылкой на один из ваших документов.

Option Explicit

Dim ChannelNum As Integer

Dim Results

‘Установление связи DDE с Word и получение предложения.

Sub OpenChannel()

‘Запуск Word и открытие документа 26VBAOR.DOC

‘Замените имя документа и путь на атрибуты одного из ваших документов

ChannelNum = DDEInitiate (“WinWord”, “I:\BHV_VBA\26BAOR.DOC”)

‘Отображение номера канала в диалоговом окне.

DialogSheets(“DDEDialog”).EditBoxes(“DDEChannelBox”).Text = _ChannelNum

End Sub

‘Получение данных.

Sub GetData()

Results = DDERequest (ChannelNum, “BookMark1”) ‘Запрос данных.

‘Отображение данных в диалоговом окне.

DialogSheets (“DDEDialog”). EditBoxes (“DDEDataBox”). Text = Results

End Sub

‘Закрытие связи.

Sub CloseChannel ( )

DDETerminate (ChannelNum)

End Sub

Создайте страницу диалога, назовите её DDEDialog; добавьте к ней три командные кнопки, две метки и два текстовых окна. Назовите текстовое окно, расположенное под меткой «Результат», DDEDataBox, а второе текстовое окно – DDEChannelBox. Для подключения командной кнопки “Открыть DDE” к процедуре OpenChannel, командной кнопки “Принять данные” – к процедуре GetData и командной кнопки “Закрыть DDE” – к процедуре CloseChannel используйте директиву Tools/Assign Macro.

На пиктографическом меню Forms нажмите пиктограмму Run Dialog, затем на бланке нажмите командную кнопку “Открыть DDE”. Нажатие этой кнопки инициирует выполнение процедуры OpenChannel, которая открывает канал к программе Word for Windows (WinWord), затем запрашивает документ 26BAOR.DOC и отображает номер канала в окне DDEChannelBox.

Нажатие командной кнопки “Принять данные” инициирует выполнение процедуры GetData, запрашивающей содержимое закладки BookMark1. Если текст закладки будет обнаружен, то он отобразится в окне DDEData.

С Для закрытия канала DDE нажмите командную кнопку “Закрыть DDE”.

Передача информации серверу.

Чтобы послать информацию серверу, используется метод DDEPoke. Этот метод имеет следующий синтаксис:

DDEPoke (канал, элемент, данные)

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

Для примера, добавьте процедуру, посылающую программе Word некоторый текст, который заменяет текст, маркированный как закладка BookMark1. Вначале добавьте к бланку командную кнопку “Послать данные”. Затем подключите эту кнопку к следующей процедуре:

‘Пересылка данных.

Sub PokeChannel ( )

‘Копирование данных из диалогового окна в ячейку таблицы.

Sheets (“Sheet1”). Cells(1, 1). Formula = _

DialogSheets(“DDEDialog”) . EditBoxes(“DDEDataBox”). Text

‘Создание ссылки на ячейку таблицы.

Set Result = Sheets(“Sheet1”). Cells(1, 1)

‘Пересылка ссылки на ячейку связанной программе для замены текста, маркированного как

‘BookMark1.

Application.DDEPoke ChannelNum, “BookMark1”, Result

End Sub

На пиктографическом меню Forms нажмите пиктограмму Run Dialog, затем на бланке нажмите командную кнопку “Открыть DDE” для подключения к Word. Для копирования текущего содержимого закладки BookMark1 в текстовое окно “Результат” нажмите командную кнопку “Принять данные”. В верхней части экрана расположено окно Word for Windows , на котором видна строка текста, маркированная как BookMark1. В нижней части экрана расположено окно Excel с диалоговым окном “Тестер DDE ” , на котором в текстовом окне “Результат” виден тот же текст.

Теперь текст находящийся в приемном окне "Результат" можно редактировать. Чтобы этот отредактированный текст заменилзаменил собой текст , маркированый как BookMark1 ,нажмите кнопку "Послать данные".

Процедура PokeChannel1 сначала копирует содержимое текстового окна в ячейку А1 таблицы Sheet1 . Затем это значение загружается как объект в переменную Result. Запомните , что метод DDEPoke должен должен получить в качестве в качестве аргумента не строку , а ссылку на область ячеек , содержащих этот текст . Затем метод DDEPoke передаёт этот текст в Word , где он заменяет собой текст , маркированный как BookMark1 . Для закрытия связи нажмите командную кнопку "Закрыть DDE".

Передача директив серверу.

Кроме передачи программе некотрох данных , связь DDE позволяет предать и директивы. Дитективы , которые вы хотите передать прогремме , должны быть на командном языке той программы , которой вы их передаёте.

Чтобы передать директивы подключённой программе , используется метод DDEExecute , имеющий следующий синтаксис :

DDEExecute ( канал , командная_строка)

Аргумент канал является номером канала DDE , а аргумент командная_строка - строкой, содержащей директиву для подключенной программы.

Перешлите программе Word директиву File/Print Preveiw. Для этого добавьте кдиалоговому окну "Тестер DDE" командную кнопку "ПредПросмотр" и подключите ее к следующей процедуре:

Sub PreveiwIt ()

' Пересылка связанной програме директивы предварительного просмотра.

DDExecute ChannelNum , "[FilePrintPreview]"

End Sub.

Обратите внимание на то , что директива FilePrintPreview заключена в квадратные скобки . Если вы опустите скобки , то Word вставит эту директиву как текст в точку вставки а не выполнит её как директиву.

Технология OLE

OLE имеет значительно больше возможностей, чем DDE. Если DDE просто обеспечивает обмен данными между программами, то OLE позволяет передавать объекты. Существуют 2 различных типа OLE: Linking and Embedding (Связь и внедрение) и OLE Automation(Автоматизация OLE).

С помощью Linking and Embedding вы внедряете объекты одной программы в документы другой. Внедряемые объекты создаются копированием объекта в одной программе, а затем вклеиванием связи с этим объектом в другую программу. После этого объект можно редактировать в породившей его программе. Программа, отображая внедренный объект, не должна ничего знать о том, как он создается и ли изменяется, - она только отображает этот объект.

OLE Automation позволяет одному объекту управлять другой программой посредством доступа к ее объектам и методам. При использовании OLE Automation Объекты и методы подключенной программы становятся расширением языка Visual Basic.

Применение OLE Automation

Прежде чем использовать объекты и методы другой программы, вы должны все узнать об этих объектах. Если данная программа содержит библиотеку объектов, зарегистрированную в системе и доступную, вы можете использовать Object Browser для ознакомления с объектами и методами, включенными в эту библиотеку. Если программа не разрешает доступ к библиотеке, то вы должны обратится к документации на программу - чтобы ознакомится с доступными объектами и методами. Для получения объектов программы с помощью Object Browser необходимо зарегистрировать эту программу в Excell. Вначале укажите директиву Tools/ References для отображения диалогового окна References. Затем включите контрольный индикатор, соответствующий данной программе, в окне списка Avalaible References. После того, как программа зарегистрирована, все ее объекты становятся доступными Visual Basic.

Теперь вы можете использовать Object Browser для изучения объектов другой программы. Кроме того, Object Browser отображает имя, под которым зарегестрирована в системе данная программа.

Предупреждение

Имя, используемое в целях регистрации программы для коммуникаций OLE, отличается от имени используемого для DDE. Это объясняется тем, что связывается OLE с программой, а DDE - с объектами из библиотеки ee oбъектов.

Объекты другой программы могут иметь те же имена, что и объекты в вашей программе; следовательно, для доступа надежнее пользоваться полными именами. Например если вы запустите MS Excell VBA и выполните оператор APPlication.Name

то получите имя Excell. Но если вы выполните оператор

Msproject. APPlication.Name

то получите имя Project.

Для доступа к любому объекту, находящемуся вне текущей программы, используете полную ссылку, что не только даст возможность уверенно получить нужный объект, но и повысить читабельность вашей программы.

Создание и открытие объектов.

Для программ, управляемых посредством OLE Automation , существуют 2 метода создания новых объектов или открытия уже существующих объектов: Createobject() и GetObject(). В общем случае объектами, к которым вы получаете доступ с помощью указанных методов, являются документы подключенных программ. Для полностью OLE - согласованных программ, таких как Excell, открытие или создание новых файлов осуществляется методами связанных объектов а не методами Create object() и GetObject(). Для частично OLE - согласованных программ вроде Word создание связей с документами обеспечивается с помощью методов.

Метод Createobject имеет синтаксис

Set объектная_переменная = Createobject(класс)

где объектная_переменная представляет собой любую переменную типa Object или Variant, а класс является классом создаваемого объекта. Аргумент класс состоит из двух частей, разделенных точкой:

Регистрационное_Имя.Объект

где Регистрационное_Имя - имя под которым программа зарегестрирована в системе, а Объект - тип создаваемого объекта. Для Excell тип объекта может принимать значения Application, Sheets и Charts, для Word - Basic.

Так следующий оператор запускает Excell и создает новую таблицу:

Set Xlsheet = createObject(«Excell.Sheet»)

Если Excell уже запущен и рабочая папка уже открыта, то оператор добавит новую таблицу к открытой рабочей папке. Если Excell не запущен, то оператор запускает Excell с новой рабочей папкой.

Следующий оператор запускает Word и возвращает объект, на который можно ссылаться как на Word Basic:

Set WordSheet = createObject(«Word.Basic»)

Примечание:

Поскольку программа Word не полностью OLE - согласованна, то ссылкой является Word Basic, а не конкретный документ. Word Basic встроен в Word средством программирования на . Большинство директив Word Basic доступны связанной программе. Эти директивы пересылаются программе Word как методы объекта Word Basic. Фактически Word интерпретирует эти директивы, применяя их к текущему документу как к объекту.

Метод GetObject открывает существующий объект. Метод имеет синтаксис:

Set объектная_переменная = GetObject(Имя_файла,класс)

где объектная_переменная и класс имеют те же значения что и для метода. Имя_файла - путь и имя файла для открытия объекта. Если расширение файла позволяет определить класс объекта, то аргумент класс можно опустить. Метод не запускает программу если она не запущена на момент выполнения метода.

Например следующий оператор открывает таблицу COST.XLS в директории PROJ диска D:

Set Xlsheet = GetObject(«D:\PROJ\COST.XLS», «Excell.Sheet»)

Примечание :

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

Примечание :

Поскольку связи OLE подвержены ошибкам, вы должны уметь определять, какая из процедур обработки ошибок необходима для предотвращения вашей программы из-за ошибок связи OLE. Процедура обработки ошибок может попробовать повторно установить связь или завершить процедуру - в зависимости от того, какая директива явилась причиной ошибки. Если вы попытаетесь установить связь повторно, то используйте счетчик, который позволит избежать зацикливания.

Наши рекомендации