Вы можете сделать клиент ОПРОС для отключения, добавив подпрограмму таймера к клиенту - это ПРОСТОЙ способ.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
idTCPClient1.Connected; // Works in Indy for Delphi XE4
// Be aware this is a property read with side effects
// It shouldn't get optimized out, but if it does,
// then add the appropriate directives to prevent that.
end;
Это должно привести к тому, что код будет вести себя так же, как и старый TClientSocket (и как это делает TidTelnet). Он генерирует флаг hsDisconnected для события OnStatus, если сервер внезапно исчезает (т. Е. Как только процедура таймера запуска обнаруживает это). Однако этот особый случай потери сервера, приводящей к отключению, НЕ запускает событие OnDisconnect - только OnStatus. Поэтому, вероятно, лучше всегда использовать OnStatus для перехвата всех отключений, будь то клиент или сервер. Я использовал таймер, установленный на 100 мс, но я думаю, что вы можете сделать его так часто или медленно, как вы хотите - он, похоже, не приносит никакого вреда.
ПРИМЕЧАНИЕ: ДЛЯ DELPHI 7 (и, возможно, других версий от D7 до XE4) вам придется сделать это немного по-другому:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// This no longer works this way in Indy for XE4, but works in Indy for D7 ...
idTCPClient1.CheckForGracefulDisconnect(FALSE);
end;
Кстати - если вы используете Delphi 6, забудьте о Indy, тогда он был слишком глючным.