Учебный пример: Простой сервис DataSnap XE – калькулятор

By: Vsevolod Leonov

Abstract: В этой статье рассматривается создание простого сервиса Delphi XE на примере «калькулятора», которые реализует базовые функции арифметических вычислений. Этот пошаговый учебный пример очень прост, поэтому даже начинающие программисты Delphi смогут его воспроизвести. Целью этого учебного примера является знакомство с процессом создания клиентов и серверов DataSnap. Наш простой «калькулятор в виде сервиса» подразумевает клиентское и серверное приложение. Обе программы – Delphi VCL Forms Win32, а для связи используется протокол TCP/IP. Надеемся, вам понравится!

    Создаем простое серверное приложение

Первым шагом является создание нового серверного приложения DataSnap с использованием мастера “DataSnap Server”.

Запустите Delphi XE.

Выберите в главном меню “File -> New -> Other”, а затем в диалоге “New Items” щелкните два раза на иконке “DataSnap Server” в категории “Delphi Projects -> DataSnap Server”.

Hide image

Hide image
Click to see full-sized image

На первой странице оставьте по-умолчанию опцию “Project type” как “VCL Forms Application”.

Hide image
Click to see full-sized image

На второй странице мастера также оставьте уже выбранные опции. Далее мы заменим демонстрационные методы (Sample Methods) сервера нашими вариантами.

Hide image
Click to see full-sized image

На третьем изображении мы оставим значение по-умолчанию “211” для номера порта TCP/IP. Старайтесь всегда проводить проверку доступности порта путем нажатия на кнопку “Test Port”.

Hide image
Click to see full-sized image

На последней странице мы собираемся также воспользоваться опцией по-умолчанию для выбора базового класса как “TComponent”, от которого будет производиться наш класс, реализующий методы сервера.

Нажмите на кнопку “Finish”, а мастер создаст новый проект с тремя модулями.

Сохраните весь проект выбором “File -> Save All”.

Создайте новую папку для всех файлов для данного учебного примера “C:\DataSnapLabs\SimpleCalc\”.

Сохраните главную форму приложения как “FormServerUnit”, а для остальных имен воспользуйтесь стандартными названиями – “ServerContainerUnit1” и “ServerMethodsUnit1” – и сохраните проект как “SimpleCalcServer”.

На этой стадии в окне Delphi Project Manager вы видите следующую картину:

Hide image

Откройте модуль “ServerMethodsUnit1.pas” и реализуйте функциональность простого сервиса, выполняющего арифметические действия. Замените демонстрационные методы, добавленные мастером (“EchoString” и “ReverseString”), на нужные нам варианты “Add” («сложить»), “Subtract” («вычесть»), “Multiply” («умножить») и “Divide” («разделить»).

Исходный код для модуля “ServerMethodsUnit1” должен выглядеть следующим образом:

unit ServerMethodsUnit1;

interface

uses
  Classes;

type
{$METHODINFO ON}
  TServerMethods1 = class(TComponent)
  private
    { Private declarations }
  public
    function Add(a, b: double): double;
    function Subtract(a, b: double): double;
    function Multiply(a, b: double): double;
    function Divide(a, b: double): double;
  end;
{$METHODINFO OFF}

implementation

{ TServerMethods1 }

function TServerMethods1.Add(a, b: double): double;
begin
  Result := a + b;
end;

function TServerMethods1.Subtract(a, b: double): double;
begin
  Result := a - b;
end;

function TServerMethods1.Multiply(a, b: double): double;
begin
  Result := a * b;
end;

function TServerMethods1.Divide(a, b: double): double;
begin
  Result := a / b;
end;

end.

Листинг 1: ServerMethodsUnit1.pas.

Вы полностью реализовали наш сервер. Для того чтобы реализовать клиентское приложение, сервер должен быть запущен.

Выберите “Run -> Run Without Debugging” для запуска сервера (вне отладчика) и минимизируйте его окно.

Не завершайте работу серверного приложения до окончания учебного примера.

    Создаем простое клиентское приложение

Кликните правой кнопкой мыши на project group внутри Project Manager и выберите “Add New Project”.

Hide image

В диалоге “New Items” выберите “VCL Forms Application” из категории “Delphi Projects”.

Hide image

Нажмите “OK”. К существующей project group должен добавиться новый проект.

Выполните сохранение нового проекта “File -> Save All”.

Выберите папку, которую вы создали для сохранения файлов проекта сервера, и сохраните туда главную форму клиентского приложения как “FormClientUnit”, сам проект как “SimpleCalcClient”, а всю project group как “SimpleCalcGrp”.

Теперь окно Project Manager должно выглядеть как:

Hide image

Проверьте, что проект клиентского приложения активен, затем выберите “File -> New -> Other”, а в появившемся диалоге “New Items” выберите “DataSnap Client Module”.

Hide image

Как и в прошлый раз, пожалуйста, сохраните все опции по умолчанию во время работы с мастером.

Hide image
Click to see full-sized image

На первой странице оставьте “DataSnap server location” как “Local server”.

Hide image
Click to see full-sized image

Наш сервер DataSnap является “stand alone” (независимое отдельное приложение), поэтому просто нажмите “Next”.

Hide image
Click to see full-sized image

Мы согласились использовать “TCP/IP” в качестве протокола, поэтому сохраним выбранную опцию.

Hide image
Click to see full-sized image

Нажмите на “Test Connection”, чтобы проверить, действительно ли сервер «слушает» порт 211, а затем нажмем “Finish”.

Мастер добавить два модуля к нашему клиентскому приложению “ClientClassesUnit1” и “ClientModuleUnit1”.

Последней задачей в этом учебном примере является реализация интерфейса клиентского приложения.

Начнем с того, что добавим ссылку на модуль “ClientModuleUnit1” в раздел uses главного модуля формы клиента. Активируем данный модуль в редакторе и выбираем в меню “File -> Use Unit”.

Теперь в коде формы клиента нужно правильно использовать методы, экспонируемые (предлагаемые) через свойство “ClientModule1.ServerMethods1Client”. Эти методы имеют те же имена и сигнатуры, как и методы, реализованные на сервере.

Ниже показана реализация главной формы клиентского приложения.

unit FormClientUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm3 = class(TForm)
    EditA: TEdit;
    ButtonAdd: TButton;
    EditB: TEdit;
    ButtonSub: TButton;
    ButtonMult: TButton;
    ButtonDiv: TButton;
    LabelResult: TLabel;
    procedure ButtonAddClick(Sender: TObject);
    procedure ButtonSubClick(Sender: TObject);
    procedure ButtonMultClick(Sender: TObject);
    procedure ButtonDivClick(Sender: TObject);
  private
    { Private declarations }
  public
    function GetA: double;
    function GetB: double;
    procedure ShowResult(aValue: double);
  end;

var
  Form3: TForm3;

implementation

uses ClientModuleUnit1;

{$R *.dfm}

function TForm3.GetA: double;
begin
  Result := StrToFloat(EditA.Text);
end;

function TForm3.GetB: double;
begin
  Result := StrToFloat(EditB.Text)
end;

procedure TForm3.ShowResult(aValue: double);
begin
  LabelResult.Caption := FloatToStr(aValue);
end;

procedure TForm3.ButtonDivClick(Sender: TObject);
begin
  ShowResult(ClientModule1.ServerMethods1Client.Divide(GetA, GetB));
end;

procedure TForm3.ButtonMultClick(Sender: TObject);
begin
  ShowResult(ClientModule1.ServerMethods1Client.Multiply(GetA, GetB));
end;

procedure TForm3.ButtonSubClick(Sender: TObject);
begin
  ShowResult(ClientModule1.ServerMethods1Client.Subtract(GetA, GetB));
end;

procedure TForm3.ButtonAddClick(Sender: TObject);
begin
  ShowResult(ClientModule1.ServerMethods1Client.Add(GetA, GetB));
end;

end.

Листинг 2: Реализация главной формы клиента.

Окончательно моя форма выглядит следующим образом:

Hide image

Наверное, вам не нужно рассказывать, как воспроизвести ее!

Теперь вы видите, как просто создавать сервера и клиенты DataSnap и использованием Delphi XEJ

    Итог

В этом учебном примере мы использовали Delphi XE для построения простого сервиса DataSnap XE в виде калькулятора, который на уровне реализации представляет собой приложения Win32, при обмене данными между которыми используется протокол TCP/IP.

Весь исходный код данного учебного примера доступен по адресу http://cc.embarcadero.com/Item/28184

Видеоролик, демонстрирующий реализацию этого примера, можно найти здесь (http://www.youtube.com/watch?v=Qm__RdmIWSg).

Подробное описание возможностей технологии Delphi находится по адресу http://www.embarcadero.com/products/delphi

Server Response from: ETNASC03