Справочное руководство по Delphi

       

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;


    Содержание раздела