Делаем примитивный чат на DELPHI. Чат для локальной сети Lan chat zip дельфи с описанием

Добрый день, Хабраюзер. Скажу чесно, я люблю язык Delphi, и считаю, что его неоправданно забыли. А в этом топике, я бы хотел поделится с вами опытом написания чата. Дело это не очень сложное, но весьма и весьма забавное.

Введение.

Для написания этого самого чата я использовал IDE Borland Delphi 7 Lite сборку. Все библиотеки, которые понадобились уже были включены.

Часть I. Пишем интерфейс.

Собственно эта часть и есть наиболее легкая. Для начала, надо обдумать, как будет работать наш чат. Я остановился на ручном выборе порта, адреса сервера, и ника. В принципе, можно самому выбрать порт, и указать в исходном коду, но так мы можем запускать сколь угодно копий программы в режиме сервера, пока не кончаться порты. Итак, создаем четыре поля ввода, один элемент типа Memo, и три кнопки. Не забудьте добавить два сокета, серверный и клиентский. Пишем текст на кнопках. Название программы, иконку. И т.д. На этом, первая часть заканчивается.

Часть 2. Внутренности.

Здесь в принципе, работы немного, но она вся важная. Для начала пишем код для кнопок. Он находится ниже.

procedure TForm1. Button1Click (Sender: TObject ) ;
begin
button2. Enabled : = false ; // Отключаем кнопку сервера
Clsocket. address : = edit1. Text ;
Clsocket. Port : = StrtoInt (edit2. Text ) ; //Записываем порт, и IP
Clsocket. Active : = true ; //Включаем сокет
Clsocket. Open ; // Открываем его
button3. enabled : = true ; //Разблокируем кнопку отправить
end ;

И примерно так же все остальные кнопки.

Для полей ввода ничего не надо.

Отдельно я хочу рассмотреть написание кода для кнопки отправки сообщения т. к. он очень важен.

procedure TForm1. Button3Click (Sender: TObject ) ;
var f: integer ; today : TdateTime ;
begin
today : = now ; //Узнаем время
s1: = edit4. Text ; //Формируем строку с ником и временем отправки
s2: = edit3. Text ;
s3: = "[" + s2+ "] (" + TimetoStr (today) + ") :" + s1; //Склеиваем все вместе
if clsocket. active = true then
ClSocket. Socket . SendText (s3) //Отправляем на сервер строку
else
begin
for f: = 0 to SrSocket. Socket . ActiveConnections - 1 do //Отправляем от имени сервера всем клиентам
begin
Srsocket. Socket . Connections [ f] . SendText (s3) ;
end ;
Memo1. lines . add (s3) ; // Записывам себе сроку чата
end ;
edit4. text : = "" ;
end ;

И наконец, пишем код подключения\отключения\приема сообщения. Тут важно не забыть привязать ивенты к процедурам.

procedure TForm1. SrsocketClientRead (Sender: TObject ;

var i: integer ;
begin
Recieved: = Socket. ReceiveText () ; //Переносим принятый текст в переменную
for i: = 0 to SrSocket. Socket . ActiveConnections - 1 do //Отправляем принятую инфу всем подключенным клиентам
Srsocket. Socket . Connections [ i] . SendText (Recieved) ;
memo1. Lines . add (Recieved) ; //Записываем себе
end ;

procedure TForm1. SrSocketClientDisconnect (Sender: TObject ;
Socket: TCustomWinSocket) ;
begin
Memo1. Lines . Add ("Клиент отсоединился" ) ; //Просто уведомляем сервер
end ;

procedure TForm1. SrSocketClientConnect (Sender: TObject ; Socket: TCustomWinSocket) ;
begin
Memo1. Lines . Add ("Клиент подключился" ) ;
end ;

Часть 3. Финальные тесты.

Эта часть является наиболее короткой. Добавляем в настройках проекта имя, версию, билд, и рисуем иконку.

Также, после некоторых поисков в интернете я нашел вот такой код для указания IP адреса, и включил его в свой чат.

function GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [ 0.. 127] of Char ;
begin
Result : = "" ;
if WSAStartup(WSVer, wsaData) = 0 then begin //Я не хочу здесь что-то комментировать, т.к. до конца сам не уверен, как это работает
if GetHostName(@ Buf, 128 ) = 0 then begin
P : = GetHostByName(@ Buf) ;
if P <> nil then
Result : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
end ;
WSACleanup;
end ;
end ;

Собственно это и есть весь чат. Как видно, написать его очень просто. А я же вам просто благодарен за почтение этого поста.

Удачного дня!

Теги: Delphi, программирование

Некоторые из читателей, глядя на название раздела, могут возмутиться и спросить: "А какое связь между X-Coding и простым чатом?" В принципе, связи нет. Чат - это простая программа, работающая с сетью. Я знаю, что нельзя все подводить под одну гребенку, и если какая-то утилита использует сеть, то это еще не значит, что она хакерская. Но все же я опишу здесь создание чата, потому что мы построим его принципиально на другом протоколе, нежели обычно. В любом случае лишними эти знания не будут.

Но о чате мы поговорим чуть позже, а сейчас немного теории.

На данный момент существует два основных протокола: TCP и UDP. Раньше был еще очень распространен IPX, который использовала фирма Novell. Но на данный момент он отходит, и уже редко увидишь такого зверя. Только на старых системах можно увидеть IPX. Большинство остальных протоколов, которые вы знаете (FTP, HTTP, РОРЗ, SMTP и дальше в том же духе), работают поверх TCP или UDP.

Что это значит: "поверх другого протокола"? В TCP реализованы основные функции для работы с сетью. Он умеет устанавливать соединение с удаленным компьютером, передавать и принимать данные проверять правильность получения сервером отправленных пакетов. Пусть мы хотим создать протокол для передачи файлов (FTP). Для этого мы берем TCP, наделяем его нужными нам возможностями и - получите-распишитесь. Вот и получается, что FTP работает через (поверх) протокола TCP. Если мы захотим создать FTP с чистого листа, то нам придется заново реализовывать функции установки соединения и передачи данных. А так нужно только подготовить данные в специальном формате (протокола FTP) и отдать их протоколу TCP, который сам установит соединение и отдаст эти данные куда надо.

Если вы знакомы с Delphi не понаслышке и хоть немного разобрались в теории ООП, то уже заметили аналогию с объектно-ориентированным программированием. Именно по такому принципу и работает сеть. Все это дело стандартизировано, и если хотите узнать подробнее, то почитайте какую-нибудь документацию про модель OSI (Open Systems Interconnection) и ее семь уровней (тут опять могу отослать на свой сайт или см. разд. 4.1 этой книги). Эта тема довольно интересна, и в любом случае желательно знать устройство протоколов.

Протокол UDP очень похож на TCP. В нем так же реализованы возможности передачи данных, но он не устанавливает соединения и не поддерживает целостности передаваемых данных. Протокол просто открывает порт, выкидывает туда порцию данных и даже не волнуется о том, дошли они до получателя, или нет. Поэтому UDP работает намного быстрей, чем TCP.

Если вы захотите работать с этим протоколом, то проверку правильности получения данных придется реализовывать самим. Поэтому для передачи файлов или другой информации большого размера вы должны выбрать TCP, потому что если хоть один маленький кусочек от файла будет потерян, то его уже будет не восстановить. Ну а для чата, который мы сегодня напишем, более удобным вариантом будет UDP. Он очень быстрый и при маленьких размерах сообщений очень эффективен.

В Delphi для работы с хорошо подходит библиотека

Я думаю, что скоро она станет вашим лучшим другом.

С теорией покончено, давайте переходить к написанию чата. Разомните пальцы, мышку, клавиатуру и запустите Delphi. Сейчас мы приступим к моему любимому занятию - программированию. На форме нам понадобятся 3 компонента.

□ Компонент тмето. Его можно растянуть почти по всей форме.

□ Компонент TEdit, в который мы будем писать отправляемое сообщение.

□ Кнопка TButton, при нажатии которой сообщение будет отсылаться. На рис. 4.21 показана форма будущего чата.

Для работы с портами нам нужны компоненты idUDPClient (умеет отсылать данные, рис. 4.22) с закладки Indy Clients и idUDPServer (умеет получать данные, рис. 4.23) с закладки My Servers. Перенесите по одному такому компоненту на форму.

Рис, 4.22. Свойства компонента idUDPCiient

Рис. 4.23. Свойства компонента idUDPServer

Теперь нужно настроить протокол и О Р. Первое, что мы сделаем - выберем любой порт от 1 до 65 000, через который будет происходить связь. Я решил выбрать 11245 (вы можете выбрать любое другое). Назначьте это значение свойству Port компонента idUDpc lient и свойству De fault Port компонента idUDPServer. Это заставит клиента и сервер работать на одном и том же порте, что необходимо для работы связи.

ЗАПОМНИТЕ!!! Порты протокола UDP не пересекаются с портами TCP. Это значит, что ТСР-порт 80 не равен UDP-порту 80.

Теперь у клиента (idüDPCilent) нужно указать свойство Host. Сюда записывается IP-адрес компьютера, которому будут отправляться сообщения. Но у нас чат и сообщения должны получать все пользователи в сетке, запустившие программу. Поэтому, чтобы не было проблем, желательно установить у обоих компонентов ЖЙТВЭ BroadcastEnabled равным true. А Вместо конкретного IP-адреса использовать широковещательный (такой адрес, который получают все). Если у вас в сетке используются адреса типа 192,168,100.x, то для вас широковещательный адрес будет 192.168.100.255 (последний октет меняем на 255).

Приготовления окончены, можно программировать.

Создайте обработчик события кнопки и напишите там следующий код:

Procedure TForml.ButtonlClick(Sender: TObject); begin IdUDPClientl.Send(Editl.Text); end;

Здесь всего одна строчка, которая отправляет с помощью UDP-клиента содержимое строки ввода (компонента

Теперь нужно научить UDP-сервер получать эту информацию. Для этого создайте обработчик события OnUDPRead ДЛЯ компонента idUDPServer. В нем напишите следующее:

Procedure TForml. IdODPServerlüDPRead (Sender: TObject; ÄEata: TStream; ABrnding: TIdSocketHandle);

var StringFormatedStream: TStringStream; s: String; begin //Инициализация

StringFormatedStream: = TStringStream.Create(""); //Копирование из простого потока в строковый StringFormatedStream.CopyFrom(AData, AData.Size);

//Вывод полученного сообщения

Memol.Lines.Add(ABinding.PeerIP+" "+StringFormatedStream.DataString);

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s , Length(s)); //Освобождение строкового потока StringFormatedStream.Free; end;

У процедуры-обработчика события есть три параметра. Первый присутствует во всех обработчиках и ничего интересного для нас в себе не несет. Второй - это данные, которые получены из сети. Третий - в нем хранится информация о том, откуда пришли данные.

Итак, полученные данные хранятся во втором параметре. Они приходят к нам как простой неформатированный поток TStream. Чтобы удобней было работать с данными, их лучше перегнать в строковый поток Вы думаете, это неудобно? А вдруг вы передаете не текст, а картинку, и компонент отформатирует ее в текст? Вот это уже будет не неудобно, а полный облом!

Посмотрите, как легко все превращается в текст. В обработчике объявлена одна Переменная StringFormatedStream типа TStringStream (строковый поток). Первой строкой кода она инициализируется. Во второй строчке данные из простого неформатированного потока копируются в строковый поток. Все!!! Теперь переданный текст находится в свойстве Datastring строкового ПОГОКа StringFormatedStream. После ЭТОГО МЭЖЕЮ смело ВЫВОДИТЬ этот результат в компоненте Memo.


Рис.4.24. Чат в действии

Но мы же пишем чат, и желательно еще вывести информацию о том, кто передал этот текст. Для примера выводится IP-адрес отправителя данных, который находится в свойстве реепе третьего параметра ABinding. Но это только для примера, и в реальной программе это будет выглядеть некрасиво. О чем это господин 192.168.100.x говорит? А может, это вовсе даже госпожа говорит. Поэтому вы можете добавлять имя отправителя сразу в текст отправки. Код изменится следующим образом:

IdUDPClisntl. Send (" Сюда помести имя отправителя" Editl.Text); Можно дать возможность пользователю вводить имя в отдельной строке ввода Edit2. В этом случае код будет таким; IdUDPClisntl.Send(Edit2.Text+" "+Editl.Text);

На компакт-диске в директории \Примеры\Глава 4\Chat вы можете увидеть пример этой программы.


Думаю вам не раз приходила идея создать свой (корпоративный) чат. Такая же идея пришла и мне, и я как всегда начал искать информацию в сети интернет, но таки ни чего хорошего и не нашел. Все как то не полно описывает как это можно сделать.

И я себе обещал, как изучу так выложу полную информацию по этой теме. Я делал свой чат на сокетах. По ним можно общаться, как по сети интернет, так и по локальной сети. Для этого вам достаточно знать Ip адрес. Программировал на Delphi7.

Установка необходимых компонентов

Так как я делал на delphi7, там не было по умолчанию тех компонентов, которые мне нужны. (ServerSocket1 , ClientSocket1 ).
Для этого нужно добавить компоненты Сокета.

В меню заходим Component --> Install Packages…--> Add --> dclsockets70.bpl

И указываем путь к пакету с компонентами, он находиться в корневом папке Delphi в паке Bin. У меня он находился в:

C:\Program Files\Borland\Delphi7\Bin\ dclsockets70.bpl

После такого добавления у вас в вкладке Internet должны появиться данные компоненты.

Размещение компонентов и написание кода

На форму я кинул такие элементы: ServerSocket1, ClientSocket1, Edit1 (для чата), Edit2 (для IP адреса сервера), Memo1 для отображения сообщения, ну и 3 кнопки.

Для создания Сервера пишем на событие в кнопке вот такую вещь:

function GetLocalIP: String ;
const WSVer = $101;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array of Char;
begin
Result:= "";
if WSAStartup(WSVer, wsaData) = 0 then begin
if GetHostName(@Buf, 128) = 0 then begin
P:= GetHostByName(@Buf);
if P <> nil then
Result:= iNet_ntoa(PInAddr(p^.h_addr_list^)^);
end ;
WSACleanup;
end ;
end ;

procedure TForm1.Button3Click(Sender: TObject);
begin
ServerSocket1.Port:=65000; // Порт вашего сервера, задаем любой какой вам понравиться
ServerSocket1.Active:=True; // активируем сервер
ServerSocket1.Open; //запускаем
ShowMessage("Ваш IP: "+GetLocalIP); //выдаем наш IP адрес, чтоб клиент смог к нам подключиться
end ;

После того как сервер был включен, клиент сможет подключиться к серверу.
Для этого он прописывает IP адрес сервера в Edit2, И нажимает кнопку соединиться:

procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Address:=Edit2.Text; // IP адрес сервера
ClientSocket1.Port:=65000; //его порт
ClientSocket1.Active:=True; //активируем клиента
ClientSocket1.Open; //запускаем
end ;

Внимание : Клиент может только отправлять сообщение, а Сервер в свою очередь – принимать. Для двустороннего общения включите Клиента и Сервера на двух программах разного конца сети.

Для чтения сообщения, у сервера есть ожидание приема сообщения…вот она

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
memo1.Lines.add(Socket.RemoteAddress+": ");
memo1.Lines.add(Socket.ReceiveText);
StatusBar1.Panels.Items.Text:=Socket.RemoteAddress;
end ;

Для отправки сообщения я написал в двух процедурах. Вот они:

procedure TForm1.SendMes(Text: String );
begin
if form1.ServerSocket1.Active then
if form1.ServerSocket1.Socket.ActiveConnections>0 then
form1.ServerSocket1.Socket.Connections.SendText(Text);

if form1.ClientSocket1.Active then
form1.ClientSocket1.Socket.SendText(Text);
end ; procedure TForm1.Button1Click(Sender: TObject);
begin
SendMes(Edit1.Text);
memo1.Lines.add(GetLocalIP+": ");
memo1.Lines.add(Edit1.Text);
end ;

new player 4 июля 2012 в 18:26

Пишем свой ведосипед на Delphi

  • Чулан *

Добрый день, Хабраюзер. Скажу чесно, я люблю язык Delphi, и считаю, что его неоправданно забыли. А в этом топике, я бы хотел поделится с вами опытом написания чата. Дело это не очень сложное, но весьма и весьма забавное.

Введение.

Для написания этого самого чата я использовал IDE Borland Delphi 7 Lite сборку. Все библиотеки, которые понадобились уже были включены.

Часть I. Пишем интерфейс.

Собственно эта часть и есть наиболее легкая. Для начала, надо обдумать, как будет работать наш чат. Я остановился на ручном выборе порта, адреса сервера, и ника. В принципе, можно самому выбрать порт, и указать в исходном коду, но так мы можем запускать сколь угодно копий программы в режиме сервера, пока не кончаться порты. Итак, создаем четыре поля ввода, один элемент типа Memo, и три кнопки. Не забудьте добавить два сокета, серверный и клиентский. Пишем текст на кнопках. Название программы, иконку. И т.д. На этом, первая часть заканчивается.

Часть 2. Внутренности.

Здесь в принципе, работы немного, но она вся важная. Для начала пишем код для кнопок. Он находится ниже.

procedure TForm1. Button1Click (Sender: TObject ) ;
begin
button2. Enabled : = false ; // Отключаем кнопку сервера
Clsocket. address : = edit1. Text ;
Clsocket. Port : = StrtoInt (edit2. Text ) ; //Записываем порт, и IP
Clsocket. Active : = true ; //Включаем сокет
Clsocket. Open ; // Открываем его
button3. enabled : = true ; //Разблокируем кнопку отправить
end ;

И примерно так же все остальные кнопки.

Для полей ввода ничего не надо.

Отдельно я хочу рассмотреть написание кода для кнопки отправки сообщения т. к. он очень важен.

procedure TForm1. Button3Click (Sender: TObject ) ;
var f: integer ; today : TdateTime ;
begin
today : = now ; //Узнаем время
s1: = edit4. Text ; //Формируем строку с ником и временем отправки
s2: = edit3. Text ;
s3: = "[" + s2+ "] (" + TimetoStr (today) + ") :" + s1; //Склеиваем все вместе
if clsocket. active = true then
ClSocket. Socket . SendText (s3) //Отправляем на сервер строку
else
begin
for f: = 0 to SrSocket. Socket . ActiveConnections - 1 do //Отправляем от имени сервера всем клиентам
begin
Srsocket. Socket . Connections [ f] . SendText (s3) ;
end ;
Memo1. lines . add (s3) ; // Записывам себе сроку чата
end ;
edit4. text : = "" ;
end ;

И наконец, пишем код подключения\отключения\приема сообщения. Тут важно не забыть привязать ивенты к процедурам.

procedure TForm1. SrsocketClientRead (Sender: TObject ;

var i: integer ;
begin
Recieved: = Socket. ReceiveText () ; //Переносим принятый текст в переменную
for i: = 0 to SrSocket. Socket . ActiveConnections - 1 do //Отправляем принятую инфу всем подключенным клиентам
Srsocket. Socket . Connections [ i] . SendText (Recieved) ;
memo1. Lines . add (Recieved) ; //Записываем себе
end ;

procedure TForm1. SrSocketClientDisconnect (Sender: TObject ;
Socket: TCustomWinSocket) ;
begin
Memo1. Lines . Add ("Клиент отсоединился" ) ; //Просто уведомляем сервер
end ;

procedure TForm1. SrSocketClientConnect (Sender: TObject ; Socket: TCustomWinSocket) ;
begin
Memo1. Lines . Add ("Клиент подключился" ) ;
end ;

Часть 3. Финальные тесты.

Эта часть является наиболее короткой. Добавляем в настройках проекта имя, версию, билд, и рисуем иконку.

Также, после некоторых поисков в интернете я нашел вот такой код для указания IP адреса, и включил его в свой чат.

function GetLocalIP: String ;
const WSVer = $101 ;
var
wsaData: TWSAData;
P: PHostEnt;
Buf: array [ 0.. 127] of Char ;
begin
Result : = "" ;
if WSAStartup(WSVer, wsaData) = 0 then begin //Я не хочу здесь что-то комментировать, т.к. до конца сам не уверен, как это работает
if GetHostName(@ Buf, 128 ) = 0 then begin
P : = GetHostByName(@ Buf) ;
if P <> nil then
Result : = iNet_ntoa(PInAddr(p^ . h_addr_list ^ ) ^ ) ;
end ;
WSACleanup;
end ;
end ;

Собственно это и есть весь чат. Как видно, написать его очень просто. А я же вам просто благодарен за почтение этого поста.

Удачного дня!

Теги: Delphi, программирование

В этой теме я хотел бы подробно написать как создать самый простой свой ICQ чат на Delphi!

Что нам для этого потребуется:
1.Delphi (лучше всего использовать 7)
2.Установленный компонент TICQ .
3.Прямые руки.

Приступим!
И так создаем новый проект в Delphi и кидаем на форму компонент TICQ.
кидаем на форму Memo1 , EDit1,Edit2,button1,ListBox1,L istBox2 .
Пояснение:
Memo1 - лог чата
Edit1 - UIN
Edit2 - password
button1 - подключение
ListBox1 - online user
ListBox2 - reg user

Button1:

Procedure TForm1.Button1Click(Sender: TObject); begin ICQClient1.UIN:=StrToInt(Edit1.Text); ICQClient1.Password:=Edit2.Text; icqclient1.Login(); end;

Cобытие ICQClient1MessageRecv1 должно выглядить следующим образом:

Procedure TForm1.ICQClient1MessageRecv1(Sender: TObject; Msg, UIN: String); begin Memo1.Lines.Add(trim(nick(UIN))+": "+Msg); //лог if Msg<>"!" then //если сообщение начинается с "!" не кидаем в чат begin if OnLine(UIN)<>-1 then //проверка в чате ли юзер Send(Msg,UIN) //если в чате то принимает сообщения в чат else if Reged(UIN)=-1 then//проверка на регистрацию icqclient1.SendMessage(StrToInt(UIN), "добро пожаловать в чат!" + #13#10 + "для регистрации введите!рег<ваш ник>") else begin icqclient1.SendMessage(StrToInt(UIN), "Для входа в чат используйте команду!чат" + #13#10 + "Для помощи пошлите!справка") //юзер не в чате! end; end else Command(UIN,Msg); //команды чата! end;

Функция OnLine:

Function TForm1.OnLine(UIN:string):integer; var i:integer; begin OnLine:=-1; for i:=0 to ListBox1.Items.Count-1 do if Trim(Copy(ListBox1.Items[i],4,9))=UIN then //длинна уина OnLine:=i; end;

Отправка сообщений в чат:

Procedure TForm1.Send(Msg,UIN:string); var i2:integer; i:integer; Str,Str2:string; begin Str2:=ListBox1.Items; for i:=0 to ListBox1.Items.Count-1 do begin if i2=5 then begin Sleep(2000); i2:=0; end; if OnLine(UIN)<>i then begin i2:=i2+1; Str:=ListBox1.Items[i]; if Trim(Copy(Str,1,2))=Trim(Copy(Str2,1,2)) then icqclient1.SendMessage(StrToInt(Copy(ListBox1.Items[i],4,9)), nick(UIN)+": "+Msg); end; end; end;

Функция Ник:

Function TForm1.nick(UIN:string):string; begin if Reged(UIN)<>-1 then nick:=TRIM(Copy(ListBox2.Items,13,50)) end

Функция Reged:

Function TForm1.Reged(UIN:string):integer; var i:integer; begin Reged:=-1; for i:=0 to ListBox2.Items.Count-1 do if Copy(ListBox2.Items[i],4,9)=UIN then Reged:=i; end;

И на конец процедура Command (команды чата):

Procedure TForm1.Command(UIN,Msg:string); var i,i1,razdel:integer; command,key,key2:string; Str:string; help: TStrings; begin try razdel:=0; for i:=1 to Length(Msg) do begin help:= TStringList.Create; help.LoadFromFile("command/help.txt"); //Открыть файл с текстом if (Msg[i]=" ") and (razdel=0) then razdel:=i; end; if razdel<>0 then begin command:=Copy(Msg,1,razdel-1); key:=Copy(Msg,razdel+1,Length(Msg)); key2:=Copy(Msg,razdel+1,Length(Msg)); end else begin command:=Msg; key:=""; end; if (command="!чат") or (command = "!chat") then begin ListBox1.Items.Append(ListBox2.Items); icqclient1.SendMessage(StrToInt(UIN), "вы вошли"); end; if (command = "!help") or (command ="!справка") then begin if OnLine(UIN)<>-1 then begin icqclient1.SendMessage(StrToInt(UIN), help.Text); end else icqclient1.SendMessage(StrToInt(UIN), "Чтобы использовать команды войдите в чат!"); end; //end; if (command="!выход") or (command = "!Выход") or (command = "!ВЫХОД") then begin ListBox1.Items.Delete(OnLine(UIN)); end; if (command="!рег") or (command="!ник") or (command="!РЕГ") and (key<>"") then begin if Reged(UIN)<>-1 then icqclient1.SendMessage(StrToInt(UIN), "Вы уже зарегистрированы в чате!:)") else if (Length(Trim(key))>15) then icqclient1.SendMessage(StrToInt(UIN), "Слишком длинный ник, Он должен быть длинной больше 3 и менее 15 символов, не должен сожержать пробелов") else if (Length(Trim(key))<3) then icqclient1.SendMessage(StrToInt(UIN), "Слишком короткий ник, Он должен быть длинной,больше 3 и менее 15 символов, не должен сожержать пробелов") else //if (Length(Trim(UIN))<9) then //icqclient1.SendMessage(StrToInt(UIN), "Ваш уин не подходит для регистрации!") //else begin ListBox2.Items.Append("0 "+UIN+" "+Trim(Key)); icqclient1.SendMessage(StrToInt(UIN), "Вы успешно зарегистрировались!Для входа в чат наберите!чат"); ListBox2.Items.SaveToFile("user/user.txt"); end; end; //end; except end; end;