我出于调试原因尝试跟踪会话创建/销毁。许多网站引用Mat DeLong的代码来处理TDSSessionManager.Instance.AddSessionEvent,例如参见文档http://mathewdelong.wordpress.com/category/rad-studio/xe2/,向下滚动到“会话管理”一章。
在那里读取......
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);
似乎过去习惯于旧式Pascal我已经错过了一些新的语言构造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;
这是否可能并且等同于DeLong的代码?
感谢您提供更多信息
阿明。
答案 0 :(得分:0)
是的,正如您所想:匿名方法可以重写为“老派”方法。
唯一必须考虑的是方法签名
procedure(Sender: TObject; const EventType: TDSSessionEventType;
const Session: TDSSession)
看起来它必须是类的方法,而不是正常的过程。 (要验证这一点,请检查AddSessionEvent的签名)。所以它看起来像这样:
procedure TSomeOutherClass.MySessionHandler(Sender: TObject;
const EventType: TDSSessionEventType; const Session: TDSSession)
begin
...
end;