Indy 10.6 IdContext需要一个ID字段

时间:2017-02-24 22:37:29

标签: delphi indy

在设置TCPServer和FTPServer时,我注意到的最多是需要在IdContext中使用UserID字段和UserFlag字段。简单地添加这些将极大地方便为多个客户端设置组件。您可以创建一个后代,但这需要很多不必要的编码,以便轻松添加到源代码中。我按如下方式修改了IdContext.pas:

Protected
  FUserFlag: Boolean;
  FUserID: Integer;
...
Public
  Property UserFlag: Boolean Read FUserFlag Write FUserFlag Default False;
  Property UserID: Integer Read FUserID Write FUserID Default -1;

通过使用这些,我能够在事件之间发出状态信号,并且只要事件被触发,我就可以随时获得引用。我试图在Indy项目中说些什么,但我找不到任何地方可以说:/

1 个答案:

答案 0 :(得分:0)

感谢您的建议,但我不打算对基础TIdContext课程进行这些补充。他们根本就不属于那里。在这种情况下,派生自定义类并将其分配给服务器的ContextClass属性是正确和适当的解决方案。这就是为什么该属性首先存在的原因。实际上编码并不多,例如:

type
  TMyContext = class(TIdServerContext)
  protected
    FUserFlag: Boolean;
    FUserID: Integer;
    ...
  public
    Property UserFlag: Boolean Read FUserFlag Write FUserFlag;
    Property UserID: Integer Read FUserID Write FUserID;
  end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  // must do this before activating the server...
  IdTCPServer1.ContextClass := TMyContext;
end;

然后,您可以在需要时将TIdContext对象指针转换为TMyContext

各种Indy服务器在内部完成此操作。例如,TIdFTPServer使用TIdFTPServerContext类,该类具有AccountUsername属性,用于登录会话。

话虽如此,如果您不想派生自定义类,则基础TIdContext类已经拥有公开Data属性(或DataObjectDataValue Delphi基于ARC的编译器中的属性,可用于存储用户定义的数据,例如:

type
  TMyData = class
  protected
    FUserFlag: Boolean;
    FUserID: Integer;
    ...
  public
    Property UserFlag: Boolean Read FUserFlag Write FUserFlag;
    Property UserID: Integer Read FUserID Write FUserID;
  end;

procedure TMyForm.IdTCPServer1Connect(AContext: TIdContext);
begin
  AContext.Data := TMyData.Create;
  ...
end;

然后,您只需在需要时将AContext.Data输入TMyData