Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мет_указ_лр_ПИ_б3.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.8 Mб
Скачать

Стандартные компоненты для использования dde и ole в Delphi

Цель работы:

Реализация в Delphi обмена данными между приложениями.

Порядок выполнения работы:

  1. Используя теоретические сведения, разработать приложение, в котором реализуется обмен данными между приложениями Delphi и Excel, выполняя указанные ниже задания.

  2. Проверить правильность работы программы по ранее составленному набору тестов.

  3. Оформить отчет.

Содержание отчета:

  1. Отлаженная программа со всеми необходимыми комментариями.

  2. Набор тестов, выполнение которых подтверждено копиями выходных документов.

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

Примечание: домашние и/или лабораторные задания предъявляются в указанный срок в виде отчета и оцениваются. При неготовности в срок выставляется неудовлетворительная оценка, которая не может быть исправлена. Работа оценивается по защите отчета. К отчету должен быть приложен файл со всеми разработанными программами, процедурами, главной программой и модулем. Все предъявляемые программы должны быть работоспособными. Защита не может состояться как без наличия отчета, так и файла. Отчет и файл должен быть сохранен до экзамена. Все текущие оценки учитываются при определении формы и содержания экзамена студента.

Теоретические сведения

Динамический обмен данными — dde

Общие сведения

Динамический обмен данными (Dinamical Data Exchange — DDE) — это технология, появившаяся на заре Windows, но сохраняющая свое значение до сих пор, поскольку предоставляет удобный способ обмена данными между программами. В этом диалоге программ одна, инициирующая диалог, называется клиентом, а другая, отвечающая на сообщения клиента — сервером. Диалог ведется на заданную тему (topic). Данные, передаваемые от одной программы к другой, называются элементами данных (items). В диалоге могут также передаваться серверу некоторые команды — макросы (macros). Этих основных понятий: клиент, сервер, тема, элемент данных в макрос достаточно, чтобы строить приложения, основанные на DDE. Всю сложную задачу обработки в процессе диалога множества сообщений Windows берет на себя Delphi, инкапсулируя все необходимые процедуры в четырех компонентах, расположенных в библиотеке на странице System: DdeClientConv, DdeClientltem, DdeServerConv и DdeServerltem. Первые два из них организуют работу клиента, а два вторые — работу сервера.

Основным компонентом, организующим взаимодействие, является компонент клиента DdeClientConv. Соответствующий ему компонент сервера DdeServerConv играет пассивную роль, сообщая только тему, которую может поддерживать сервер. Компоненты DdeClientltem и DdeServerltem нужны только для обмена информацией о конкретных элементах данных.

Взаимодействие DDE может выполнять следующие операции:

    1. Передача клиенту данных от сервера по инициативе клиента

    2. Передача клиенту данных от сервера при их обновлении

    3. Передача данных от клиента к серверу

    4. Передача команд (макросов) от клиента к серверу

    5. Установка клиентом данных на сервере

В последующих разделах будут рассмотрены способы решения каждой из этих задач.

Установление контакта с сервером

Начнем рассмотрение с компонента DdeServerConv, который располагается на форме приложения-сер в ер а. Его единственное свойство — имя Name, Это имя является именем темы. Его должен знать клиент при установлении контакта с сервером. Некоторые методы компонента DdeServerConv мы рассмотрим позднее в следующем разделе, а теперь обратимся к компоненту DdeClientConv, который располагается на форме приложения-клиента и обеспечивает установление и разрыв контакта с сервером. Два свойства компонента DdeClientConv DdcService и DdeTopic определяют имена сервера и темы, соответствующих намеченному контакту. Имя сервера — это имя приложения-сервера, а имя темы — имя одного из компонентов DdeServerConv, расположенных на сервере. В процессе проектирования эти свойства задавать не обязательно, поскольку они могут быть установлены во время выполнения методом SetLink. Этот метод описан следующим образом:

Function SetLink(Service:string;Topic:string):Boolean;

Параметры метода Service и Topic устанавливают соответственно значения свойств DdeService и DdeTopic. Установить значения этих свойств во время выполнения прямым присваиванием невозможно.

Способ установления контакта с сервером во время выполнения зависит от значения свойства ConnectMode, определяющего режим соединения. Это свойство может иметь значение ddeManual — ручной или ddeAutomatic — автоматический. При автоматическом режиме SetLink не только задает значения DdeService и DdeTopic, но и устанавливает сам контакт. При ручном режиме метод SetLink после установки значений DdeService и DdeTopic очищает элементы от прошлой информации, но самого соединения не устанавливает. Контакт с сервером в этом случае должен устанавливаться методом OpenLink, не имеющим параметров.

Если в момент попытки установить контакт сервер запущен, то контакт устанавливается описанными выше методами. Если это не удается, то делается попытка запустить программу, путь и имя которой указаны в свойстве Service Application.

Если в этом свойстве ничего не указано или запуск не удался, то метод OpenLink возвращает false. Закрыть контакт с сервером можно методом CloseLink. Этот метод разрывает связь с сервером и очищает значения свойств DdeService и DdeTopic.

Исходя из сказанного выше, наиболее простой способ установления связи вашего приложения с сервером (если приложение будет обмениваться информацией только с одним сервером) заключается в следующем. Во время проектирования надо установить требуемые значения свойств DdeService и DdeTopic, а затем задать свойство ConnectMode = dde Automatic. Если сервер в данный момент запущен или он доступен, то с сервером установится связь. Доступность в данном случае означает, что выполняемый файл сервера находится в том нее каталоге, в котором находится ваше приложение, или в свойстве Service Application указан выполняемый файл сервера с полным путем к нему и с указанием типа файла (расширения). В этом случае свойство ConnectMode сможет установиться в ddeAutomatic, в противном случае вам будет выдано предупреждение о невозможности контакта.

Если все прошло нормально, то в дальнейшем при выполнении приложения связь с сервером будет устанавливаться автоматически. Если в момент запуска приложения сервер уже запущен, контакт установится сразу. Если же сервер не запущен к моменту запуска вашего приложения, но его выполняемый файл доступен для приложения (в указанном выше смысле), то сервер автоматически запустится и с ним будет установлен контакт. В обоих случаях вам не надо будет заботиться о контакте, т.е. не надо будет применять методы SetLink или OpenLink.

Если указанные выше условия не выполнены, т.е. сервер не запущен ни заранее, ни в момент запуска вашего приложения, то даже, если он потом будет запущен, перед установлением контакта с ним вам потребуется применить метод SetLink. Дело в том, что в этих условиях установленные при проектировании значения свойств DdeService и DdeTopic стираются, а повторно установить их можно только методом SetLink. To же самое надо иметь в виду, если вы в своем приложении закрыли соединение с сервером методом CloseLmk или установили связь с другим сервером. После этого контакт прервется и его надо восстанавливать методом SetLink.

Если свойство ConnectMode компонента установлено в ddeManual, но в процессе проектирования вы установили свойства DdeService и DdeTopic, то для установления контакта вам достаточно выполнить метод OpenLink. Если же DdeService и DdeTopic не установлены или в процессе работы приложения вы хотите переключаться на связь с другими серверами, то прежде, чем начать работать с сервером, надо выполнить метод SetLink. устанавливающий имена сервера и темы. Если при этом ConnectMode = dde Automatic, то автоматически устанавливается контакт с сервером. Если же ComiectMode = ddeManual, то для установления контакта после SetLink надо применить метод OpenLink.

Таким образом правила установления контакта с сервером доступным или уже запущенным к момент запуска приложения можно представить следующей таблицей.

ConnectMode

DdeService и DdeTopic

Контакт

ddeAutomatic

Установлены при проектировании

Автоматический

Не установлены при проектировании, или изменены, или контакт был прерван

SetLink

ddeManual

Установлены при проектировании

OpenLink

Не установлены при проектировании, или изменены, или контакт был прерван

SetLink

OpenLink

Приведем несколько примеров. Пусть ваше приложение будет обмениваться информацией только с одним заранее известным сервером и путь вы хотите в приложении иметь кнопку (назовем ее BExchange), при щелчке на которой вы хотите выполнить какие-то операторы обмена данными с сервером. Вы должны разместить на своем приложении компонент DdeClientConv (назовем его DdeClientConvl) и эту кнопку.

Далее наиболее простой путь заключается в следующем. Вы устанавливаете в DdeClientConvl требуемые значения свойств DdeService и DdcTopic, а затем задаете свойство ConnectMode равным ddeAutomatic. Тогда в обработчике события OnClick кнопки BExchange вам достаточно просто написать операторы обмена данными с сервером.

Если по каким-то причинам во время проектирования сервер вам не доступен, то, задав при проектировании требуемые значения свойств DdeService и DdeTopic, вы оставляете свойство ConnectMode, равным ddeManual. В этом случае, например, в обработчике события формы OnCreate вы можете поместить оператор

if not DdeClientConvl.OpenLink then

ShowMessage('Нет контакта с сервером "'

+ DdeClientConvl.DdeService + '" по теме "'

+ DdeClientConvl.DdeTopic + '"' );

Этот оператор обеспечит контакт с сервером в момент запуска приложения или соответствующее сообщение об ошибке. Другой путь — поместить в обработчик события OnClick кнопки BExchange операторы

DdeClientConvl.setLink(sServer, sTopic);

if not DdeClientConvl.OpenLink then

+ DdeClientConvl.DdeService + '" по теме "'

+ DdeClientConvl.DdeTopic + '"');

< операторы обмена данными с сервером >

В этих операторах предполагается, что параметры sServer и sTopic содержат соответственно имя сервера И имя темы. Отметим, что в этом случае нельзя ограничиться только вторым оператором OpenLink. Дело в том, что в первый раз он сработает нормально. Но при последующих щелчках на кнопке BExchange он будет выдавать ошибки, поскольку метод OpenLink возвращает false не только в случае невозможности связаться с сервером, но и в случаях, когда контакт в данный момент уже установлен. Впрочем, это относится только к возвращаемой величине.

Если сообщения об ошибках вас не интересуют, то вы можете существенно сократить приведенный код:

DdeClientConvl.OpenLinR;

< операторы обмена данными с сервером >

Аналогичное приведенному ранее последовательное обращение к методам SctLink и OpenLink надо применять и в приложениях, работающих с несколькими разными серверами с помощью одного компонента DdeCHentConv. Такое же обращение используется и в случае, если вы не устанавливали в процессе проектирования свойства DdeService и DdeTopic.

Все сказанное ранее относилось к установлению контакта с определенным сервером по определенной теме. Но имеется еще одна возможность — установление контакта с заранее неизвестным сервером, который поместил информацию о себе в буфер обмена Clipboard. Приложение-сервер, разработанное с помощью Delphi, может сделать это методом СоруТоClipboard компонента DdeServerltem. Чтобы установить контакт со стороны клиента с сервером, поместившим информацию в буфер обмена, надо выполнить метод PasteLink компонента DdeCHentConv. Например:

if (not DdeClientConvl.PasteLink} then

ShowMessage('В буфере обмена не обнаружено данных, ' + 'доступных обработке.');

Если в буфере обмена есть соответствующие данные, то метод PasteLink занесет имена сервера и темы в свойства DdeService и DdeTopic и установит контакт с этим сервером. Таким образом, этот метод заменяет рассмотренные ранее методы SetLink и OpenLink, устанавливая контакт с заранее неизвестным сервером.