Листинг 11.24.
Обработка строки, полученной от сервера
procedure ProcessMessage(strMessage: string);
var
strAction: string; //Тип сообщения (префикс сообщения)
len: Integer; //Длина строки strAction
begin
//Определим тип сообщения и выполним соответствующие действия
len := Pos(\':\', strMessage);
strAction := Copy(strMessage,1,len-1);
Delete(strMessage,1,len);
if (strAction = \'ok\') then
begin
//Регистрация пользователя завершена – можно отправлять
//сообщения
Connect;
end
else if (strAction = \'error\') then
begin
//Ошибка!!!
frmClient.TCPClient.Disconnect;
Disconnect;
MessageDlg(strMessage, mtError, [mbOK], 0);
end
else if (strAction = \'adduser\') then
begin
//К разговору присоединился новый пользователь
frmClient.lstUsers.Items.Add(strMessage);
end
else if (strAction = \'deluser\') then
begin
//Какой-то пользователь отсоединился
frmClient.lstUsers.Items.Delete(
frmClient.lstUsers.Items.IndexOf(strMessage));
end
else begin
//Покажем принятое сообщение
frmClient.txtChat.Lines.Add(strMessage);
end;
end;
Далее приводятся обработки событий, на которых, собственно, и основана работа клиентской программы. Обработчик нажатия кнопки cmbConnect, приведенный в листинге 11.25, пытается присоединиться к серверу. Если клиент присоединен к серверу, то эта же кнопка используется для его отсоединения.
Листинг 11.25.
Присоединение/отсоединение от сервера
procedure TfrmClient.cmbConnectClick(Sender: TObject);
begin
if (cmbConnect.Caption = \'Подключиться\') then
begin
//Проверим, чтобы были введены имя сервера
//и имя пользователя
if (txtServer.Text = \'\')then
begin
MessageDlg(\'Введите имя сервера в текстовое поле.\',
mtInformation, [mbOK], 0);
Exit;
end
else if (txtUser.Text = \'\')then
begin
MessageDlg(\'Введите имя пользователя в текстовое поле.\',
mtInformation, [mbOK], 0);
Exit;
end;
//Пытаемся подключиться к серверу
try
TCPClient.Host := txtServer.Text;
TCPClient.Connect;
except
MessageDlg(\'Не удается соединиться с сервером\',mtError,
[mbOK], 0);
end;
end
else
//Отключаемся от сервера
TCPClient.Disconnect;
end;
Обработчик нажатия кнопки cmbSend (листинг 11.26) отправляет сообщение, которое могут прочесть все пользователи, присоединенные к серверу.
Листинг 11.26.
Отправка сообщения всем собеседникам
procedure TfrmClient.cmbSendClick(Sender: TObject);
begin
if (txtMessage.Text <> \'\') then
begin
//Отправка сообщения всем собеседникам
TCPClient.WriteLn(\'text:\' + txtMessage.Text);
txtMessage.Text := \'\
txtMessage.SetFocus;
end;
end;
При двойном щелчке кнопкой мыши на имени в списке пользователей отправляется сообщение, которое получает только выделенный в списке пользователь (листинг 11.27).