Создаем простое серверное приложение
Первым шагом является создание нового серверного приложения DataSnap с использованием мастера "DataSnap Server".
Запустите Delphi XE.
Выберите в главном меню "File -> New -> Other", а затем в диалоге "New Items" щелкните два раза на иконке "DataSnap Server" в категории "Delphi Projects -> DataSnap Server".
На первой странице оставьте по-умолчанию опцию "Project type" как "VCL Forms Application".
На второй странице мастера также оставьте уже выбранные опции. Далее мы заменим демонстрационные методы (Sample Methods) сервера нашими вариантами.
На третьем изображении мы оставим значение по-умолчанию "211" для номера порта TCP/IP. Старайтесь всегда проводить проверку доступности порта путем нажатия на кнопку "Test Port".
На последней странице мы собираемся также воспользоваться опцией по-умолчанию для выбора базового класса как "TComponent", от которого будет производиться наш класс, реализующий методы сервера.
Нажмите на кнопку "Finish", а мастер создаст новый проект с тремя модулями.
Сохраните весь проект выбором "File -> Save All".
Создайте новую папку для всех файлов для данного учебного примера "C:\DataSnapLabs\SimpleCalc\".
Сохраните главную форму приложения как "FormServerUnit", а для остальных имен воспользуйтесь стандартными названиями - "ServerContainerUnit1" и "ServerMethodsUnit1" - и сохраните проект как "SimpleCalcServer".
На этой стадии в окне Delphi Project Manager вы видите следующую картину:
Откройте модуль "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".
В диалоге "New Items" выберите "VCL Forms Application" из категории "Delphi Projects".
Нажмите "OK". К существующей project group должен добавиться новый проект.
Выполните сохранение нового проекта "File -> Save All".
Выберите папку, которую вы создали для сохранения файлов проекта сервера, и сохраните туда главную форму клиентского приложения как "FormClientUnit", сам проект как "SimpleCalcClient", а всю project group как "SimpleCalcGrp".
Теперь окно Project Manager должно выглядеть как:
Проверьте, что проект клиентского приложения активен, затем выберите "File -> New -> Other", а в появившемся диалоге "New Items" выберите "DataSnap Client Module".
Как и в прошлый раз, пожалуйста, сохраните все опции по умолчанию во время работы с мастером.
На первой странице оставьте "DataSnap server location" как "Local server".
Наш сервер DataSnap является "stand alone" (независимое отдельное приложение), поэтому просто нажмите "Next".
Мы согласились использовать "TCP/IP" в качестве протокола, поэтому сохраним выбранную опцию.
Нажмите на "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: Реализация главной формы клиента.
Окончательно моя форма выглядит следующим образом:
Наверное, вам не нужно рассказывать, как воспроизвести ее!
Теперь вы видите, как просто создавать сервера и клиенты 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