Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 51

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

procedure RegisterClient(Connection: TIdTCPServerConnection;

strName: string);

var

i: Integer;

begin

//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΅Ρ‰Π΅ Π½Π΅ использовалось

for i:=1 to MAX_CLIENT do

begin

if (clients[i].fNamed) then

if (clients[i].strName = strName) then

begin

//Π”ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ – придСтся Ρ€Π°Π·Ρ€Ρ‹Π²Π°Ρ‚ΡŒ соСдинСниС

Connection.WriteLn(\'error:ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ "\' +

strName + \'" ΡƒΠΆΠ΅ участвуСт Π² Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π΅.’);

DeleteClient(Connection);

Connection.Socket.Close;

Exit;

end;

end;

//Поиск записи ΠΎ Π½ΡƒΠΆΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ ΠΈ присвоСниС Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ

for i:=1 to MAX_CLIENT do

begin

if (not clients[i].fNamed and clients[i].fUsed) then

if (clients[i].Connection = Connection) then

begin

//Π’ΠΎΡ‚ ΠΎΠ½, наш клиСнт…

clients[i].fNamed := True;

clients[i].strName := strName;

//Π‘ΠΎΠΎΠ±Ρ‰ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎ появлСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ участника

SendAll(\'adduser:\' + strName);

SendAll(\'text:К Π½Π°ΠΌ присоСдинился "\' + strName +

\'". ΠŸΠΎΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΠ΅ΠΌ!\');

//ΠžΡ‚ΡΡ‹Π»Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΊΠ½ΠΈΠ΅Π½Ρ‚Ρƒ список ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… участников

//Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°

SendClientList(Connection);

//Π Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΎΡ‚ΡΡ‹Π»Π°Ρ‚ΡŒ сообщСния

Connection.WriteLn(\'ok:\');

//Если Π½ΡƒΠΆΠ½ΠΎ, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ событиС Π² список

if (REPORT) then AddEvent(\'ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ "\' +

strName + \'" Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ "\' +

Connection.Socket.Binding.PeerIP + \'"\');

end;

end;

end;

Π’ листингС 11.19 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° слуТСбная функция, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TIdTCPServerConnection, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ этому ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

...

Листинг 11.19.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ Π΅Π³ΠΎ соСдинСнию с сСрвСром

function GetClientName(Connection: TIdTCPServerConnection):string;

var

i: Integer;

begin

for i:=1 to MAX_CLIENT do

if (clients[i].fNamed) then

if (clients[i].Connection.Socket.Binding.Handle =

Connection.Socket.Binding.Handle) then

begin

GetClientName := clients[i].strName;

Exit;

end;

end;

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² листингС 11.20 приводится главная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° сСрвСрного прилоТСния, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ сообщСния, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

...

Листинг 11.20.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сообщСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

procedure ProcessMessage(Connection: TIdTCPServerConnection;

strMessage: string);

var

strName: string; //Имя отправитСля сообщСния

strAction: string; //Π‘Ρ‚Ρ€ΠΎΠΊΠ° с ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ дСйствия (прСфикс)

len: Integer; //Π”Π»ΠΈΠ½Π° строки strAction

begin

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…ΠΎΡ‡Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚

len := Pos(\':\', strMessage);

strAction := Copy(strMessage,1,len-1);

Delete(strMessage,1,len);

if (strAction = \'name\') then

begin

//ΠšΠ»ΠΈΠ΅Π½Ρ‚ сообщаСт своС имя – пытаСмся Π΅Π³ΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

RegisterClient(Connection, strMessage);

end

else if (strAction = \'text\') then

begin

//ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ сообщСниС всСм – подпишСм сообщСниС ΠΈ ΠΎΡ‚ΠΎΡˆΠ»Π΅ΠΌ

strMessage := GetClientName(Connection) + \': \' + strMessage;

SendAll(\'text:\' + strMessage);

//Если Π½Π°Π΄ΠΎ, Ρ‚ΠΎ сохраняСм сообщСниС Π² спискС событий

if (REPORT) then AddEvent(\'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ \' + strMessage);

end

else

begin

//ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ сообщСниС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ собСсСднику

//(строка strAction содСрТит имя собСсСдника)

strName := GetClientName(Connection);

SendTo(\'text:\' + strName + \': \' + strMessage, strAction);

if (strName <> strAction) then

//ΠŸΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ копию сообщСния ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŽ

Connection.WriteLn(\'text:\' + strName + \' для \' +

strAction + \': \' + strMessage);

//Если Π½Π°Π΄ΠΎ, Ρ‚ΠΎ сохраняСм сообщСниС Π² спискС событий

if (REPORT) then AddEvent(\'Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ для \' + strAction +

\' ΠΎΡ‚ \' + strName + \': \' + strMessage);

end;

end;

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ (участникС Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°) хранится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ структурС client:

...

type

client = record

fUsed: Boolean; {Π―Ρ‡Π΅ΠΉΠΊΠ° занята}

fNamed: Boolean; {ΠšΠ»ΠΈΠ΅Π½Ρ‚ сообщил своС имя}

strName: string; {Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ}

strIP: string; {IP-адрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°}

Connection: TIdTCPServerConnection; {Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с сСрвСром}

end;

НСпосрСдствСнно ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈ послСдних поля структуры. Π‘Π°ΠΌΡ‹ΠΌ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… являСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TIdTCPServerConnection, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ Π² любоС врСмя ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎΠ±ΠΎ всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ… хранится Π² массивС clients. Π•Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ€Π³Π°Π½ΠΈΡ‡Π΅Π½ (константа MAXCLIENT) ΠΈ опрСдСляСт максимальноС количСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ – участников Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив с постоянным количСством элСмСнтов, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°Π³ (ΠΏΠΎΠ»Π΅ f Used) для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ячСйка массива занята (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ True) ΠΈΠ»ΠΈ свободна (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False). ПолС fName структуры client ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для фиксации Ρ„Π°ΠΊΡ‚Π° сообщСния клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (клиСнтскиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ нСзарСгистрированных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ сообщСния Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚). Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля fNamed Ρ€Π°Π²Π½ΠΎ False ΠΈ устанавливаСтся Π² True, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ сообщСно сСрвСру ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· участников Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°.

Одним ΠΈΠ· самых слоТных ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ рассматриваСмого сСрвСра являСтся обСспСчСниС синхронизации доступа ΠΊ массиву clients. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ критичСская сСкция. Она Ρ‚Π°ΠΊΠΆΠ΅ примСняСтся для синхронизации добавлСния событий Π² список IstEvents сСрвСра.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, послСдний ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвСра. Π§Ρ‚ΠΎΠ±Ρ‹ сСрвСр ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ событий, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΊΠ½ΠΎ сСрвСра Π½Π΅ мСшало ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… REPORT ΠΈ SERVERVISIBLE Π² INI-Ρ„Π°ΠΉΠ»Π΅. Π’Π°ΠΊ, собствСнно, ΠΈ сдСлано: значСния этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… хранятся Π² сСкции [Common] Ρ„Π°ΠΉΠ»Π° Server. ini. Для считывания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· INI-Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈ запускС сСрвСра ΠΊΠΎΠ΄ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Server (Ρ„Π°ΠΉΠ» Server. dpr) ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 11.21).

...

Листинг 11.21. ИзмСнСния Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Server

program Server;

uses

Forms,

Unit1 in \'Unit1.pas\' {frmServer},

IniFiles, Dialogs;

{$R *.res}

var

{ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· INI-Ρ„Π°ΠΉΠ»Π°}

config: TIniFile;

strPath: string;

begin

//Π“Ρ€ΡƒΠ·ΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· INI-Ρ„Π°ΠΉΠ»Π°

strPath :=

Copy(Application.ExeName,1,Length(Application.ExeName)–3) +

\'ini\

config := TIniFile.Create(strPath);

SERVERVISIBLE := config.ReadBool(\'Common\', \'ServerVisible\',

False);

REPORT := config.ReadBool(\'Common\',’EventReport’, False);

config.Free ;

try

//Запуск сСрвСра

Application.Initialize;

Application.CreateForm(TfrmServer, frmServer);

Application.Run;

except

MessageDlg(\'НС удаСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр сообщСний. \' +

\'Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ½ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½ Ρ€Π°Π½Π΅Π΅.\', mtError, [mbOK], 0);

end;

end.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ листингС ΠΊΠΎΠ΄ создания Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² Π±Π»ΠΎΠΊ try. Π‘Π΄Π΅Π»Π°Π½ΠΎ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвСр Π½Π΅ Β«ΠΏΠ°Π΄Π°Π»Β» с Π²Ρ‹Π΄Π°Ρ‡Π΅ΠΉ всСм прСкрасно Π·Π½Π°ΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΎ критичСской ошибкС ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ запуска своСй ΠΊΠΎΠΏΠΈΠΈ.

БоотвСтствСнно, INI-Ρ„Π°ΠΉΠ» для запуска сСрвСра с Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

...

[Common]

ServerVisible=1

EventReport=1

РСализация клиСнтского прилоТСния

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌΠ΅Π΅Ρ‚ имя Client. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ клиСнтского прилоТСния Π²ΠΎ врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прСдставлСн Π½Π° рис. 11.7.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½Π° рис. 11.7 Ρ„ΠΎΡ€ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ имя frmClient. Бвойства (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сущСствСнныС для Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния) основных элСмСнтов управлСния, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Ρ… Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 11.2.

Рис. 11.7. Π€ΠΎΡ€ΠΌΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈ Π²Π΅Π΄Π΅Π½ΠΈΠΈ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π°

Π’Π°Π±Π»ΠΈΡ†Π° 11.2.

Бвойства элСмСнтов управлСния Ρ„ΠΎΡ€ΠΌΡ‹ frmClient

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ событий, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ большоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ клиСнтского прилоТСния.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π² листингС 11.22 ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° обновляСт Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ сСрвСру....

Листинг 11.22.

ОбновлСниС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ присоСдинСнии ΠΊ сСрвСру

procedure Connect();

begin

with frmClient do

begin

cmbConnect.Caption := \'ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ\

txtUser.Enabled := False;

txtServer.Enabled := False;

Caption := \'Π Π°Π·Π³ΠΎΠ²ΠΎΡ€Π½ΠΈΠΊ [\' + txtUser.Text + \' ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ \' +

txtServer.Text + \']\

lstUsers.Enabled := True;

cmbSend.Enabled := True;

txtMessage.Enabled := True;

txtChat.Enabled := True;

end;

end;

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Disconnect, привСдСнная Π² листингС 11.23, обновляСт Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΎΡ‚ сСрвСра (Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ Ρ„ΠΎΡ€ΠΌΠ° frmClient прСдстаСт ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ).

...

Листинг 11.23.

ОбновлСниС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ отсоСдинСнии ΠΎΡ‚ сСрвСра

procedure Disconnect();

begin

with frmClient do

begin

cmbConnect.Caption := \'ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ\

txtUser.Enabled := True;

txtServer.Enabled := True;

Caption := \'Π Π°Π·Π³ΠΎΠ²ΠΎΡ€Π½ΠΈΠΊ\

lstUsers.Enabled := False;

lstUsers.Clear;

cmbSend.Enabled := False;

txtMessage.Enabled := False;

txtChat.Enabled := False;

end;

end;

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ProcessMessage (листинг 11.24) ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сообщСниС, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΎΡ‚ сСрвСра, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π² сСрвСрном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ (СстСствСнно, сообщСния ΠΈ рСакция Π½Π° Π½ΠΈΡ… ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ ΠΎΡ‚ сСрвСрных).

...

Листинг 11.24.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° строки, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚ сСрвСра

procedure ProcessMessage(strMessage: string);

var

strAction: string; //Π’ΠΈΠΏ сообщСния (прСфикс сообщСния)

len: Integer; //Π”Π»ΠΈΠ½Π° строки strAction

begin

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚ΠΈΠΏ сообщСния ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия

len := Pos(\':\', strMessage);

strAction := Copy(strMessage,1,len-1);

Delete(strMessage,1,len);

if (strAction = \'ok\') then

begin

//РСгистрация ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° – ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ

//сообщСния

Connect;

end

else if (strAction = \'error\') then

begin

//Ошибка!!!

frmClient.TCPClient.Disconnect;

Disconnect;

MessageDlg(strMessage, mtError, [mbOK], 0);

end

else if (strAction = \'adduser\') then

begin

//К Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Ρƒ присоСдинился Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

frmClient.lstUsers.Items.Add(strMessage);

end

else if (strAction = \'deluser\') then

begin

//Какой-Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отсоСдинился

frmClient.lstUsers.Items.Delete(

frmClient.lstUsers.Items.IndexOf(strMessage));

end

else begin

//ПокаТСм принятоС сообщСниС

frmClient.txtChat.Lines.Add(strMessage);

end;

end;

Π”Π°Π»Π΅Π΅ приводятся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, собствСнно, ΠΈ основана Ρ€Π°Π±ΠΎΡ‚Π° клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ cmbConnect, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 11.25, пытаСтся ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ сСрвСру. Если ΠΊΠ»ΠΈΠ΅Π½Ρ‚ присоСдинСн ΠΊ сСрвСру, Ρ‚ΠΎ эта ΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΅Π³ΠΎ отсоСдинСния.