2014-09-22 136 views
0

为了调试的原因,我尝试跟踪会话创建/销毁。许多网站引用Mat DeLong的代码来处理TDSSessionManager.Instance.AddSessionEvent,例如,参见文档http://mathewdelong.wordpress.com/category/rad-studio/xe2/,向下滚动到“会话管理”一章。我应该在哪里调用TDSSessionManager.Instance.AddSessionEvent?

有它读取...

TDSSessionManager.Instance.AddSessionEvent(
    procedure(Sender: TObject; const EventType: TDSSessionEventType; 
        const Session: TDSSession) 
    begin 
    case EventType of 
     SessionCreate: (* session was created *); 
     SessionClose: (* session was closed *); 
    end; 
end); 

好像beeing用于旧式帕斯卡尔我已经错过了一些新的语言constructus OOP添加的。

TDSSessionManager是一个类型,而不是实际的对象。某人如何调用某种类型的代码?我会有这样的想像

var SessionManager : TDSSessionManager; 

begin 
SessionManager := TDSSessionManager.Create; 
... 

SessionManager.AddSessionEvent(MySessionHandler); 
end; 

但是等等。我同时阅读了更多关于“Singleton”TDSSessionManager的内容。只能有一个这种类型的对象,所以TDSSessionManager.Instance只能指向一个真实对象,我将它命名为“SessionManager”,这就是它的工作原理。这个理论是真的吗?

第二个神秘的事情是他如何将他的事件处理程序的代码放入调用者的参数部分。我本来期望像

Procedure MySessionHandler(Sender: TObject; const EventType: TDSSessionEventType; 
       const Session: TDSSession) 
begin 
case EventType of 
    SessionCreate: (* session was created *); 
    SessionClose: (* session was closed *); 
end; 
end; 

....

Procedure StartMyServer; 

begin 
... 
TDSSessionManager.Instance.AddEventHandler(MySessionHandler); 
... 
end; 

请问这是可能的,等同于德隆的代码?

感谢详情

Armin。

+1

有几个明显的地方可以尝试,比如窗体或数据模块的OnCreate事件处理程序。你尝试过哪些地方*没有工作? – 2014-09-22 15:30:45

+0

Hi Rob,TDSSessionManager是REST Datasnap生态系统的一部分,我正在讨论REST datasnap应用程序。对不起,我没有在第一篇文章中介绍过这个。 – Armin 2014-10-20 14:54:18

+0

感谢您的回复,但我不太清楚您的回复如何解决我提出的问题。你有哪些任务部分有问题? – 2014-10-20 15:21:56

回答

0

是的,这是你的想法:匿名方法可以重写为“老派”方法。

必须考虑的唯一的事情就是方法签名

procedure(Sender: TObject; const EventType: TDSSessionEventType; 
        const Session: TDSSession) 

看起来像它必须是一个类的方法,而不是一个正常的程序。 (验证这个检查AddSessionEvent的签名)。所以它看起来像这样:

procedure TSomeOutherClass.MySessionHandler(Sender: TObject; 
      const EventType: TDSSessionEventType; const Session: TDSSession)   
begin 
    ... 
end; 
+0

说明如下: TDSSessionEvent =对过程的引用(发件人:TObject; const EventType:TDSSessionEventType; const Session:TDSSession); 没有类方法的痕迹 - >我猜一个普通的“程序”应该很好地做。 – Armin 2014-10-23 13:19:14