На
рис.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, например, как это
сделано в нашем случае:
procedure
TDdeSrvrForm.doMacro(Sender: TObject;
Msg: TStrings);
var
Text: string;
begin
Text := '';
if Msg.Count > 0 then
Text := Msg.Strings[0];
MessageDlg ('Executing
Macro - ' + Text, mtInformation,
[mbOK], 0);
end;
Объект
TDdeServerItem связывается с
TDdeServerConv и определяет, что,
собственно, будет
пересылаться по DDE. Для
этого у него есть свойства
Text и Lines. (Text имеет то же
значение, что и Lines[0].) При
изменении значения этих
свойств автоматически
происходит пересылка
обновленных данных во все
приложения-клиенты,
установившие связь с
сервером. В нашем
приложении изменение
значения свойства Lines
происходит в обработчике
события OnChange компонента
Edit1:
procedure
TDdeSrvrForm.doOnChange(Sender: TObject);
begin
if not FInPoke then
DdeTestItem.Lines :=
Edit1.Lines;
end;
Этот
же компонент отвечает за
получение данных от
клиента, в нашем примере
это происходило при
нажатии кнопки Poke Data, это
выполняется в обработчике
события OnPokeData:
procedure
TDdeSrvrForm.doOnPoke(Sender: TObject);
begin
FInPoke := True;
Edit1.Lines :=
DdeTestItem.Lines;
FInPoke := False;
end;
И
последнее - установление
связи через Clipboard. Для
этого служит метод
CopyToClipboard объекта TDdeServerItem.
Необходимая информации
помещается в Clipboard и может
быть вызвана из
приложения-клиента при
установлении связи.
Обычно, в DDE-серверах для
этого есть специальный
пункт меню Paste Special или Paste
Link.
Итак,
мы рассмотрели пример
полнофункционального
DDE-сервера, построенного с
помощью компонент Delphi.
Очень часто существующие
DDE-серверы не полностью
реализуют возможности DDE и
предоставляют только
часть сервиса. Например,
ReportSmith позволяет по 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,
выбрать любое поле и
выбрать пункт меню Edit|Copy.
После этого войдите в
диалог и нажмите кнопку Paste
Link. Поля в диалоге
заполнятся
соответствующим образом.
Свойство
ServiceApplication заполняется в
том случае, если в поле
DDEService содержится имя,
отличное от имени
программы, либо если эта
программа не находится в
текущей директории. В этом
поле указывается полный
путь и имя программы без
расширения (.EXE). При работе
с Report Smith здесь нужно
указать, например : C:\RPTSMITH\RPTSMITH
Данная
информация нужна для
автоматического запуска
сервера при установлении
связи по DDE, если тот еще не
был запущен.
В
нашей демо-программе связь
устанавливается во время
выполнения программы в
пунктах меню File|New Link и
Edit|Paste Link. В пункте меню
File|New Link программно
устанавливается связь по
DDE с помощью
соответствующего метода
объекта TDdeServerConv, OpenLink
делать не надо, поскольку
свойство ConnectMode имеет
значение ddeAutomatic:
procedure
TFormD.doNewLink(Sender: TObject);
begin
DdeClient.SetLink(AppName.Text,
TopicName.Text);
DdeClientItem.DdeConv :=
DdeClient;
DdeClientItem.DdeItem :=
ItemName.Text;
end;
Здесь
же заполняются свойства
объекта TDdeClietItem.
В
пункте меню Edit|Past Link
программно
устанавливается связь по
DDE с использованием
информации из Clipboard:
procedure
TFormD.doPasteLink(Sender: TObject);
var
Service, Topic, Item :
String;
begin
if GetPasteLinkInfo
(Service, Topic, Item) then
begin
AppName.Text := Service;
TopicName.Text := Topic;
ItemName.Text := Item;
DdeClient.SetLink
(Service, Topic);
DdeClientItem.DdeConv :=
DdeClient;
DdeClientItem.DdeItem :=
ItemName.Text;
end;
end;
После
того, как установлена
связь, нужно позаботиться
о поступающих по DDE данных,
это делается в обработчике
события OnChange объекта
TDdeClietItem:
procedure
TFormD.DdeClientItemChange(Sender: TObject);
begin
DdeDat.Lines :=
DdeClientItem.Lines;
end;
Это
единственная задача
объекта TDdeClientItem.
На
объект TDdeClientConv
возлагаются еще две задачи
: пересылка данных на
сервер и выполнение
макросов. Для этого у
данного объекта есть
соответствующие методы.
Посмотрим, как это можно
было бы сделать.
Выполнение макроса на
сервере:
procedure
TFormD.doMacro(Sender: TObject);
begin
DdeClient.ExecuteMacroLines(XEdit.Lines,
True);
end;
Пересылка
данных на сервер:
procedure TFormD.doPoke
(Sender: TObject);
begin
DdeClient.PokeDataLines(DdeClientItem.DdeItem,XEdit.Lines);
end;