Урок 12 DDE
У цій статті наведено основні факти про DDEML і показує, як можна використовувати DDE у програмі. Предмет цієї статті технічно складний, проте бібліотека Delphi спрощує найважчі аспекти програмування DDE.
У статті передбачається, що читач може знати мало про предмет. Мета статті - навчити його використовувати концепцію DDE для створення додатків у середовищі Delphi.
Основи DDE
Абревіатура DDEML означає Dynamic Data Exchange Management Library (бібліотека управління динамічним обміном даними). DDEML це надбудова над складною системою повідомлень, яка називається Dynamic Data Exchange (DDE). Бібліотека, що містить DDE була розроблена для посилення можливостей початкової системи повідомлень Windows.
DDE дає можливість перейти через рамки програми та взаємодіяти з іншими програмами та системами Windows.
Dynamic Data Exchange отримало своє ім'я тому, що дозволяє двом програмам обмінюватися даними (текстовими, через глобальну пам'ять) динамічно під час виконання. Зв'язок між двома програмами можна встановити таким чином, що зміни в одному додатку відображатимуться в другому. Наприклад, якщо ви змінюєте число в електронній таблиці, то у другому додатку дані оновляться автоматично та відобразять зміни. Крім того, за допомогою DDE можна зі своєї програми керувати іншими програмами такими, як Word for Windows, Report Smith, Excel та ін.
Сподіваюся, що цей короткий вступ допоможе зрозуміти, що предмет обговорення становить інтерес. Далі розповідається, як використовувати компоненти Delphi для побудови програм DDE.
Використання DDE
Програма, яка отримує дані з іншої програми за DDE та/або керує іншою програмою за допомогоюкоманд через DDE є DDE-клієнтом. У цьому випадку друга програма є DDE-сервером. Один і той же додаток може бути одночасно і сервером, і клієнтом (наприклад, MicroSoft Word). Побудову DDE-серверів та DDE-клієнтів зручно розглянути на прикладі, що поставляється з Delphi (каталог x:\delphi\demos\ddedemo). Спочатку розглянемо логіку роботи прикладу. Для початку потрібно відкомпілювати проекти DDESRVR.DPR та DDECLI.DPR, після цього запустіть програму DDECLI.EXE (DDE-клієнт) та виберіть пункт меню FileNew Link. При цьому має запуститись програма DDESRVR (DDE-сервер). Якщо тепер редагувати текст у вікні сервера, то зміни миттєво відобразяться у додатку-клієнті (див. рис.1, рис.2)
Рис.1: Додаток – DDE-сервер. Тут іде редагування тексту.
Рис.2: Додаток – DDE-клієнт. Тут відображаються зміни.
Приклад демонструє інші можливості DDE: - пересилання даних із клієнта на сервер (Poke Data); наберіть будь-який текст у правому вікні DDE-клієнта та натисніть кнопку Poke Data, цей текст з'явиться у вікні сервера. - Виконання команд (макросів) на сервері; наберіть будь-який текст у правому вікні DDE-клієнта та натисніть кнопку Exec Macro, DDE-сервер видасть відповідне діалогове вікно. - встановлення зв'язку через Clipboard; закрийте обидва DDE-програми та запустіть їх заново, потім у DDE-сервері виберіть пункт меню EditCopy, далі в клієнті виберіть пункт меню EditPaste Link.
Тепер давайте розглянемо ці демонстраційні програми з технічної точки зору та дізнаємося, яким чином у Delphi можна створити DDE-додатки. Почнемо із DDE-сервера.
DDE-сервери
На рис.3 представлений приклад DDE-сервера під час дизайну серед Delphi.
Рис.3: DDE-сервер серед Delphi.
Для побудови DDE-сервера в Delphiє два об'єкти, розташовані на сторінці System Панелі Компонент - TDdeServerConv і TDdeServerItem. Зазвичай у проекті використовується один об'єкт TDdeServerConv і один або більше TDdeServerItem. Для отримання доступу до сервісу DDE-сервера, клієнту потрібно знати кілька параметрів: ім'я сервісу (Service Name) - це ім'я програми (зазвичай - ім'я файлу, що виконується без розширення EXE, можливе з повним шляхом); Topic Name - у Delphi це ім'я компоненти TDdeServerConv; Item Name - у Delphi це ім'я потрібної компоненти TDdeServerItem.
Призначення об'єкта TDdeServerConv – загальне управління DDE та обробка запитів від клієнтів на виконання макросу. Останнє виконується в обробнику події OnExecuteMacro, наприклад, як це зроблено у нашому випадку:
Об'єкт TDdeServerItem зв'язується з TDdeServerConv і визначає, що, власне, пересилатиметься DDE. Для цього він має властивості Text і Lines. (Text має те саме значення, що і Lines[0].) При зміні значення цих властивостей автоматично відбувається пересилання оновлених даних у всі додатки-клієнти, що встановили зв'язок із сервером. У нашому додатку зміна значення властивості Lines відбувається в обробнику події OnChange компонента Edit1:
Цей компонент відповідає за отримання даних від клієнта, в нашому прикладі це відбувалося при натисканні кнопки Poke Data, це виконується в обробнику події OnPokeData:
І останнє – встановлення зв'язку через Clipboard. Для цього служить метод CopyToClipboard об'єкта TDdeServerItem. Необхідна інформація міститься в Clipboard і може бути викликана з програми-клієнта під час встановлення зв'язку. Зазвичай у DDE-серверах для цього є спеціальний пункт меню Paste Special або Paste Link.
Отже, ми розглянули приклад повнофункціонального DDE-сервера, побудованого за допомогою компонентів Delphi. Дуже часто існуючі DDE-сервери не повністю реалізують можливості DDE та надають лише частину сервісу. Наприклад, ReportSmith дозволяє DDE тільки виконувати команди (макроси).
DDE-клієнти
На рис.4 представлений приклад DDE-клієнта під час дизайну серед Delphi.
Рис.4: DDE-клієнт серед Delphi.
Для побудови DDE-клієнта Delphi використовуються два компоненти TDDEClientConv і TDDEClientItem. Аналогічно серверу, у програмі зазвичай використовується один об'єкт TDDEClientConv і один і більше пов'язаних з ним TDDEClientItem.
TDDEClientConv служить для встановлення зв'язку із сервером та загальним управлінням DDE-зв'язком. Встановити зв'язок із DDE-сервером можна як під час дизайну, так і під час виконання програми, причому двома способами. Перший спосіб – заповнити вручну необхідні властивості компонента. Це DdeService, DdeTopic та ServiceApplication. Під час дизайну клацніть двічі на одну з перших двох властивостей Інспектора Об'єктів - Ви отримаєте діалог для визначення DDE-зв'язку (див. рис.5).
Рис.5: Діалог для встановлення зв'язку з DDE-сервером (Report Smith).
Вкажіть у діалозі імена DDE Service та DDE Topic. Ці імена можна дізнатися з документації того DDE-серверу, з яким Ви працюєте. У разі DDE-сервера, створеного на Delphi, це ім'я програми (без .EXE) та ім'я об'єкта TDdeServerConv. Для встановлення зв'язку через Clipboard у діалозі є спеціальна кнопка Past Link. Їй можна скористатися, якщо Ви запустили DDE-сервер, якось зберегли інформацію про зв'язок і увійшли в цей діалог. Наприклад, якщо DDE-сервер є DataBase Desktop, то потрібно завантажити в нього якусь таблицю Paradox, вибрати будь-яке поле і вибрати пункт меню EditCopy. Після цього увійдітьу діалоговому вікні та натисніть кнопку Paste Link. Поля у діалозі заповняться відповідним чином.
Властивість ServiceApplication заповнюється в тому випадку, якщо поле DDEService містить ім'я, відмінне від імені програми, або якщо ця програма не знаходиться в поточній директорії. У цьому полі вказується повний шлях та ім'я програми без розширення (.EXE). Під час роботи з Report Smith тут потрібно вказати, наприклад: C:\RPTSMITH\RPTSMITH
Ця інформація потрібна для автоматичного запуску сервера під час встановлення зв'язку з DDE, якщо той ще не був запущений.
У нашій демо-програмі зв'язок встановлюється під час виконання програми у пунктах меню FileNew Link та EditPaste Link. У пункті меню FileNew Link програмно встановлюється зв'язок по DDE за допомогою відповідного методу об'єкта TDdeServerConv, OpenLink робити не треба, оскільки властивість ConnectMode має значення ddeAutomatic:
Тут же заповнюються властивості об'єкта TDdeClietItem.
У пункті меню EditPast Link програмно встановлюється зв'язок із DDE з використанням інформації з Clipboard:
Після того, як встановлений зв'язок, потрібно подбати про дані, що надходять за DDE, це робиться в обробнику події OnChange об'єкта TDdeClietItem:
Це єдине завдання об'єкта TDdeClientItem.
На об'єкт TDdeClientConv покладаються ще дві задачі: пересилання даних на сервер та виконання макросів. Для цього цей об'єкт має відповідні методи. Побачимо, як це можна було б зробити. Виконання макросу на сервері:
Пересилання даних на сервер:
Управління ReportSmith з DDE
У прикладному прикладі run-time версія ReportSmith виконує команду, передану DDE. Імена DDE сервісу для ReportSmith та деяких інших програм можна дізнатися у Довіднику всередовище ReportSmith.
Перед запуском прикладу потрібно правильно встановити у властивості ServiceApplication шлях до run-time версії ReportSmith та у тексті програми у рядку