#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.
Надеюсь, это поможет.