========================= 
 Устанавливаем свойства компонентов 
 ========================= 
 Label1.Caption - "UIN:" 
 Label2.Caption - "Пароль:" 
 Edit1.Text/Edit2.Text - "" 
 Edit1.MaxLength - 9 
 Edit2.MaxLength - 8 
 Button1.Caption - "Вход" 
 Button2.Caption - "Выход" 
 Memo1.ReadOnly - True 
 Memo1.ScrollBars - ssVertical 
 Memo1.Lines - удалить строку Memo1 
 Timer1.Enabled - False 
 Timer1.Interval - 110000 
 ICQClient1.ConvertToPlaintext - True  =================== 
 Соединение с сервером ICQ 
 =================== 
 Создаем событие OnClick на Button1. Пишем процедуру обработки события: 
 procedure TForm1.Button1Click(Sender: TObject); 
 begin 
 //Проверка правельности заполнения полей 
 if (Edit1.Text = '') or (Edit2.Text = '') or 
 (Length(Edit1.Text) < 5) or (Length(Edit2.Text) < 3) 
 then 
 begin 
 MessageDlg('Не правельно заполнены поля!',mtInformation,[mbOk],0); 
 Exit; 
 end; 
 rec := True; //Это глобальная переменная (которую кстати нужно определить). Нужна для различия неудачного соединения и разъединения 
 ICQClient1.UIN := StrToInt(Edit1.Text); 
 ICQClient1.Password := Edit2.Text; 
 ICQClient1.Login(); //Соединяемся с сервером 
 Memo1.Lines.Add('Соединение с сервером ICQ...'); 
 end; 
 =============== 
 Проверка соединения 
 =============== 
 Создаем событие OnLogin для ICQClient1. 
 procedure TForm1.ICQClient1Login(Sender: TObject); 
 begin 
 //Если соединились, то добовляем соответстующее сообщение в Memo1 
 if ICQClient1.LoggedIn then 
 begin 
 Memo1.Lines.Add('Соединение с сервером установлено.'); 
 Timer1.Enabled := True; 
 end; 
 end; 
 ==================== 
 Если не удалось соединиться 
 ==================== 
 Создаем событие OnConnectionFailed для ICQClient1. 
 procedure TForm1.ICQClient1ConnectionFailed(Sender: TObject); 
 begin 
 if not rec then Exit; //Если мы нажали на кнопку "Выход", то не нужно пытаться соединиться 
 Memo1.Lines.Add('Не удалось соединиться с сервером.'); 
 if MessageDlg('Попытаться соединиться еще раз?',mtInformation,[mbOk,mbCancel],0) = mrOk 
 then 
 begin 
 ICQClient1.Login(); 
 Memo1.Lines.Add('Соединение с сервером ICQ...'); 
 end; 
 end; 
 ============== 
 Посылаем KeepAlive 
 ============== 
 Создаем событие OnTimer для Timer1. 
 procedure TForm1.Timer1Timer(Sender: TObject); 
 begin 
 ICQClient1.SendKeepAlive; 
 end; 
 Отсылать KeepAlive нужно каждые 2 минуты, чтобы чтобы сервер помечал нас как online. Вот для этого и нужен таймер. 
 ================== 
 Разъединяемся с сервером 
 ================== 
 Создаем событие OnClick на Button2. 
 procedure TForm1.Button2Click(Sender: TObject); 
 begin 
 if not ICQCLient1.LoggedIn then 
 MessageDlg('Соединение с сервером не установлено!',mtInformation,[mbOk],0) 
 else 
 begin 
 rec := False; 
 ICQCLient1.Disconnect; 
 Memo1.Lines.Add('Соединение с сервером оборвано.'); 
 Timer1.Enabled := False; 
 end; 
 end; 
 ======================== 
 Обработка полученных сообщений 
 ======================== 
 Создаем событие OnMessageRecv для ICQClient1. 
 procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String); 
 var 
 icq: cardinal; 
 begin 
 icq := StrToInt(UIN); 
 Memo1.Lines.Add(UIN + ': ' + Msg); //Добавляем полученное сообщение в Memo1 
 ICQClient1.SendMessage(icq,'Привет'); //Отсылаем ответ 
 end; 
 Вот теперь скелет