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

6 Июл
2012

Добрый день, Блогаюзер. Скажу чесно, я люблю язык 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.ActiveConnections1 do //Отправляем от имени сервера всем клиентам
    begin
  Srsocket.Socket.Connections[f].SendText(s3);
  end;
   Memo1.lines.add(s3); // Записывам себе сроку чата
  end;
edit4.text:=»;
end;


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

procedure TForm1.SrsocketClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
 var i:integer;
 begin
  Recieved:=Socket.ReceiveText(); //Переносим принятый текст в переменную
   for i:=0 to SrSocket.Socket.ActiveConnections1 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;


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

Удачного дня!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх