RO36 - RemObjects SDK 3 中的Multicast事件

 
RO36 - RemObjects SDK 3 中的 Multicast 事件                              
作者 Derek Davidson (www.enterpriseblue.co.uk)
 
RemObjects 提示 : 我们相信本文是正确的 , 但是我们不做任何担保 . 感谢 Andrea 的大作 , 很高兴可以在这里发布 .
RemObjects SDK 3 (RO3) 包含 Multicast Events 新特性 . 本文通过 SDK3 自带的范例来介绍这个主题 .
Multicast Events 是可以是 RO3 服务端触发一个或多个客户端事件的简单方式 . 你可以像其它事件一样写这种事件处理函数 . 这里介绍的可能很笼统 , 一些隐含的信息可以在 RO3 中的 Chat 范例中查看 .
你可能认为设置这种事件处理程序可能比其他简单的应用程序中的事件处理复杂 . 毕竟 , 我们我们设计的服务端和客户端可能远离数千公里 ! 然而不必退缩 . 一旦你通过了最初的学习曲线 , 强大优美的设计等着你去开发 . 因此不做其他累述 , 开始我们的应用吧 :
写一个 Multicast RO 服务
1. 启动 Delphi, 在主菜单中选择 File | New | Other . 弹出 New Items 对话框 , 选择 RemObjects SDK 标签然后选择 VCL Standalone . 如下填写 New RemObjects SDK Server Project 对话框 :
RO36 - RemObjects SDK 3 中的Multicast事件_第1张图片
1. 新的 RemObjects SDK 服务项目对话框
 
2. 完成服务 . 然后要求选择设计类型 , 介绍默认设置 (RemObjects Remote Datamodule). 点击 [OK].
3. Delphi 主菜单 , 选择 RemObjects | Edit Service | Library . 打开 RO Service Builder. 点击 [Event Sink] 按钮并重命名新项为 'MulticastTestEvent' .
4. 点击 [Add Event]. 为事件命名为 'OnSum' . 不设置参数 . 关闭 RO Service Builder 并重新编译 RO3 服务端应用程序 . 如果检查你的源代码 , 你可以在 MulticastLibrary_Intf 文件 ( EID_MulticastTestEvent, IMulticastTestEvent ) 中发现 RO 自动生成的事件代码 .
5. 在服务端主窗体添加 TROInMemoryEventRepository TROEventSessionManager 控件 . 对这些控件的详细信息请参考 RO SDK3 V3.0.1.279 版本的帮助文件 . 分别设置 ROInMemoryEventRepository1 控件的 Message SessionManager 属性为 ROMessage ROEventSessionManager1.
2. 正确设置 TROInMemoryEventRepository
 
6. 选择 MulticastService RemoteDatamodule . Delphi 主菜单中选择 File | Use Unit 选择 fServerForm. 现在分别设置 EventRepository SessionManager 属性为 ServerForm.ROInMemoryEventRepository1 ServerForm.ROEventSessionManager1.
RO36 - RemObjects SDK 3 中的Multicast事件_第2张图片
Fig 3. 正确设置 MulticastService RO Remote Datamodule
7. 如同每个标准的 RO SDK 服务范例一样 , MulticastService_Impl 单元完成 Sum GetServerTime 方法 .
8. 为了在用户调用 Sum 方法时触发事件 , 你需要在方法中填写一行代码 :
function TMulticastService.Sum(
 const A: Integer; const B: Integer): Integer;
begin
  Result := A + B;
  { Generates the OnSum event }
  (EventRepository as
     IMulticastTesterEvent_Writer).OnSum(Session.SessionID);
end ;
Multicast RO 客户端
9. 在客户端窗体中加入 TROEventReceiver 组件命名为 EventReceiver . 分别设置其 Channel Message 属性为 ROChannel ROMessage. 设置 interval 属性为 1000 , 设置 ServiceName MulticastService. 本质上 , 这个组件将每秒中去服务端检查一次是否有属于它的消息 .
RO36 - RemObjects SDK 3 中的Multicast事件_第3张图片
4. 正确设置 TROEventReceiver
 
10. 在客户端窗体中添加一个按钮并设置其事件处理过程 :
procedure TClientForm.Button1Click(Sender: TObject);
var
  myService: IMulticastService;
 res: integer;
begin
  myService := CoMulticastService.Create(ROMessage,ROChannel);
 res := myService.Sum( 1 , 2 );
 ShowMessage( 'The result was ' + IntToStr(res));
end ;
11. implementation uses 子句中的 MulticastLibrary_Intf 引用转移到 interface uses 子句中 . 这样我们就可以在窗体类中声明我们上面添加的接口了 .
12. 修改客户端窗体的定义 :
TClientForm = class(TForm, IMulticastTestEvent)
13. 在类定义中 , 将如下代码添加到 private :
private
 procedure OnSum;
14. 实现 OnSum 过程 :
procedure TClientForm.OnSum
begin
  ShowMessage( 'Someone used the sum method' );
end ;
15. FormCreate 事件中添加如下代码 :
procedure TClientForm.FormCreate(Sender: TObject);
begin
  EventReceiver.RegisterEventHandlers([EID_MulticastTestEvent],[Self]);
 EventReceiver.Active := True;
end ;
16. FormClose 事件中填写如下代码 :
procedure TClientForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  EventReceiver.Active := False;
 EventReceiver.UnregisterEventHandlers([EID_MulticastTestEvent]);
end ;
17. 现在我们完成了服务端和客户端 . 现在准备测试 . 运行服务端 , 运行单独的客户端拷贝 . 点击按钮后将弹出一个显示 Sun 方法返回值的对话框 .
RO36 - RemObjects SDK 3 中的Multicast事件_第4张图片
5. 调用 Sum 方法的返回值
 
但是请注意我们没有在调用 Sum 方法的用户中得到一个对话框通知 . 这是因为默认情况下 RO3 不会向生成事件的客户端发生事件 .
 
18. 为验证事件的执行 , 运行另外一个客户端程序并点击按钮 . 如果没有什么以外 , 你将收到一个对话框通知 :
RO36 - RemObjects SDK 3 中的Multicast事件_第5张图片
6: 对话框展示了 OnSum 事件已经触发
19. 现在完成了 Multicast 事件的介绍 . 但是我们还要介绍一下如何简单的增加其他事件 , 这时我们只是垂直的扩展我们的知识面 .
使用更多的事件扩展 RO3 服务
20. 现在我们添加一个将在用户调用 OnServerTime 方法时触发的事件 . 步骤如下 :
服务端 :
a. 使用 RO Service Builder 增加一个新的事件并命名为 OnGetServerTime.
b. GetServerTime 方法中增加如下代码 :
(EventRepository
 as IMulticastTestEvent_Writer).OnGetServerTime(Session.SessionID);
客户端 :
a. Private 小节中增加一个 OnGetServerTime 过程声明
b. 在这个方法中调用另外一个 ShowMessage.
c. 在客户端窗体中添加另外一个按钮调用 GetServerTime 方法
OK! 像第 18 步一样测试一下 .
结论
本文介绍了 RO SDK3 中的新概念 Multicast Events . 本文可能还应该说明一下其他的问题 , RO 服务广播是向所有的客户端发送吗 ? 或我可以限制发送的客户端吗 ? 像这些问题将在其他文章中讨论 , 如果你感兴趣请关注 .
 
 

你可能感兴趣的:(service,Integer,扩展,Delphi,interface,events)