Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторні роботи_ООП.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
7.3 Mб
Скачать

Розробка програмного коду

11. Для того, щоб користувач не вводив всі настройки кожен раз заново, будемо зберігати їх в INI-файлі. Для форми Settings оголосимо змінну path типу String і Win типу TIniFile:

var

settings: Tsettings;

path:string;

win:TiniFile;

також для роботи з INI-файлами добавимо в розділ uses посилання на IniFiles:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, IniFiles, StdCtrls;

Таке посилання необхідно добавити і в розділ uses головної форми програми. Змінимо також розділ var:

var

Form1: TForm1;

win:TiniFile;

path, s, disco:string;

f:file of byte; i: integer;

ipc, ips, name:string;

12. Створимо обробник події OnClick для пункту меню Настройки:

procedure TForm1.N5Click(Sender: TObject);

begin

settings.ShowModal;

win:=TIniFile.Create(path); name:=win.ReadString('settings','name',name);

ips:=win.ReadString('settings','ips',ips);

ipc:=win.ReadString('settings','ipc',ipc);

win.Free;

end;

13. При натисненні кнопки встановити буде виконано запис запам’ятовування введених настройок:

procedure Tsettings.Button1Click(Sender: TObject);

begin

path:=getcurrentdir+'\settings.ini';

win:=TIniFile.Create(path); win.WriteString('settings','name',name.Text);

win.WriteString('settings','ips',ips.Text); win.WriteString('settings','ipc',ipc.Text);

win.Free;

close;

end;

14. Тепер розглянемо головну форму. Створимо для неї обробник події OnCreate:

procedure TForm1.FormCreate(Sender: TObject);

begin

path:=getcurrentdir+'\settings.ini';

if fileExists(path)=false

then begin

assignfile(f,path); rewrite(f); closefile(f);

win:=TIniFile.Create(path); win.WriteString('settings','name','Noname');

win.WriteString('settings','ips','127.0.0.1'); win.WriteString('settings','ipc','127.0.0.1');

win.Free;

end;

win:=TIniFile.Create(path);

name:=win.ReadString('settings','name',name); ips:=win.ReadString('settings','ips',ips);

ipc:=win.ReadString('settings','ipc',ipc); win.Free;

client.Host:=ipc;

end;

15. Тепер створимо обробник події onClick для пунктів меню З’єднання.

Для пункту Створити:

procedure TForm1.create1Click(Sender: TObject);

begin

server.Active:=true;

txt.Lines.Add('створюємо новий чат ...');

create1.Enabled:=false; connect1.Enabled:=false; disconnect1.Enabled:=true;

send.Enabled:=true;

end;

Для пункту З’єднати:

procedure TForm1.connect1Click(Sender: TObject);

begin

Client.Host:=ips; Client.Active:=true; create1.Enabled:=false; connect1.Enabled:=false;

send.Enabled:=true; disconnect1.Enabled:=true;

end;

Для пункту Роз’єднати:

procedure TForm1.disconnect1Click(Sender: TObject);

begin

if Client.Active=true then Client.Active:=false else Server.Active:=false;

send.Enabled:=false; disconnect1.Enabled:=false;

create1.Enabled:=true; connect1.Enabled:=true; send.Enabled:=false;

end;

Тут ми спочатку перевіряємо, чи активний клієнт. Якщо так, то від’єднаємо його, в протилежному випадку від’єднаємо сервер. Як ви замітили, постійно йде активація/деактивація кнопки і пунктів меню. Це запобігає від помилок, які можуть виникнути при виборі команди Роз’єднати у випадку відсутності з’єднання або ж спроби відіслати повідомлення, коли ви знаходитись в чаті і т.д.

16. Для відправлення повідомлення потрібно натиснути кнопку Відправити або натиснути клавішу Enter. Обробник події OnClick для кнопки відправити:

procedure TForm1.sendClick(Sender: TObject);

begin

txt.Lines.Add(name+':'+sms.Text);

if Server.Active=true then

begin

Server.Socket.Connections[0].SendText(name+':'+sms.Text);

end

else

begin

Client.Socket.SendText(name+':'+sms.Text);

end;

sms.Clear;

end;

Тут ми перевіряємо, є ми сервером чи клієнтом, а потім відправляємо своє ім’я разом з повідомленням у відповідності з поставленою умовою.

17. Для того, щоб користувачу не приходилось тягнутися до мишки після кожної репліки, забезпечимо відправку повідомлення при натисненні клавіші Enter. Для того створимо для компонента smsобробник події OnKeyPress;

procedure TForm1.smsKeyPress(Sender: TObject; var Key: Char);

begin

if (key=#13) and (send.Enabled=true)then send.Click;

end;

18. Тепер залишилось обробити події клієнта і сервера. Для клієнта створимо обробник події OnConnect:

procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

begin

Socket.SendText('!d1~'+name); txt.Lines.Add('Ви в чаті ...');

end;

Подія клієнта OnDisconnect виникає при виході із чату або при роз’єднані:

procedure TForm1.ClientDisconnect(Sender: TObject;

Socket: TCustomWinSocket);

begin

Socket.SendText('!d2~'+name); txt.Lines.Add('Ви покинули чат ...');

end;

19. Створимо для сервера обробник події OnClientRead:

procedure TForm1.ServerClientRead(Sender: TObject;

Socket: TCustomWinSocket);

begin

disco:=''; s:=Socket.ReceiveText;

if (s[1]='!')and (s[2]='d') and (s[3]='1') and (s[4]='~')

then begin

for i:=5 to length(s) do

disco:=disco+s[i];

txt.Lines.Add('В чат зайшов '+disco);

end;

if (s[1]='!')and (s[2]='d') and (s[3]='2') and (s[4]='~')

then begin

for i:=5 to length(s) do

disco:=disco+s[i];

txt.Lines.Add('Чат покинув '+disco);

end;

if (s[1]<>'!')and(s[4]<>'~') then txt.Lines.Add(s)

end;

20. Для сигналізації про помилки в обробниках подій OnError(для клієнта) і OnClientError(для сервера):

procedure TForm1.ServerClientError(Sender: TObject;

Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

var ErrorCode: Integer);

begin

txt.Lines.Add('Виникла помилка ...');

end;

procedure TForm1.ClientError(Sender: TObject; Socket: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode: Integer);

begin

txt.Lines.Add('Виникла помилка ...');

end;

Обробник подіїOnDestory:

procedure TForm1.FormDestroy(Sender: TObject);

begin

if Client.Active= true then Client.Active:=false;

if Server.Active=true then Server.Active:=false;

end;

21. Зберегти проект у палці C:\Delphi\lab_l3.

22. Запустити проект та перевірити правильність його виконання.

Питання для самоконтролю:

  1. На основі чого реалізуються програми архітектури клієнт/сервер в Borland Delphi?

  2. Які компоненти використовуються для програмування клієнта та сервера?

  3. Яка властивість визначає тип серверу?

  4. Яка властивість визначає чи активний сервер чи ні?

  5. Яка подія виникає тоді, коли клієнт передав серверу будь-які дані?

  6. Яка властивість виникає тоді, коли клієнт встановлює сокетне зєднання і чекає відповіді від серверу?

  7. Який метод дозволяє відкриття сокету?

  8. Яка властивість визначає ІР-адресу компютера, до якого слід підключитися?