2017-02-24 2 views
0

TCPServer 및 FTPServer 설정 작업에서 가장 많이 주목 한 것은 IdContext의 UserID 필드와 UserFlag 필드가 필요하다는 것입니다. 이들을 간단하게 추가하면 여러 클라이언트의 구성 요소를 쉽게 설정할 수 있습니다. 자손을 만들 수는 있지만 소스 코드에 쉽게 추가되는 것을 불필요하게 많은 코딩 작업을 필요로합니다.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; 

이를 사용하여 나는 이벤트 사이의 상태를 신호 수 있어요와 이벤트가 발생할 때마다 나는 참조가 쉽게 사용할 수있는 다음과 같이 나는 IdContext.pas를 수정했습니다. Indy 프로젝트에서 뭔가 말하려고했지만 어디서나 말할 수는 없었습니다./

+0

버그 및 기능 요청은 [Indy의 issue tracker] (http://indy.codeplex.com) 또는 Embarcadero Internet/Socket 포럼에 제출하거나 비공개로 제출할 수 있습니다. 하지만이 기능은 구현하려는 경향이 아닙니다. –

답변

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; 

그리고 필요한 경우 다음 TMyContextTIdContext 객체 포인터를 캐스팅 입력 할 수 있습니다 : 그것은 정말 많은 코딩, 예를 들면되지 않습니다.

다양한 Indy 서버가 정확하게 이것을 내부적으로 수행합니다. 예를 들어, TIdFTPServerAccountUsername 로그인 세션에 대한 속성이있는 TIdFTPServerContext 클래스를 사용합니다. 저장하는 데 사용할 수 있습니다

사용자 정의 클래스를 파생하고 싶지 않은 경우 말했다되는 것을, 기본 TIdContext 클래스가 이미 (델파이 ARC 기반 컴파일러 또는 DataObjectDataValue 속성) 공공 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합니다.

+0

감사합니다. Remy, 훌륭한 제안 :) – user7475089

관련 문제