제안 해 주셔서 감사합니다. 그러나 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;
그리고 필요한 경우 다음 TMyContext
에 TIdContext
객체 포인터를 캐스팅 입력 할 수 있습니다 : 그것은 정말 많은 코딩, 예를 들면되지 않습니다.
다양한 Indy 서버가 정확하게 이것을 내부적으로 수행합니다. 예를 들어, TIdFTPServer
은 Account
및 Username
로그인 세션에 대한 속성이있는 TIdFTPServerContext
클래스를 사용합니다. 저장하는 데 사용할 수 있습니다
사용자 정의 클래스를 파생하고 싶지 않은 경우 말했다되는 것을, 기본 TIdContext
클래스가 이미 (델파이 ARC 기반 컴파일러 또는 DataObject
및 DataValue
속성) 공공 Data
속성을 가지고 않습니다, 사용자 정의 데이터, 예를 들면 :
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
합니다.
버그 및 기능 요청은 [Indy의 issue tracker] (http://indy.codeplex.com) 또는 Embarcadero Internet/Socket 포럼에 제출하거나 비공개로 제출할 수 있습니다. 하지만이 기능은 구현하려는 경향이 아닙니다. –