- •Палітра Компонентів Delphi
- •Редактор Коду Delphi
- •Конструктор Форм
- •Інспектор Об’єктів. Принцип візуальної розробки програм
- •Завершення роботи з проектом та створення нового проекту
- •Збереження проекту
- •Відкриття існуючого проекту
- •Робота з Delphi-програмою Структура Delphi-програм
- •Виконання Delphi-програми
- •Завершення виконання Delphi-програми
- •Лабораторна робота №1
- •Завдання
- •Теоретичні відомості
- •Лабораторна робота №2
- •Розробка проекту «Діалог»
- •Мал. Діалог Аналіз проекту
- •Хід роботи
- •Завдання для самостійного виконання
- •Лабораторна робота №3
- •Завдання
- •Теоретичні відомості
- •Лабораторна робота №4
- •Розробка проекту «Ваша вага»
- •Хід роботи
- •Розробка проекту «Обмін валюти»
- •Хід роботи
- •Лабораторна робота №5
- •Завдання
- •Хід роботи
- •Теоретичні відомості Оператори if і case мови Паскаль
- •Кнопки-перемикачі в Delphi|
- •Лабораторна робота №6
- •Завдання
- •Хід роботи
- •Теоретичні відомості Типи даних для роботи з|із| рядками Короткі рядки типу|типа| ShortString| і String|[n]
- •Довгий рядок типу|типа| String|
- •Компонент tComboBox|
- •Компонент tBitBtn|
- •Обробка подій
- •Лабораторна робота №7
- •Розробка проекту «Гороскоп»
- •Хід роботи
- •Розробка проекту «Фізичний конвектор»
- •Хід роботи
- •Лабораторна робота №8
- •Розробка проекту «Рейтинг країн за результатами олімпійських змагань»
- •Хід роботи
- •Лабораторна робота №9
- •Розробка проекту «Журнал олімпіади»
- •Хід роботи
- •Лабораторна робота №10
- •Завдання
- •Хід роботи
- •2. Установка
- •3. Тестування створеної компоненти
- •Лабораторна робота №11
- •Розробка проекту «Побудова графіка функції»
- •Хід роботи
- •Лабораторна робота №12
- •Розробка проекту «Графічний конструктор»
- •Хід роботи
- •Лабораторна робота №13
- •Розробка проекту «Чат для локальної та глобальної мережі»
- •Хід роботи
- •Розробка форми на настройок
- •Розробка програмного коду
- •Лабораторна робота №14.
- •Завдання
- •Хід роботи
- •Теоретичні відомості
- •Етапи створення баз даних в Delphi.
- •Компонент тТаblе
- •Модуль даних
- •Лабораторна робота №15
- •Завдання
- •Хід роботи
- •Теоретичні відомості
- •Лабораторна робота №16
- •Завдання
- •Хід роботи
- •Теоретичні відомості
- •Лабораторна робота №17
- •Завдання
- •Хід роботи
- •Теоретичні відомості
- •Лабораторна робота №18
- •Завдання
- •Хід роботи
- •Теоретичні відомості
- •Список літератури
Розробка програмного коду
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. Запустити проект та перевірити правильність його виконання.
Питання для самоконтролю:
На основі чого реалізуються програми архітектури клієнт/сервер в Borland Delphi?
Які компоненти використовуються для програмування клієнта та сервера?
Яка властивість визначає тип серверу?
Яка властивість визначає чи активний сервер чи ні?
Яка подія виникає тоді, коли клієнт передав серверу будь-які дані?
Яка властивість виникає тоді, коли клієнт встановлює сокетне зєднання і чекає відповіді від серверу?
Який метод дозволяє відкриття сокету?
Яка властивість визначає ІР-адресу компютера, до якого слід підключитися?
