массив церверсокета

#delphi

Вопрос:

Хорошо, у меня есть массив tserversocket, и я использую свойство tag для отслеживания его индекса. Когда запускается событие, такое как _clientconnect, я использую индекс := (Отправитель в качестве сервера).Тег; но я получаю ошибку, которая выделяет эту строку и сообщает мне, что это неверный тип. Что я делаю не так, если все, что я хочу сделать, это получить поле свойства тега? Он работает с другими объектами.

Ответ №1:

Вы уверены, что Отправитель-это Серверсокет? Разве событие не определено так, как показано ниже:

 procedure TfrmServer.sskServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
 

В этом случае ваш код, вероятно, должен быть:

 Index := (Socket as TServerSocket).Tag;
 

Взгляните Sender.ClassName , чтобы увидеть, что такое Отправитель на самом деле.

Ответ №2:

Я боюсь, что вы не сможете найти свойство тега TServerSocket, используя этот метод. Причина в том, что Отправитель является экземпляром TServerWinSocket, а сокет является экземпляром TCustomWinSocket — ни один из них не может быть передан в TServerSocket. Посмотрите в ScktComp.pas (в SourceVcl). TServerSocket-это просто оболочка для внутреннего экземпляра TServerWinSocket.

Вы могли бы сделать что-то вроде этого:

 TMyServerWinSocket = class(TServerWinSocket)
private
  FServerSocket : TServerSocket;
public
  destructor Destroy; override;
  property Server : TServerSocket read FServerSocket write FServerSocket;
end;

TMyServerSocket = class(TServerSocket)
public
  constructor Create(AOwner : TComponent);
end;
 

Реализация будет выглядеть следующим образом:

 destructor TMyServerWinSocket.Destroy;
begin
  Server := nil;
end;

constructor TMyServerSocket.Create(AOwner : TComponent);
begin
  FServerSocket := TMyServerWinSocket.Create(INVALID_SOCKET);
  TMyServerWinSocket(FServerSocket).Server := Self;
  InitSocket(FServerSocket);
  FServerSocket.ThreadCacheSize := 10;
end;
 

Затем (фу, почти готово) в вашем обработчике событий вы можете сделать это:

 procedure TfrmServer.sskServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Index := (Sender as TMyServerWinSocket).Server.Tag;
end;
 

Это означает, что вместо создания объектов TServerSocket в вашем массиве вам нужно будет создать экземпляры TMyServerSocket.

Надеюсь, это поможет.