Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 我应该在哪里调用TDSSessionManager.Instance.AddSessionEvent?_Delphi_Session_Events_Tracking_Datasnap - Fatal编程技术网

Delphi 我应该在哪里调用TDSSessionManager.Instance.AddSessionEvent?

Delphi 我应该在哪里调用TDSSessionManager.Instance.AddSessionEvent?,delphi,session,events,tracking,datasnap,Delphi,Session,Events,Tracking,Datasnap,出于调试原因,我尝试跟踪会话的创建/销毁。许多网站引用Mat DeLong的代码来处理TDSSessionManager.Instance.AddSessionEvent,例如,请参阅文档,向下滚动到会话管理一章的一半 上面写着 TDSSessionManager.Instance.AddSessionEvent( procedure(Sender: TObject; const EventType: TDSSessionEventType; cons

出于调试原因,我尝试跟踪会话的创建/销毁。许多网站引用Mat DeLong的代码来处理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);
似乎已经习惯了老式的Pascal,我已经错过了一些新的语言constructus OOP添加的内容

TDSSessionManager是一种类型,而不是实际的对象。如何调用类型中的代码?我本以为会是这样的

var SessionManager : TDSSessionManager;

begin
SessionManager := TDSSessionManager.Create;
...

SessionManager.AddSessionEvent(MySessionHandler);
end;
Procedure MySessionHandler(Sender: TObject; const EventType: TDSSessionEventType;
                const Session: TDSSession)
begin
case EventType of
  SessionCreate: (* session was created *);
  SessionClose: (* session was closed *);
end;
end;
但是等等。同时,我还阅读了更多关于Singleton TDSSessionManager的信息。这种类型的对象只能有一个,因此TDSSessionManager.Instance只能指向一个真正的对象,我将其命名为SessionManager,这就是它的工作方式。这个理论是真的吗

第二个难解的问题是他如何将事件处理程序的代码正确地放入调用者的参数部分。我本以为会是这样的

var SessionManager : TDSSessionManager;

begin
SessionManager := TDSSessionManager.Create;
...

SessionManager.AddSessionEvent(MySessionHandler);
end;
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(Sender: TObject; const EventType: TDSSessionEventType;
                    const Session: TDSSession)
看起来它必须是一个类的方法,而不是一个正常的过程。要验证这一点,请检查AddSessionEvent的签名。所以看起来是这样的:

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

有几个明显的地方可以尝试,例如表单或数据模块的OnCreate事件处理程序。您尝试过哪些其他地方不起作用?嗨,Rob,TDSSessionManager是REST Datasnap生态系统的一部分,我要说的是REST Datasnap应用程序。对不起,我在第一篇文章中没有提到这一点。谢谢你的回复,但我不太明白你的回复如何解决了我提出的问题。任务的哪一部分遇到问题?嗨,Rob,TDSSessionManager.Instance.ForEachSession过程重建会话:TDSSession begin//handle Session Instance end;那段代码给你带来了什么麻烦?你不知道该怎么称呼它吗?你在哪里试过?或者您知道如何处理会话实例吗?这似乎与您原来的问题没有任何关系。描述如下:TDSSessionEvent=对procedureSender的引用:TObject;const EventType:TDSSessionEventType;const Session:TDSSession;没有类方法的痕迹->我想一个普通的过程应该做得很好。