logo search
Лабораторная работа6

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

С помощью технологии DDE два приложения могут динамически взаимодействовать и обмениваться текстовыми данными во время их выполнения. При этом программа, запрашивающая данные, становится клиентом, а программа, служащая источником данных, является сервером.

Организация динамического обмена данными включает в себя два этапа:

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

  2. собственно передача текстовых данных:

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

    2. передача данных на сервер

    3. посылка серверу команд

Для совместной отладки двух приложений сначала создаем сервер, а затем – клиент, или запуск двух копий приложений, в которых отлаживаются сервер и клиент.

Для организации приложения сервера должны быть размещены две компоненты DdeServerConv (сеанс обмена данными) и DdeServerItem (передаваемые данные), находящиеся в палитре компонентов на странице System. Так же нам понадобиться два редактора Edit1и Edit2 для передачи и приема текстовой информации и кнопка Button1 для реализации копирования параметров связи.

Компонент DdeServerItem через свойство ServerConv связан с компонентой DdeServerConv и непосредственно определяет текстовые данные, пересылаемые в процессе обмена. Устанавливаем связь между компонентами DdeServerConv и DdeServerItem:

procedure TForm1.FormCreate(Sender: TObject);

begin

DdeServerItem1.ServerConv := DdeServerConv1 ;

end;

Эти данные должны быть занесены в свойство Text или Lines. Например, при передаче текста из редактора Edit1 обновление свойства Text может быть выполнено в обработчике события OnChange редактора Edit1 с помощью следующего оператора:

procedure TForm1.Edit1Change(Sender: TObject);

begin

DdeServerItem1.Text:=Edit1.Text;

end;

При подключении к серверу клиента последнему нужна информация о параметрах сервера. Эти параметры могут быть помещены в буфер обмена с помощью метода CopyToClipboard компоненты DdeServerItem. Затем эти параметры можно извлечь и использовать в приложении клиента при подключении к серверу.

procedure TForm1.Button1Click(Sender: TObject);

begin

DdeServerItem1.CopyToClipboard ;

end;

Если сервер может принимать данные от клиента, в программе должен быть подготовлен обработчик события OnPokeData компоненты DdeServerItem. При отображении получаемых данных в редакторе Edit2 оператор обработчика может иметь вид:

procedure TForm1.DdeServerItem1PokeData(Sender: TObject);

begin

Edit2.Text:= DdeServerItem1.Text;

end;

Если сервер может обрабатывать макросы, то соответствующие действия кодируются в обработчике события OnExecuteMacro типа TMacroEvent компоненты DdeServerConv. Тип события описан следующим образом:

Type TMacroEvent=procedure (Sender: TObject; Msg: TStrings) of Object;

Для организации приложения клиента должны быть размещены две компоненты DdeClientConv (сеанс обмена данными) и DdeClientItem (передаваемые данные), находящиеся в палитре компонентов на странице System. Компонент DdeClientConv обеспечивает установление сеанса связи с сервером и управление процессом обмена данными, используя параметры сервера в следующих свойствах:

Эти параметры можно установить через “Инспектор объектов” в свойстве DdeService, если предварительно скопировать параметры связи в приложении сервера и вставить их в окне DDE Info по кнопке Paste Link:

Такие изменения можно внести в обработчик события OnCreate формы:

DdeClientConv1.DdeService := 'Server';

DdeClientConv1.DdeTopic := 'DdeServerConv1';

Так же нам понадобиться два редактора Edit1и Edit2 для передачи и приема текстовой информации и кнопка Button1 для реализации передачи данных на сервер.

Свойство ConnectMode компоненты DdeClientConv управляет режимом подключения клиента к серверу и принимает значение ddeAutomatic (автоматическое соединение) или ddeManual (ручное соединение). Если при запуске приложения клиента приложение сервера еще не было запущено, то оно автоматически запускается при значении ddeAutomatic. Если значение установлено в ddeManual, то приложение сервера будет запускаться по вызову метода OpenLink компоненты DdeClientConv. Для отключения от сервера используют метод CloseLink.

Компонент ddeClientItem отвечает за получаемые от сервера данные, которые заносятся в те же свойства, что и у компоненты ddeServerItem. При изменении данных компонента ddeClientItem генерирует событие OnChange, обработчик которого используется для приема этих данных.

procedure TForm1.DdeClientItem1Change(Sender: TObject);

begin

edit1.Text :=DdeClientItem1.Text ;

end;

Клиент может принимать данные от сервера и посылать ему данные и команды для выполнения (макросы). Для этого используют метод PokeData или PokeDataLines (для нескольких строк):

procedure TForm1.Button1Click(Sender: TObject);

var pc:PChar;

begin

DdeClientConv1.PokeData(ddeclientitem1.DdeItem,

StrPCopy(pc, edit2.Text));

end;

На сервере должен быть подготовлен обработчик события OnPokeData компоненты DdeServerItem Для посылки макросов используют метод ExecuteMacro или ExecuteMacroLines. На сервере выполнение макросов кодируется в обработчике события OnExecuteMacro компоненты DdeServerConv.

Компонент DdeClientItem связывается с компонентом ddeClientConv через свойство DdeConv, а через свойство ddeItem указывается компонент DdeServerItem, с которым выполняется обмен данными:

DdeClientItem1.DdeConv :=DdeClientConv1 ;

DdeClientItem1.DdeItem := 'DdeServerItem1';

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