Delphi: обмен данными между приложениями

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Delphi] [Контакты]

Пример приложений сервера и клиента DDE


dd1 d2

Попробуем разработать клиентскую и серверную части приложения. Клиент DDE передает серверу три числовых значения (красную, зеленую и синюю составляющие цвета) и просит его перерисовать свою поверхность в соответствии с суммарным цветом. Для начала при помощи Проводника Windows или другого файлового менеджера создайте папку «Client_Server» и внутри нее еще две папки «Client» и «Server», предназначенные для хранения исходных файлов клиентского и серверного приложений соответственно.

Начнем с разработки сервера. Создаем новый проект; переименуем его главную форму в frmMain. Сохраним проект под именем Server1.dpr, а соответствующий форме модуль языка Паскаль назовем main.pas. Затем воспользуйтесь пунктом меню Project – Options и в появившемся окне Project options откройте страницу Directories/Conditionals. В строке Output directory введите путь C:\10. Эти действия укажут Delphi, что результирующий exe-файл надо создавать в каталоге 10 диска C.

д3

Разместим на форме компоненты DDEServerConv и DDEServerItem. Измените свойство Name компонента DDEServerConv на MYSERVER. Переименуйте компонент DDEServerItem в MYITEM и при помощи свойства ServerConv свяжите его с MYSERVER.

Сохраните проект сервера и проверьте его работоспособность. Теперь переходим к написанию клиентского приложения. Создайте новое приложение. Переименуйте главную форму проекта в frmMain. Сохраните проект, назвав его Client1.dpr. По аналогии с действиями при создании сервера откройте окно Project options и установите Output directory в каталог 10 диска C: (исполняемые файлы сервера и клиента должны формироваться в одном и том же месте).

Внимание

Тестирование проектов, поддерживающих технологию DDE, значительно упрощается, если исполняемые файлы клиента и сервера находятся в одном каталоге. В противном случае, например во время разработки клиентского приложения, запуск исполняемого файла сервера динамического обмена придется осуществлять «вручную». 

Поместите на форму компонент DDEClientConv. Переведите режим соединения ConnectMode в ручной – ddeManual. Установите следующие свойства DdeService = 'Server1', DdeTopic = 'MYSERVER'. Перейдите к событию OnCreate() формы
и напишите строки, отвечающие за соединение с сервером:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  with DDEClientConv1 do
    if OpenLink = false then
      ShowMessage('Сервер ' + DdeTopic + ' не обнаружен');
end;

Напомню, что свойству DdeService должно соответствовать имя исполняемого файла программы-сервера, DdeTopic – имя компонента TDDEServerConv из состава программы-сервера. Для соединения с сервером вызывается функция OpenLink. Если соединение прошло успешно, свойству DdeItem компонента DDEClientItem присваивается название предмета диалога – MYITEM.

Запустите проект. Если все сделано без ошибок, одновременно со стартом клиентского приложения загрузится и приложение-сервер Server1. Если этого не произошло, внимательно проверьте имена компонентов (DDEServerConvMYSERVER, DDEServerItemMYITEM) в программе сервера и убедитесь, что исполняемые файлы сервера и клиента находятся в одном каталоге.

Разместите на поверхности формы клиентского приложения компонент DDEClientItem. С помощью свойства DdeConv соедините его с компонентом DDEClientConv. Затем свойству DdeItem присвойте значение MYITEM. Впрочем, эту операцию лучше описать внутри обработки события OnCreate() формы проекта. Для этого после вызова метода OpenLink() достаточно внести всего одну дополнительную строку:

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  with DDEClientConv1 do
    if OpenLink = false then
      ShowMessage('Сервер ' + DdeTopic + ' не обнаружен')
    else
      DdeClientItem1.DdeItem := 'MYITEM'; //новая строка
end;

Теперь разместите на форме три компонента-ползунка TTrackBar. Переименуйте их в tbRed, tbGreen и tbBlue. Свойству Max всех трех компонентов присвойте значение 255. Теперь напишем обработчик события OnChange() для любого из TrackBar:

procedure TfrmMain.tbRedChange(Sender: TObject);
begin
  with DdeClientItem1 do
  begin
    Lines.Clear; //очистка старых данных
    Lines.Add(IntToStr(tbRed.Position)); //значение красной составляющей цвета
    Lines.Add(IntToStr(tbGreen.Position)); //значение зеленой составляющей цвета
    Lines.Add(IntToStr(tbBlue.Position)); //значение синей составляющей цвета
  end;
  frmMain.Caption := Format('R=%d G=%d B=%d', [tbRed.Position, tbGreen.Position, tbBlue.Position]);
  DDEClientConv1.PokeDataLines('MYITEM',DDEClientItem1.Lines);  // передача данных серверу
end;

Назначьте этот обработчик события общим для всех трех компонентов TTrackBar. Идея кода прозрачна: с каждым изменением местоположения ползунка в строки Lines компонента DDEClientItem1 записываются значения свойства Position всех трех компонентов TTrackBar, причем в нулевую строку вносятся данные компонента, отвечающего за красную составляющую цвета, в первую строку – за зеленую и во вторую – за синюю. Таким образом, клиентское приложение подготавливает три строки текстовых данных для их последующей передачи серверу. После того как данные будут сформированы, они отправляются серверу DDE при помощи метода PokeDataLines() компонента DDEClientConv1.

Откомпилируйте и сохраните проект DDE-клиента. Вернитесь к проекту сервера, выберите компонент MYITEM и опишите его обработчик события OnPokeData():

procedure TfrmMain.MYITEMPokeData(Sender: TObject);
var
  R,G,B : byte;
begin
  if MYITEM.Lines.Count < 3 then
    exit;
  R := StrToIntDef(MYITEM.Lines.Strings[0],0); //красный
  G := StrToIntDef(MYITEM.Lines.Strings[1],0); //зеленый
  B := StrToIntDef(MYITEM.Lines.Strings[2],0); //синий
  frmMain.Color := RGB(R,G,B);
end;

При получении от клиента DDE трех строк с кодами основных цветов сервер осуществляет их декодирование и меняет цвет формы. Откомпилируйте проект сервера, запустите приложение-клиент и проверьте работоспособность обоих приложений.

Теперь научим сервер воспринимать макрокоманды, а точнее всего одну команду – завершение работы программы. Напомню, что в момент получения DDE-сервером макрокоманды у компонента TDDEServerConv вызывается обработчик события OnExecuteMacro. Поэтому на форме сервера найдите компонент MYSERVER и опишите соответствующий обработчик:

procedure TfrmMain.MYSERVERExecuteMacro(Sender: TObject; Msg: TStrings);
begin
  if Msg.Strings[0] = 'CLOSE' then
    frmMain.Close;
end;

Код предельно прост. Если поступает команда 'CLOSE', закрывается главная форма проекта и соответственно завершается работа приложения. Откомпилируйте и сохраните проект.

Переходим к проекту DDE-клиента. Воспользуемся событием закрытия формы для отправки серверу макрокоманды:

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DDEClientConv1.ExecuteMacro('CLOSE', true);
end;

Решим обратную задачу передачи макроса от сервера к клиенту. Для этого разместите на форме сервера кнопку и в его обработчик события OnClick() внесите одну-единственную строку с названием макроса:

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  MYITEM.Text:='CLEARCLIENT';
end;

На стороне клиентского приложения нам потребуется осуществить обработку макроса CLEARCLIENT. Для этого найдите компонент DDEClientItem1 и в соответствии с прилагаемым ниже листингом опишите его событие OnChange().

procedure TfrmMain.DdeClientItem1Change(Sender: TObject);
var
  s : string;
begin
  s := Trim(DDEClientItem1.Text); // прочитали полученный макрос и удалили лишние пробелы
  if s = 'CLEARCLIENT' then
  begin //если получен макрос 'CLEARCLIENT', обнуляем значения ползунков
    tbRed.Position := 0;
    tbGreen.Position := 0;
    tbBlue.Position := 0;
  end;
end;

Если был получен макрос с именем CLEARCLIENT, то клиентское приложение возвращает ползунки всех компонентов TTrackBar в нулевое положение.

Исходный код проекта (Delphi XE)

Используемая литература: Delphi. Профессиональное программирование. Дмитрий Осипов.