2017-02-24 139 views
0

在设置TCPServer和FTPServer时,我最注意的事情是在IdContext中需要一个UserID字段和一个UserFlag字段。这些简单的添加将极大地方便为多个客户端设置组件。你可以创建一个后代,但是对于那些很容易添加到源代码中的东西需要很多不必要的编码。我修改IdContext.pas如下:Indy 10.6 IdContext需要一个ID字段

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

错误和功能请求可以提交给[Indy的问题跟踪器](http://indy.codeplex.com),或在Embarcadero互联网/套接字论坛中,或者私下提交给我。但是这个功能并不是我想要实现的功能。 –

回答

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性能在基于ARC的Delphi编译器),可用于存储用户定义的数据,例如:

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.DataTMyData需要的时候。

+0

谢谢雷米,很棒的建议:) – user7475089

相关问题