
- •Разработка приложения с обработкой списков.
- •Компонент tListBox
- •Combo Box - комбинированная строка ввода
- •Использование компонента tListBox
- •Использование компонента tComboBox
- •Графика в Делфи
- •Приложение Задание1. Заставка. Порядок выполнения
- •Пример создания заставки
- •Задание 2. Анимация иллюстрация вращения луны вокруг Земли. Порядок выполнения
- •Задание 3. Диаграмма. Порядок выполнения
- •Разработка приложения с обработкой исключительных ситуаций
- •Лабораторная работа №5.
- •Стандартные компоненты для использования dde и ole в Delphi
- •Динамический обмен данными — dde
- •Внедрение и связывание объектов — ole
- •Технология com
- •Технология сом
- •Разработка справочной системы
- •Общие сведения о справочной системе
- •Создание текстовых файлов справочной системы
- •Создание проекта справочной системы
- •Создание файла содержания справочной системы
- •Прикрепление справочной системы к программе
- •Список литературы Основная
- •Дополнительная
Стандартные компоненты для использования dde и ole в Delphi
Цель работы:
Реализация в Delphi обмена данными между приложениями.
Порядок выполнения работы:
Используя теоретические сведения, разработать приложение, в котором реализуется обмен данными между приложениями Delphi и Excel, выполняя указанные ниже задания.
Проверить правильность работы программы по ранее составленному набору тестов.
Оформить отчет.
Содержание отчета:
Отлаженная программа со всеми необходимыми комментариями.
Набор тестов, выполнение которых подтверждено копиями выходных документов.
В результате выполнения лабораторной работы студент должен продемонстрировать преподавателю готовый проект, файл формы и исходный код модуля.
Примечание: домашние и/или лабораторные задания предъявляются в указанный срок в виде отчета и оцениваются. При неготовности в срок выставляется неудовлетворительная оценка, которая не может быть исправлена. Работа оценивается по защите отчета. К отчету должен быть приложен файл со всеми разработанными программами, процедурами, главной программой и модулем. Все предъявляемые программы должны быть работоспособными. Защита не может состояться как без наличия отчета, так и файла. Отчет и файл должен быть сохранен до экзамена. Все текущие оценки учитываются при определении формы и содержания экзамена студента.
Теоретические сведения
Динамический обмен данными — dde
Общие сведения
Динамический обмен данными (Dinamical Data Exchange — DDE) — это технология, появившаяся на заре Windows, но сохраняющая свое значение до сих пор, поскольку предоставляет удобный способ обмена данными между программами. В этом диалоге программ одна, инициирующая диалог, называется клиентом, а другая, отвечающая на сообщения клиента — сервером. Диалог ведется на заданную тему (topic). Данные, передаваемые от одной программы к другой, называются элементами данных (items). В диалоге могут также передаваться серверу некоторые команды — макросы (macros). Этих основных понятий: клиент, сервер, тема, элемент данных в макрос достаточно, чтобы строить приложения, основанные на DDE. Всю сложную задачу обработки в процессе диалога множества сообщений Windows берет на себя Delphi, инкапсулируя все необходимые процедуры в четырех компонентах, расположенных в библиотеке на странице System: DdeClientConv, DdeClientltem, DdeServerConv и DdeServerltem. Первые два из них организуют работу клиента, а два вторые — работу сервера.
Основным компонентом, организующим взаимодействие, является компонент клиента DdeClientConv. Соответствующий ему компонент сервера DdeServerConv играет пассивную роль, сообщая только тему, которую может поддерживать сервер. Компоненты DdeClientltem и DdeServerltem нужны только для обмена информацией о конкретных элементах данных.
Взаимодействие DDE может выполнять следующие операции:
Передача клиенту данных от сервера по инициативе клиента
Передача клиенту данных от сервера при их обновлении
Передача данных от клиента к серверу
Передача команд (макросов) от клиента к серверу
Установка клиентом данных на сервере
В последующих разделах будут рассмотрены способы решения каждой из этих задач.
Установление контакта с сервером
Начнем рассмотрение с компонента 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, устанавливая контакт с заранее неизвестным сервером.