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

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

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

Анализируя листинг 11.1, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Π² рассматриваСмом ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ сСрвСрС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ внСшнСго Π²ΠΈΠ΄Π° Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ критичСской сСкции (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ имя модуля SyncObjs Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ uses).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ клиСнтской части (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ SimpleClient). Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ клиСнтского прилоТСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π° рис. 11.4.

Рис. 11.4. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

ЕстСствСнно, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ клиСнтского прилоТСния Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPQient (Π΅Π³ΠΎ имя – IdTCPClientl). Бвойству Port этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 12 34 0. ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit) для Π²Π²ΠΎΠ΄Π° строки, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π½Π΅ сСрвСр, ΠΈΠΌΠ΅Π΅Ρ‚ HMfltxtMessage. ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вводится имя ΠΈΠ»ΠΈ адрСс сСрвСра, Π½Π°Π·Π²Π°Π½ΠΎ txtServer. ПолС со строками ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Memo) ΠΈΠΌΠ΅Π΅Ρ‚ имя txtResults. Вся Ρ€Π°Π±ΠΎΡ‚Π° клиСнтского прилоТСния выполняСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ВСкст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.2.

...

Листинг 11.2. РСализация простого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°

procedure TForm1.Button1Click(Sender: TObject);

begin

//БоСдиняСмся с сСрвСром ΠΈ посылаСм Π΅ΠΌΡƒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ строку

IdTCPClient1.Host := txtServer.Text;

IdTCPClient1.Connect;

IdTCPClient1.WriteLn(txtMessage.Text);

txtMessage.Text := \'\

//ОТидаСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС

txtResults.Lines.Append(IdTCPClient1.ReadLn);

IdTCPClient1.Disconnect;

end;

...

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Для простоты Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ клиСнтского прилоТСния Π½Π΅ производится ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, гСнСрация ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°.

ВсС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сСрвСр ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ (Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ количСствС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ²) ΠΈ ΠΏΠΎΠ½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹. Волько Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

11.3. Π‘Π»Π΅ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΠΏΠΎ сСти

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Π±ΠΎΠ»Π΅Π΅ интСрСсный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования сСтСвых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² IdTCPServer ΠΈ IdTCPQient, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½ для людСй, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² сСти.

БСрвСрная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ запускаСтся Π½Π° наблюдаСмом ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-сСрвСр позволяСт клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свСдСния ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½Π° (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-сСрвСр) Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°:

β€’ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°;

β€’ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ Ρ†Π²Π΅Ρ‚Π° для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°;

β€’ ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΡƒΡŽ копию экрана;

β€’ копию экрана, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΡƒΡŽ (ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ) Π΄ΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ².

Для получСния ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… свСдСний ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ сСрвСру ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строковыС значСния:

β€’ get_screen_width – для получСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ get_screen_height – для получСния высоты экрана Π² пиксСлах;

β€’ get_screen_colors – для получСния значСния установлСнной для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ Ρ†Π²Π΅Ρ‚Π° (Π±ΠΈΡ‚ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ);

β€’ get_screen – для получСния ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ экрана;

β€’ get_screen: X, Y – для получСния ΠΊΠΎΠΏΠΈΠΈ экрана, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π₯Ρ… Y.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ сСрвСра (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ SpyServer). Π’Π΅ΡΡŒ ΠΊΠΎΠ΄, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСрвСра, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Unitl. pas Ρ„ΠΎΡ€ΠΌΡ‹ Forml. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² – главная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° для сСрвСра – приводится Π² листингС 11.3.

...

Листинг 11.3.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ клиСнтских запросов

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);

var

strText: string;

width, height, i: Integer;

dc: HDC;

begin

//ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° строку

strText := AThread.Connection.ReadLn;

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ

if (strText = \'get_screen_height\') then

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ высоту экрана

Athread.Connection.WriteInteger(Screen.Height)

else if (strText = \'get_screen_width\') then

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ ΡˆΠΈΡ€ΠΈΠ½Ρƒ экрана

Athread.Connection.WriteInteger(Screen.Width)

else if (strText = \'get_screen_colors\') then

begin

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ количСство Π±ΠΈΡ‚ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ

dc := GetDC(0);

Athread.Connection.WriteInteger(GetDeviceCaps(dc,

BITSPIXEL));

ReleaseDC(0, dc);

end

else if (strText = \'get_screen\') then

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΡƒΡŽ копию экрана

SendScreen(Screen.Width, Screen.Height, AThread.Connection)

else begin //строка Π²ΠΈΠ΄Π° \'get_screen:x,y\'

//ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ значСния высоты ΠΈ ΡˆΠΈΡ€ΠΈΠ½Ρ‹,

//ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ

strText := Copy(strText, 12,Length(strText)-11);

i := Pos(\',\', strText); //ПолоТСниС запятой

width := StrToInt(Copy(strText, 1, i-1));

height := StrToInt(Copy(strText, i+1, Length(strText)-i));

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ копию экрана

SendScreen(width, height, AThread.Connection);

end;

end;

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² листингС 11.3 ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° SendScreen, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ копию экрана, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 11.4.

...

Листинг 11.4.

БнятиС ΠΊΠΎΠΏΠΈΠΈ экрана

//ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° снимаСт копию экрана, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅

//ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΈ отправляСт

//ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅

procedure SendScreen(width: Integer; height: Integer;

Connection: TIdTCPServerConnection);

var

ScreenCopy: TCanvas;

gr: TBitmap;

stream: TMemoryStream;

rcDest, rcSource: TRect;

begin

rcDest := Rect(0, 0, width, height); //ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€

//изобраТСния

rcSource := Screen.DesktopRect; //Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€

//изобраТСния

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ°Π½Π²Ρƒ ΠΈ присоСдиняСм Π΅Π΅ ΠΊ контСксту Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола

ScreenCopy := TCanvas.Create;

ScreenCopy.Handle := GetDC(0);

//Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для хранСния ΠΊΠΎΠΏΠΈΠΈ экрана

//ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

gr := TBitmap.Create;

gr.Height := height;

gr.Width := width;

gr.Canvas.CopyRect(rcDest, ScreenCopy,rcSource);

ReleaseDC(0, ScreenCopy.Handle);

//БохраняСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…

stream := TMemoryStream.Create;

gr.SaveToStream(stream);

//ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

Connection.WriteStream(stream,True,True);

stream.Clear;

stream.Free;

gr.Free;

end;

Как ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π΄Π°ΠΆΠ΅ самая слоТная опСрация рассматриваСмого сСрвСра ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ изобраТСния – рСализуСтся довольно просто благодаря Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠ³ΠΎ стандартного класса, ΠΊΠ°ΠΊ TMemoryStream.

ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвСра использован Ρ‚Π°ΠΉΠΌΠ΅Ρ€. Он ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ для скрытия Ρ„ΠΎΡ€ΠΌΡ‹ сСрвСра сразу ΠΏΡ€ΠΈ запускС прилоТСния (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния Π΅Π³ΠΎ свойств Enabled = True ΠΈ Interval = 50). ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ IdTCPServer (с ΠΈΠΌΠ΅Π½Π΅ΠΌ IdTCPServerl) Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ присоСдинСн ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12341 (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство Active = True).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ клиСнтского прилоТСния (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ SpyClient). Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ (Forml) ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ приводится Π½Π° рис. 11.5 (Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ наблюдаСмого ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π» Π² ΠΈΠ³Ρ€Ρƒ Π‘Π°ΠΏΠ΅Ρ€ ).

Рис. 11.5. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° слСТСния

Описания, ΠΈΠΌΠ΅Π½Π° ΠΈ значСния настроСнных Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ свойств самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 11.1. Π’Π°Π±Π»ΠΈΡ†Π° 11.1. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° слСТСния ΠΈ ΠΈΡ… свойства

Π Π°Π±ΠΎΡ‚Π° клиСнтского прилоТСния начинаСтся с соСдинСния с сСрвСром. Код, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° эту ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.5....

Листинг 11.5. Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ с сСрвСром

procedure TForm1.cmbConnectClick(Sender: TObject);

begin

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

begin

if (txtServer.Text = \'\') then

//НС Π²Π²Π΅Π΄Π΅Π½ΠΎ имя сСрвСра

MessageDlg(\'Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя ΠΌΠ°ΡˆΠΈΠ½Ρ‹-сСрвСра Π² тСкстовоС ΠΏΠΎΠ»Π΅\',

mtInformation, [mbOK], 0)

else begin

//ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ сСрвСру

IdTCPClient1.Host := txtServer.Text;

try

IdTCPClient1.Connect;

except

MessageDlg(\'НС удаСтся ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ сСрвСром\',

mtError, [mbOK], 0);

Exit;

end;

end

end

else begin

//ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΎΡ‚ сСрвСра

IdTCPClient1.Disconnect;

end;

end;

Если соСдинСниС с сСрвСром ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ‚ΠΎ выполняСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ TForml. IdTCPClientlConnected, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΊ пСриодичСским запросам Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра (листинг 11.6).

...

Листинг 11.6.

ДСйствия, выполняСмыС ΠΏΡ€ΠΈ соСдинСнии с сСрвСром

procedure TForm1.IdTCPClient1Connected(Sender: TObject);

begin

txtServer.Enabled := False;

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

//НачинаСм пСриодичСски Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра

Timer1.Enabled := True;

//Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос, Π½Π΅ доТидаясь срабатывания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°

Timer1Timer (Nil);

end;

ΠŸΡ€ΠΈ отсоСдинСнии ΠΎΡ‚ сСрвСра Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ дСйствия, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ пСриодичСскиС запросы Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ пСрСводящиС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π² состояниС оТидания ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) (листинг 11.7).

...

Листинг 11.7.

ДСйствия ΠΏΡ€ΠΈ отсоСдинСнии ΠΎΡ‚ сСрвСра

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);

begin

txtServer.Enabled := True;

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

Timer1.Enabled := False;

end;

Π‘Π°ΠΌΠΎΠΉ слоТной Ρ‡Π°ΡΡ‚ΡŒΡŽ клиСнтского прилоТСния являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, присылаСмых сСрвСром. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.8.

...

Листинг 11.8.

Запрос ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… с сСрвСра

procedure TForm1.Timer1Timer(Sender: TObject);

var

stream: TMemoryStream;

begin

//Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρƒ сСрвСра Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ наблюдаСмом ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅

with (IdTCPClient1) do

begin

//β€¦Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

WriteLn(\'get_screen_width\');

WriteLn(\'get_screen_height\');

lblResolution.Caption := IntToStr(ReadInteger) + \'x\' +

IntToStr(ReadInteger);

//…глубина Ρ†Π²Π΅Ρ‚Π°

WriteLn(\'get_screen_colors\');

lblColors.Caption := IntToStr(ReadInteger);

//…копия экрана

//.....ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ экрана Π±Π΅Π· сТатия

WriteLn(\'get_screen\');

//.....Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ – сТатиС Π½Π° сторонС сСрвСра

WriteLn(\'get_screen:\' + IntToStr(imgScreen.Width) + \',\' +

IntToStr(imgScreen.Height));