在设置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项目中说些什么,但我找不到任何地方可以说:/
答案 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
类,该类具有Account
和Username
属性,用于登录会话。
话虽如此,如果您不想派生自定义类,则基础TIdContext
类已经拥有公开Data
属性(或DataObject
和DataValue
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
。