Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ delphi. ΠšΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрныС прилоТСния Π½Π° Delphi (TClientSocket, TServerSocket)

Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ мСню: Component - Install Packages… - Add., Π΄Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» …\bin\dclsockets70.bpl.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ нСпосрСдствСнно ΠΊ созданию ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСра, для Π½Π°Ρ‡Π°Π»Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сСтСвого Ρ‡Π°Ρ‚Π°.

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ Ρ‡Π°Ρ‚ Π½Π° Π΄Π²ΡƒΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ начинаСтся с опрСдСлСния Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, ΠΈ опрСдСлСния ΡƒΠΆΠ΅ Π½Π° этом этапС Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° прСдставляСт собой Ρ‡Π°Ρ‚ Π½Π° Π΄Π²ΠΎΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ сСрвСром, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΊΠΈΠ΄Π°Π΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ServerSocket ΠΈ ClientSocket . Π’Π°ΠΆΠ½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ для ΠΎΠ±ΠΎΠΈΡ… являСтся ΠΏΠΎΡ€Ρ‚. Волько ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ свойства Port , связь ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ установится. КинСм Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Edit , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚, Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ PortEdit . Для соСдинСния с сСрвСром Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ IP сСрвСра ΠΈΠ»ΠΈ Π΅Π³ΠΎ имя, поэтому ΠΊΠΈΠ½Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Edit , Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ HostEdit . Π’Π°ΠΊ ΠΆΠ΅ Π½Π°ΠΌ понадобятся Π΅Ρ‰Π΅ Π΄Π²Π° Edit "Π° для указания Π½ΠΈΠΊΠ° ΠΈ Π²Π²ΠΎΠ΄Π° тСкста сообщСния, Π½Π°Π·ΠΎΠ²Π΅ΠΌ ΠΈΡ… NikEdit ΠΈ TextEdit , соотвСтствСнно. ВСкст ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… ΠΈ отправляСмых сообщСний Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Memo , ΠΊΠΈΠ½Π΅ΠΌ Π΅Π³ΠΎ Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ ChatMemo . Установим сразу Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ полосу ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ: ScrollBars = ssVertical , ΠΈ свойство ReadOnly = True . Π”ΠΎΠ±Π°Π²ΠΈΠΌ клавиши управлСния Button : ServerBtn - для создания/закрытия сСрвСра, ClientBtn - для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ/ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ сСрвСру, SendBtn - для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний. ИзмСним Caption этих клавиш Π½Π° "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвСр ", "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ " ΠΈ "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ", соотвСтствСнно. ПослСдний ΡˆΡ‚Ρ€ΠΈΡ… - Π΄ΠΎΠ±Π°Π²ΠΈΠΌ надписи Label для прСдания Ρ„ΠΎΡ€ΠΌΠ΅ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π° (это ΠΏΠΎ ТСланию).

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΡƒ сразу, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π²Π²ΠΎΠ΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π°Ρ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это Π½Π΅ Π΅ΡΡ‚ΡŒ главная Ρ†Π΅Π»ΡŒ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±Π΅Π· Ρ‚Ρ€ΡƒΠ΄Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ сами.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹. ОпишСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ OnCreate :


begin
// ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ значСния ΠΏΠΎΡ€Ρ‚Π°
PortEdit.Text:="777";
// адрСс ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ПК ("сам Π½Π° сСбя")
HostEdit.Text:="127.0.0.1";
// ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ поля просто очистим
NikEdit.Clear;
TextEdit.Clear;
ChatMemo.Lines.Clear;
end;

Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ сСрвСра. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ€Π΅ΠΆΠΈΠΌ сСрвСра осущСствляСтся клавишСй "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвСр " (ServerBtn) . Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΡˆΠ½ΠΈΡ… клавиш для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этого Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° RadioButton , ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ свойство Tag клавиши ServerBtn , измСняя Π΅Π³ΠΎ значСния ΠΈ выполняя Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ соотвСтствуСт ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π½Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши ServerBtn (OnClick ):

procedure TForm1.ServerBtnClick(Sender: TObject);
begin
If ServerBtn.Tag=0 then
Begin
// ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ClientBtn ΠΈ поля HostEdit, PortEdit Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ
ClientBtn.Enabled:=False;
HostEdit.Enabled:=False;
PortEdit.Enabled:=False;
// запишСм ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π² ServerSocket
ServerSocket.Port:=StrToInt(PortEdit.Text);
// запускаСм сСрвСр
ServerSocket.Active:=True;
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ создания
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] Π‘Π΅Ρ€Π²Π΅Ρ€ создан");
// измСняСм тэг
ServerBtn.Tag:=1;
// мСняСм надпись клавиши
ServerBtn.Caption:="Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ сСрвСр";
end
else
Begin
// ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ClientBtn ΠΈ поля HostEdit, PortEdit Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ
ClientBtn.Enabled:=True;
HostEdit.Enabled:=True;
PortEdit.Enabled:=True;
// Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сСрвСр
ServerSocket.Active:=False;

ChatMemo.Lines.Add("["+TimeToStr(Time)+"] Π‘Π΅Ρ€Π²Π΅Ρ€ Π·Π°ΠΊΡ€Ρ‹Ρ‚.");

ServerBtn.Tag:=0;

ServerBtn.Caption:="Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвСр";
end;
end;

РазбСрСмся с событиями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ состоянии ServerSocket "Π°. НапишСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ подсоСдинился ΠΊ сСрвСру (OnClientConnect ):

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚.");
end;

НапишСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ (OnClientDisconnect ):

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΡΡ.");
end;

Когда Π½Π° сСрвСр ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ сообщСниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сразу ΠΆΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ. НапишСм ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сообщСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (OnClientRead ):


Socket: TCustomWinSocket);
begin


end;

Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ - ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний. Π£ нас ΠΎΠ½Π° осущСствляСтся Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ" (SendBtn ), Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сСрвСр ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚. НапишСм Π΅Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (OnClick ):

procedure TForm1.SendBtnClick(Sender: TObject);
begin
// ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ находится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

// отправляСм сообщСниС с сСрвСра (ΠΎΠ½ ΠΏΠΎΠ΄ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ΄ΠΈΠ½)
ServerSocket.Socket.Connections.SendText("["+TimeToStr(Time)+"] "+NikEdit.Text+": "+TextEdit.Text)
else
// отправляСм сообщСниС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ClientSocket.Socket.SendText("["+TimeToStr(Time)+"] "+NikEdit.Text+": "+TextEdit.Text);
// ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ сообщСниС Π² ChatMemo
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] "+NikEdit.Text+": "+TextEdit.Text);
end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ разбСрСмся с Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π—Π΄Π΅ΡΡŒ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ" (ClientBtn ), блокируСтся ServerBtn ΠΈ активируСтся ClientSocket . Π’ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ClientBtn (OnClick) :

procedure TForm1.ClientBtnClick(Sender: TObject);
begin
If ClientBtn.Tag=0 then
Begin
// ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ServerBtn ΠΈ поля HostEdit, PortEdit Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ
ServerBtn.Enabled:=False;
HostEdit.Enabled:=False;
PortEdit.Enabled:=False;
// запишСм ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π² ClientSocket
ClientSocket.Port:=StrToInt(PortEdit.Text);
// запишСм хост ΠΈ адрСс (ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ HostEdit Π² ΠΎΠ±Π°)
ClientSocket.Host:=HostEdit.Text;
ClientSocket.Address:=HostEdit.Text;
// запускаСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ClientSocket.Active:=True;
// измСняСм тэг
ClientBtn.Tag:=1;
// мСняСм надпись клавиши
ClientBtn.Caption:="ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ";
end
else
Begin
// ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ServerBtn ΠΈ поля HostEdit, PortEdit Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ
ServerBtn.Enabled:=True;
HostEdit.Enabled:=True;
PortEdit.Enabled:=True;
// Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ClientSocket.Active:=False;
// Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сообщСниС Π² ChatMemo
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] БСссия Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°.");
// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ тэгу исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
ClientBtn.Tag:=0;
// Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ надпись клавиши
ClientBtn.Caption:="ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ";
end;
end;

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π° OnConnect , OnDisconnect , OnRead ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ClientSocket . Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сообщСния с сСрвСра (OnRead ):


Socket: TCustomWinSocket);
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠ΅Π΅ сообщСниС
ChatMemo.Lines.Add(Socket.ReceiveText());
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС ΠΎ соСдинСнии с сСрвСром
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ сСрвСру.");
end;

procedure TForm1.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС ΠΎ ΠΏΠΎΡ‚Π΅Ρ€Π΅ связи
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½.");
end;

Π’ΠΎΡ‚ Ρ‚ΠΎΡ‚ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ внСсти Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ряд Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Π²ΠΎΠ΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.
Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: Π° Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ совсСм Π½Π΅ строковыС, Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ массив? Для этого Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ массива, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° массива Π΄Π°Π½Π½Ρ‹Ρ…

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠΎΠΉ Ρ‡Π°Ρ‚Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ нСсколько ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅. ΠŸΡƒΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π° - ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° Shape , ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ гСомСтричСской Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Ρ†Π²Π΅Ρ‚, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ GroupBox , Π° Π² Π½Π΅Π³ΠΎ Shape , ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅. Для измСнСния Ρ‚ΠΈΠΏΠ° гСомСтричСской Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ список ComboBox , Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ ShapeCBox . Π‘Ρ€Π°Π·Ρƒ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, это сдСлаСм Π² OnCreate Ρ„ΠΎΡ€ΠΌΡ‹. Π”Π°Π»Π΅Π΅ понадобится Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ComboBox для Π²Ρ‹Π±ΠΎΡ€Π° Ρ†Π²Π΅Ρ‚Π°, ΠΈ Π΄Π²Π° Edit "Π° для указания Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ (Π² случаС с ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π²Π° значСния, Π½Π° ΠΊΡ€ΡƒΠ³ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ΅). НазовСм ΠΈΡ… ColorCBox , Value1Edit , Value2Edit , соотвСтствСнно. ПослСдним ΠΊΠΈΠ½Π΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Button , Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ SendBufBtn , Caption ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π½Π° "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ ".
НСмного ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Π±ΡƒΡ„Π΅Ρ€Π° Π΄Π°Π½Π½Ρ‹Ρ…. НуТно сразу ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π·Π° ΠΊΠ°ΠΊΠΈΠΌ слСдуСт Π² Π±ΡƒΡ„Π΅Ρ€Π΅. ΠŸΡƒΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΈΠΏ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π·Π° Π½ΠΈΠΌ Ρ†Π²Π΅Ρ‚, Π° слСдом ΠΎΠ±Π° значСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Для этих Ρ†Π΅Π»Π΅ΠΉ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив Π΄Π»ΠΈΠ½ΠΎΠΉ 4 ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Byte . Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ€Π°Π·Π΄Π΅Π» var массив:

Buf: array of Byte;

Π‘ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ всС понятно, Π° Π²ΠΎΡ‚ для Ρ‚ΠΈΠΏΠ° ΠΈ Ρ†Π²Π΅Ρ‚Π° Π½ΡƒΠΆΠ½Π° "Ρ‚Π°Π±Π»ΠΈΡ†Π° истинности". ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ΄
ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ 0
ΠΊΡ€ΡƒΠ³ 1
-------------------
красный 0
Π·Π΅Π»Π΅Π½Ρ‹ΠΉ 1
синий 2

Π­Ρ‚ΠΎΠ³ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ для дСмонстрации. По ТСланию ΠΊΡ€ΡƒΠ³ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ, ввСсти Ρ‚ΠΈΠΏ Π·Π°Π»ΠΈΠ²ΠΊΠΈ, Ρ‚ΠΈΠΏ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π°, смСщСниС, ΠΈΠ»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ.
ΠŸΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ списков Π² OnCreate Ρ„ΠΎΡ€ΠΌΡ‹:

procedure TForm1.FormCreate(Sender: TObject);
begin

// ...Ρ‡Π°ΡΡ‚ΡŒ Ρ‡Π°Ρ‚Π°...

// заполнСниС списков
ShapeCBox.Items.Add("ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ");
ShapeCBox.Items.Add("ΠΊΡ€ΡƒΠ³");
ColorCBox.Items.Add("красный");
ColorCBox.Items.Add("Π·Π΅Π»Π΅Π½Ρ‹ΠΉ");
ColorCBox.Items.Add("синий");
end;

ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ " Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив извСстной Π΄Π»ΠΈΠ½Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ сСрвСр/ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ. Π’ΠΎΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° SendBufBtn (OnClick) :

procedure TForm1.SendBufBtnClick(Sender: TObject);
begin
// собСрСм Π΄Π°Π½Π½Ρ‹Π΅ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
Buf:=ShapeCBox.ItemIndex;
Buf:=ColorCBox.ItemIndex;
Buf:=StrToInt(Value1Edit.Text);
Buf:=StrToInt(Value2Edit.Text);
// провСряСм Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
If ServerSocket.Active=True then
// ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€ с сСрвСра (Π΄Π»ΠΈΠ½Π° извСстна - 4)
ServerSocket.Socket.Connections.SendBuf(Buf,4)
else
// ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
ClientSocket.Socket.SendBuf(Buf,4);
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹.");

Shape.Height:=Buf;
Shape.Width:=Buf;

If Buf>


Case Buf of
0: Shape.Brush.Color:=clRed;

2: Shape.Brush.Color:=clBlue;
end;
// ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² полях
ShapeCBox.ItemIndex:=Buf;
ColorCBox.ItemIndex:=Buf;


end;

НСмного ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сообщСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний ΠΈ настроСм Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π° (OnClientRead ):

procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
len: Byte;
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo клиСнтскоС сообщСниС


len:=Socket.ReceiveLength;
Socket.ReceiveBuf(Buf,len);
// ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ измСнСния ΠΊ своСму Shape
Shape.Height:=Buf;
Shape.Width:=Buf;
If Buf>0 then Shape.Shape:=stCircle {ΠΊΡ€ΡƒΠ³}
else Shape.Shape:=stRectangle; {прямоуголник}
// Π²Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π° ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ истинности
Case Buf of
0: Shape.Brush.Color:=clRed;
1: Shape.Brush.Color:=clGreen;
2: Shape.Brush.Color:=clBlue;
end;
// ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² полях
ShapeCBox.ItemIndex:=Buf;
ColorCBox.ItemIndex:=Buf;
Value1Edit.Text:=IntToStr(Buf);
Value2Edit.Text:=IntToStr(Buf);


end;

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ сообщСния ΠΎΡ‚ сСрвСра (OnRead ):

procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
len: Byte;
begin
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС с сСрвСра
// ChatMemo.Lines.Add(Socket.ReceiveText());
// ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ нСизвСстного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°
len:=Socket.ReceiveLength;
Socket.ReceiveBuf(Buf,len);
// ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ измСнСния ΠΊ своСму Shape
Shape.Height:=Buf;
Shape.Width:=Buf;
If Buf>0 then Shape.Shape:=stCircle {ΠΊΡ€ΡƒΠ³}
else Shape.Shape:=stRectangle; {прямоуголник}
// Π²Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π° ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ истинности
Case Buf of
0: Shape.Brush.Color:=clRed;
1: Shape.Brush.Color:=clGreen;
2: Shape.Brush.Color:=clBlue;
end;
// ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² полях
ShapeCBox.ItemIndex:=Buf;
ColorCBox.ItemIndex:=Buf;
Value1Edit.Text:=IntToStr(Buf);
Value2Edit.Text:=IntToStr(Buf);
// Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ChatMemo сообщСниС ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ…
ChatMemo.Lines.Add("["+TimeToStr(Time)+"] ΠŸΡ€ΠΈΡˆΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅.");
end;

Π­Ρ‚ΠΎ ΠΈ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ссли Π½Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ принятиС сообщСния (Socket.ReceiveText() ) ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΠΈ сообщСниС ΠΈ Π±ΡƒΡ„Π΅Ρ€, Ρ‚ΠΎ это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π Π΅ΡˆΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π·Π° счСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° сообщСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π±ΡƒΡ„Π΅Ρ€Π° Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

For i:=1 to Length(TextEdit.Text) do
Buf:=Copy(TextEdit.Text,i,1);

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ массив станСт Π½Π° ΠΎΠ΄Π½Ρƒ ячСйку большС ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ свой Ρ‚ΠΈΠΏ Π½Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ строковый. Buf ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ, Ρ‡Π΅ΠΌ являСтся ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€: сообщСниСм ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ… получСния сообщСний Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ условиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

len:=Socket.ReceiveLength;
Socket.ReceiveBuf(Buf,len);
If Buf="t" then
Begin
… Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ соСдинСнию Π² строку (Ρ‡Π΅Ρ€Π΅Π· Ρ†ΠΈΠΊΠ»)
end;
If Buf="c" then
Begin
… Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ измСнСнию ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Shape
end;

ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Delphi ΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ File/Save Project As… сохраним ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΠ΅, Π³Π΄Π΅ ΠΌΡ‹ сохранили Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…. АдрСс ΠΏΠ°ΠΏΠΊΠΈ C:\Π‘Π”IBExpert . Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ pas Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ TelSprav1.pas , Π° dpr Ρ„Π°ΠΉΠ» TelSprav.dpr . Π’ этом ΠΎΠΊΠ½Π΅ Π² свойствС Caption напишСм Β«Π’Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹ΠΉ справочник Β», Π² свойствС Name пишСм Β«TelefonSpravΒ». КинСм Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ MainMenu ΠΈ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Ρ‘Π»ΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π½Π΅ΠΌΡƒ, появится ΠΎΠΊΠ½ΠΎ (рис. 50).

Рисунок 50

Π’ свойствС Caption напишСм Β«Π€Π°ΠΉΠ» Β», Π² свойствС Name пишСм Β«Fille Β». Π©Ρ‘Π»ΠΊΠ½Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ синСму ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ, снизу появится Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (рис. 51).

Рисунок 51

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ Π΅Π³ΠΎ. Π’ свойствС Caption напишСм Β«Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Β», Π² свойствС Name пишСм Β«Zakrit Β». Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ справа. Π’ свойствС Caption напишСм Β«Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Β», Π² свойствС Name пишСм Β«Redaktirov Β» ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρƒ нас Π΄ΠΎΠ»ΠΆΠ½Ρ‹ получится ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ подмСню (рис. 52, рис 53, рис 54).

Рисунок 52

Рисунок 53

Рисунок 54

Π’Π΅ΠΏΠ΅Ρ€ΡŒ бросим Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ToolBar , с Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Win32. Бвойство Align выставим Π² alTop. Π’ свойствС EdgeBorders выставим всё Π² True. Π”Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ позволяСм Π½Π°ΠΌ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π½Ρ‘ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π’ этом ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π΅Π³ΠΎ основная Ρ€ΠΎΠ»ΡŒ. Π©Ρ‘Π»ΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΈ Π² появившСмся подмСню Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ NewButton (рис. 55).

Рисунок 55

ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ. Но сначала Π² свойствС Name пишСм Β«Dob Β». Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π½Π°Π΄ΠΎ, с этой ΠΆΠ΅ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ, Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ImageList ΠΈ Π΄Π²Π°ΠΆΠ΄Ρ‹ Ρ‰Ρ‘Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΠΎ Π½Π΅ΠΌΡƒ. ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ (рис. 56), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Add… Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 16Ρ…16. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹, Π½Π°ΠΆΠΌΡ‘ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK.

Рисунок 56

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ToolBar1 ΠΈ Π² свойствС Imeges Π² Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ImageList1. На ΠΊΠ½ΠΎΠΏΠΊΠ΅ сразу появится ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°. Если ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ другая, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ Π² свойствС ImageIndex Π² Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ.

НаТмём ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ToolBar1 ΠΈ Π² появившСмся подмСню Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ NewSeparator (рис. 55). Около ΠΊΠ½ΠΎΠΏΠΊΠΈ появится Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ. НС Π±ΡƒΠ΄Π΅ΠΌ для Π½Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ свойство Name, Ρ‚.ΠΊ. это всСго лишь Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ. Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Width. Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ Ρ€Π°Π²Π½Ρ‹ΠΌ 5. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ создаём Π΅Ρ‰Ρ‘ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π² свойствС Name пишСм Β«Red Β». Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ Β«Ydali Β». Π’ Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΉ Β«Exiit Β». ΠœΠ΅ΠΆΠ΄Ρƒ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ставим Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ NewSeparator. ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ Ρ€Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 50. Бросим ΠΎΠΊΠΎΠ»ΠΎ раздСлитСля ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Label ΠΈ Π² свойствС Caption пишСм Ѐамилия. Рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Label1 поставим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Edit, Π² свойствС Name пишСм Β«Familiya Β». ΠœΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, Label ΠΈ Edit , Ρ€ΠΎΠ»ΡŒ раздСлитСля ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π» Π² Π½Π°Π±Ρ€Π°Π½Π½ΠΎΠΌ словС Ѐамилия. Бросим Π΅Ρ‰Ρ‘ ΠΏΠ°Ρ€Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Label ΠΈ Edit. Π£ послСднСго Π² свойствС Name выставим Β«Telefon Β». Π£ ΠΎΠ±ΠΎΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Edit Π½Π°Π΄ΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ свойство Text. Рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ для Π²Π²ΠΎΠ΄Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° (Edit) располоТим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Button, Π² свойствС Name Π²Π²Π΅Π΄Ρ‘ΠΌ Naiti.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ с Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Data Controls Π½Π°Π΄ΠΎ Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ DBGrid. РастянитС Π΅Π³ΠΎ ΠΏΠΎ всСму ΠΎΠΊΠ½Ρƒ, свойство Align выставим Π² alClient. Π£ нас Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π΅Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ (рис. 57).

Рисунок 57

Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° построСн.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ размСстим Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ File/New/Other… ΠΈ Π² появившСмся ΠΎΠΊΠ½Π΅ (рис. 58) Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ DataModule, Π½Π°ΠΆΠΌΡ‘ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ°ΠΏΠΊΠ΅, с Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ DataModule1.pas ΠΈ DataModule.dpr.

Рисунок 58

Π’ свойствС Name пишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ€ΠΎΡ‡Π΅ DM . Π’ΠΎΡ‚ Π² этом ΠΎΠΊΠ½Π΅ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ для доступа ΠΊ Π‘Π”. Π‘ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ InterBase размСстим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹: IBDatabase, IBStoredProc, IBQuery, IBTransaction. ΠžΡΡ‚Π°Π²ΠΈΠΌ Π±Π΅Π· измСнСния ΠΈΡ… названия, Ρ‚.ΠΊ. ΠΌΡ‹ ΠΈΡ… Π² ΠΎΠΊΠ½ΠΎ бросили ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ. Они Π±ΡƒΠ΄ΡƒΡ‚ располоТСны с Ρ†ΠΈΡ„Ρ€ΠΎΠΉ 1 Π² ΠΊΠΎΠ½Ρ†Π΅. Π‘ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Data Access бросим ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ DataSource Π² Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС DataSet Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ IBQuery1.

БСйчас Ρ€Π°ΡΠΏΠΈΡˆΠ΅ΠΌ, ΠΊΠ°ΠΊΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:

  • IBDatabase - Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Один ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ;
  • IBStoredProc – ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ…, ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния (Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅);
  • IBQuery - позволяСт ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… выполнСния. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ являСтся ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TQuery. ОсновноС свойство SQL;
  • IBTransaction - ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ всСх Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ для связанной с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…;
  • DataSource - ЯвляСтся ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π·Π²Π΅Π½ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, прСдставлСнных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ TIBQuery ΠΈ TIBStoredProc, ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ отобраТСния ΠΈ управлСния Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.
НС Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· свойств Π²ΠΎ всСх этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…. Π’ процСссС создания Π‘Π”, Π½Π°ΠΌ Π² любом случаС придётся, познакомится со свойством, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, Ρ‰Ρ‘Π»ΠΊΠ½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ IBDatabase, Π²Ρ‹Π»Π΅Π·Π΅Ρ‚ контСкстноС мСню (рис. 59).

Рисунок 59

Π’ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°Π΄ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡƒΠ½ΠΊΡ‚ Database Editor… ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΎΠΊΠ½ΠΎ Database Component Editor (рис. 60).

Рисунок 60

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Connection Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Local, Ρ‚.ΠΊ. ΠΌΡ‹ ΠΏΠΎΠΊΠ° создаём Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΏΠΎΠ»Π΅ Database Π½ΡƒΠΆΠ½ΠΎ ввСсти имя нашСй Π‘Π”. МоТно ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ всё Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ, Π½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Browse. Если сСйчас Π·Π°Π»Π΅Π·Ρ‚ΡŒ Π² ΠΏΠ°ΠΏΠΊΡƒ с нашСй Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… (TELEFONSPRAVOCHNIK.FDB), Ρ‚ΠΎ ΠΎΠ½Π° Π² этой ΠΏΠ°ΠΏΠΊΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ эту Π‘Π” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² строкС Π’ΠΈΠΏ Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ AllFiles(*.*). Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всС Ρ„Π°ΠΉΠ»Ρ‹, ΠΈΠ· этой ΠΏΠ°ΠΏΠΊΠΈ, отобразятся. Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ Ρ„Π°ΠΉΠ» Π‘Π” (TELEFONSPRAVOCHNIK.FDB) ΠΈ Ρ‰Ρ‘Π»ΠΊΠ½Π΅ΠΌ OK.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ Database Parameters Π² ΠΏΠΎΠ»Π΅ User Name Π²Π²Π΅Π΄Ρ‘ΠΌ Π»ΠΎΠ³ΠΈΠ½ – SYSDBA, Π² ΠΏΠΎΠ»Π΅ PassWord Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ – masterkey. Π›ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, ΠΊΠ°ΠΊΠΈΠΌΠΈ вводились ΠΏΡ€ΠΈ создании Π‘Π” Π² IBExpert. Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ написанной Π² Delphi.

Π’ Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС Character Set Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Win1251. Π£Π±Π΅Ρ€Ρ‘ΠΌ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ Login Prompt, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Π‘ΠΏΡ€Π°Π²Π° Π² ΠΎΠΊΠ½Π΅ Settings отобраТаСтся всё, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ»ΠΈ ΠΈ Π²Π²Π΅Π»ΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Test. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK, Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π‘Π”. ΠŸΠΎΡΠ²ΠΈΡ‚ΡΡ ΠΎΠΊΠ½ΠΎ (рис. 61).

Рисунок 61

Если появилось с сообщСниСм ΠΎΠ± ошибкС, Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ – Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ InterBase. Для устранСния этой ошибки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ InterBase, Ссли ΠΎΠ½Π° установлСна. И ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ gds32.dll ΠΏΠΎ адрСсу C:\WINDOWS\system32.

ПослС этих ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΉ придётся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈ FireBird, Ρ‚.ΠΊ. ΠΌΡ‹ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, IBExpert Π½Π΅ смоТСт ΡƒΠΆΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ПослС всСх этих дСйствий Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ FireBird. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ ошибки нСсколько, Π½ΠΎ эта самая распространённая.

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ IBQuery1 ΠΈ Π² свойствС Database Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ IBDatabase1. Бвойство Database ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TIBDatabase, связанный с Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ свойствС Transaction Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ IBTransaction1. Бвойство Transaction ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Ρ‹Π±ΠΎΡ€ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

ОсновноС свойство ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TQuery – SQL, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏ TStrings . Π­Ρ‚ΠΎΡ‚ список строк, содСрТащих запросы SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, с ΠΊΠ°ΠΊΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠ»ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚Π°. Но Π΄Π°Π»Π΅Π΅ Π²ΠΎ врСмя выполнСния прилоТСния свойство SQL ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ для класса TStrings : Clear – очистка, Add – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ строки ΠΈ Ρ‚.Π΄.

Π˜Ρ‚Π°ΠΊ Π² свойствС SQL Ρ‰Ρ‘Π»ΠΊΠ½Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ с трСмя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ Π² появившСмся ΠΎΠΊΠ½Π΅ Π²Π²Π΅Π΄Ρ‘ΠΌ SQL запрос (рис. 62).

Рисунок 62

Запрос Π·Π²ΡƒΡ‡ΠΈΡ‚ Ρ‚Π°ΠΊ – Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС поля (SELECT * ) ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ TELEPHON_SPRAVOCCHNIK (FROM TELEPHON_SPRAVOCCHNIK) ΠΈ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ) ΠΏΠΎ полю KEY (ORDER BY KEY). НаТимаСм ΠΊΠ½ΠΎΠΏΠΊΡƒ OK.

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ IBTransaction1 ΠΈ Π² свойствС DefaultDatabase Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ IBDatabase1 .

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ IBStoredProc1, Π² свойствС Database Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ IBDatabase1 . Π’ свойствС StoredProcName ΠΈΠ· Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ TEL_SPRAV_PROC Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π² IBExpert.

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ IBQuery1, свойство Active выставим Π² True .

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ (DataModule1) Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ TelSprav1 , Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ File/Use Unit…, Π² появившСмся ΠΎΠΊΠ½Π΅ (рис. 63.)

Рисунок 63

Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ TelSprav1 ΠΈ Π½Π°ΠΆΠΌΡ‘ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ Use Unit. ПослС слова implementation Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π²Ρ‹Π»Π΅Π·Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π» uses с ΠΈΠΌΠ΅Π½Π΅ΠΌ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ модуля TelSprav1. Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DataModule1 Π·Π½Π°Π΅Ρ‚ ΠΎ сущСствовании Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ модуля TelSprav1.

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ Π² Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ TelSprav1 ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ DataModule1. БСйчас эти Π΄Π²Π° модуля Π·Π½Π°ΡŽΡ‚ ΠΎ сущСствовании Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

Π’Ρ‹Π΄Π΅Π»ΠΈΠΌ сСтку DBGrid1 ΠΈ Π² Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню свойства DataSource Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ DM.DataSource1 . Π’ нашСй сСткС появятся ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ Π‘Π”.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим ΠΎΠΊΠ½ΠΎ для добавлСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… рСдактирования. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ File/New/Form. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ сохраним Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ File/Save Project As… Π’ ΠΏΠΎΠ»Π΅ Имя Ρ„Π°ΠΉΠ»Π° модуля Π²Π²Π΅Π΄Ρ‘ΠΌ DobavRedakt1.pas , Π° Имя Ρ„ΠΎΡ€ΠΌΡ‹ - DobavRedakt.dpr . Π’ свойствС Name Π²Π΅Π΄Ρ‘ΠΌ имя Ρ„ΠΎΡ€ΠΌΡ‹ DobRed. КинСм Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅, для Π²Π²ΠΎΠ΄Π° ΠΈ рСдактирования Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  1. TEdit - для Π²Π²ΠΎΠ΄Π° Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ. Π’ свойствС Name пишСм Familiya. Π’ свойствС Text очистим ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°;
  2. TEdit - для Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½ΠΈ. Π’ свойствС Name пишСм Imya. Π’ свойствС Text очистим ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°;
  3. TDateTimePicker – для Π²Π²ΠΎΠ΄Π° Π΄Π°Ρ‚Ρ‹. Π’ свойствС Name пишСм VData. Π’ Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС свойства DateMode Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ dmUpDown, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅;
  4. TEdit - для Π²Π²ΠΎΠ΄Π° Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°. Π’ свойствС Name пишСм NomerTelefona. Π’ свойствС Text очистим ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°;
  5. TEdit - для Π²Π²ΠΎΠ΄Π° элСктронного адрСса. Π’ свойствС Name пишСм EMail. Π’ свойствС Text очистим ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°;
  6. TCheckBox – ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ принадлСТности сотового Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°. Если Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ, Ρ‚ΠΎ сотовый Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ Π΅ΡΡ‚ΡŒ Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Π’ свойствС Caption пишСм Мобильник. Π’ свойствС Name пишСм Mobilnik;
  7. TComboBox – Π½ΠΈΡΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ список для Π²Ρ‹Π±ΠΎΡ€Π° Π³ΠΎΡ€ΠΎΠ΄Π°. Π’ свойствС Name пишСм Gorod. Π’ свойствС Text очистим ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°;
  8. TButton – ΠΊΠ½ΠΎΠΏΠΊΠ° для подтвСрТдСния добавлСния Π΄Π°Π½Π½Ρ‹Ρ…. Π’ свойствС Name пишСм Dobavit. Π’ свойствС Caption пишСм OK;
  9. TButton – ΠΊΠ½ΠΎΠΏΠΊΠ° для подтвСрТдСния рСдактирования Π΄Π°Π½Π½Ρ‹Ρ…. Π’ свойствС Name пишСм Redact. Π’ свойствС Caption пишСм OK.
ΠœΡ‹ ΠΊΠΈΠ½ΡƒΠ»ΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ 2 ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ дСйствиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΡΡ‚ΠΈΡΡŒ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ это способ Π½Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ Π·Π°Ρ‚ΠΎ эффСктивный.

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Ρ„ΠΎΡ€ΠΌΡƒ. Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ снова Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ. ПослС открытия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ DobavRedakt1 (Рис. 64).

Рисунок 64

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Project/Add to Project… ΠΈ Π² появившСмся ΠΎΠΊΠ½Π΅ (рис. 65).

Рисунок 65

Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ Ρ„Π°ΠΉΠ» DobavRedakt1.pas ΠΈ Π½Π°ΠΆΠΌΡ‘ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ OK. По этой ΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Ρ„Π°ΠΉΠ» DataModule1.pas , Ссли Ρƒ нас Π½Π΅Ρ‚ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ DataModule1. Данная ΠΊΠΎΠΌΠ°Π½Π΄Π° примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠΊΠ½Π΅ Project Manager ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌ pas ΠΈ dpr Ρ„Π°ΠΉΠ»Ρ‹. Окно Project Manager Π²Ρ‹Π»Π΅Π·Π΅Ρ‚ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ View/Project/Manager…

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ рСдактирования DobavRedakt1 ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ TelSprav1. Π’Π°ΠΊ ΠΆΠ΅ ΠΈ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ рСдактирования ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ DataModule1.

Ну всё! НСобходимыС, Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС, ΠΎΠΊΠ½Π° созданы. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ нСпосрСдствСнно ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnClick (Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ модуля) для ΠΊΠ½ΠΎΠΏΠΊΠΈ Dobavit пишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

procedure TTelefonSprav.DabavitClick(Sender: TObject);
begin
  {Ссли Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° "Dobavit", Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ
   ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ "ExiStsDobRed" Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ}

     ExiStsDobRed:=true;
  //ΠΏΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ "Dabavit" - "Tag=1"
     tag:=1;
  //Π΄Π΅Π»Π°Π΅ΠΌ доступной ΠΊΠ½ΠΎΠΏΠΊΡƒ "Dob"
     DobRed.Dobav.Visible:=true;
  //нСдоступной ΠΊΠ½ΠΎΠΏΠΊΡƒ β€œred”
     DobRed.Redact.Visible:=false;
  //ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ
     DobRed.ShowModal;
end;

Объявим Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ExiStsDobRed Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Var . Π’Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚, Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ.

var
  TelefonSprav: TTelefonSprav;
  ExiStsDobRed: boolean=false;

Данная пСрСмСнная ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ открытия ΠΎΠΊΠ½Π° ДобавлСния ΠΈ РСдактирования Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚Π° пСрСмСнная логичСского Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π²Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ False. ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ "Dobavit" пСрСмСнная ExiStsDobRed Ρ€Π°Π²Π½Π° True.

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ свойство Tag, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π² качСствС глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ 1 свойству Tag, ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ этому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° которая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°. НапримСр: ΠΌΡ‹ Π½Π°ΠΆΠ°Π»ΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Dobav, сработаСт событиС описанноС Π²Ρ‹ΡˆΠ΅.

Как я ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Ρƒ нас Π² ΠΎΠΊΠ½Π΅ добавлСния ΠΈ рСдактирования Π΄Π°Π½Π½Ρ‹Ρ… находятся 2 ΠΊΠ½ΠΎΠΏΠΊΠΈ Dobav, Redact (рис. 66).

Рисунок 66

На рисункС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π½Ρƒ Π° Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΉ строчкС ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΊΠ½ΠΎΠΏΠΊΡƒ Redact Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ. Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ строчкС Π΄Π΅Π»Π°Π΅ΠΌ доступной ΠΊΠ½ΠΎΠΏΠΊΡƒ Dobav. Π—Π° эти дСйствия ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ свойство Visible. Π’ послСднСй строчкС ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ для ДобавлСния ΠΈΠ»ΠΈ РСдактирования Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Ρ‚Π°ΠΊ, сначала ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ сСрвСра IdTCPServer (Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ° Indy Servers ). Для использования возмоТностСй сСрвСра этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΈ). ΠŸΡ€ΠΈ настройкС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ свойства:

  • Active - Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ»ΠΈ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ сСрвСр (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ False );
  • Bindings - настраиваСт сСрвСрныС сокСты (присоСдиняСт ΠΈΡ… ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ IP-адрСсов ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° настройки свойства Binding ;
  • ListenQueue - числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ максимальноС количСство запросов Π½Π° установлСниС соСдинСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ;
  • MaxConnections - позволяСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ максимальноС количСство ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², присоСдинСнных ΠΊ сСрвСру;

Рассмотрим нСсколько ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ настройку сСрвСрных Π³Π½Π΅Π·Π΄ с использованиСм свойства Bindings . Π’Π°ΠΊ, Π½Π° рис. 1 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° свойства Binding Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сСрвСр Π½Π° обслуТиваниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² с Π»ΡŽΠ±Ρ‹ΠΌΠΈ IP-адрСсами, ΠΏΡ€ΠΈ этом сСрвСрный сокСт присоСдиняСтся ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12340.

Рис. 1. Настройка свойства Binding .

На этом настройку сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ (хотя здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPServer ). Основная ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π° сСрвСра ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnExecute . Π’ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пСрСдаСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TIdContext - ΠΏΠΎΡ‚ΠΎΠΊ, ассоциированный с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, присоСдинСнным ΠΊ сСрвСру. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π΅Π³ΠΎ свойства Connection ) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² соСдинСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° TIdContext ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 1.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, ΠΊΠ°ΠΊ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (IdTCPClient - Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ° Indy Clients ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» способСн Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с нашим сСрвСром. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π’Π‘Π -ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ).

ПослС этого ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ свойства (ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…):

  • Host - имя ΠΈΠ»ΠΈ IP-адрСс ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ сСрвСр;
  • Port - Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присоСдинСн сСрвСрный сокСт.

Π’ΠΎΠΎΠ±Ρ‰Π΅, Π΄Π°ΠΆΠ΅ эти свойства Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ получаСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, Ссли Π΄Π°Π²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ ввСсти) имя ΠΈΠ»ΠΈ адрСс сСрвСра.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с описанными Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ IdTCPServer ΠΈ IdTCPClient рассмотрим созданиС нСслоТного ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного прилоТСния, клиСнтская ΠΈ сСрвСрная части ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

  • ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ соСдиняСтся с сСрвСром ΠΈ отправляСт Π΅ΠΌΡƒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строку, ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ сСрвСра тСкст, отсоСдиняСтся ΠΎΡ‚ сСрвСра.
  • Π‘Π΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку ΠΎΡ‚ клиСнтского прилоТСния ΠΈ посылаСт ΠΎΡ‚Π²Π΅Ρ‚ (Ρ‚Π°ΠΊΠΆΠ΅ тСкстовый), послС Ρ‡Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС. Плюс ΠΊ этому вСдСтся подсчСт количСства обслуТСнных ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ запоминаСтся IP-адрСс ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΡˆΠ΅Π» послСдний запрос.

РСализация ΠΊΠ°ΠΊ сСрвСрного, Ρ‚Π°ΠΊ ΠΈ клиСнтского ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² нашСм случаС ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ проста. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ сСрвСрного прилоТСния называСтся SimpleServer . Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ сСрвСра (Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния) прСдставлСн Π½Π° рис. 2.

Рис. 2. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ простого сСрвСра

ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit ) с количСством ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… запросов ΠΈΠΌΠ΅Π΅Ρ‚ имя txtCount , Π° тСкстовоС ΠΏΠΎΠ»Π΅ с адрСсом послСднСго обслуТСнного ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π°Π·Π²Π°Π½ΠΎ txtFrom . Вся Ρ€Π°Π±ΠΎΡ‚Π° сСрвСра Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события Execute для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPServer , ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (присоСдинитС этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12340 ΠΈ установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Active = True ) (листинг 1).

Листинг 1. РСализация простого сСрвСра

Procedure TForm1.FormCreate(Sender: TObject); begin section:= TCriticalSection.Create; end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: String; begin //ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° строку strText:= AContext.Connection.Socket.ReadLn; //ΠžΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ AContext.Connection.Socket.WriteLn("Took the line: " + strText); //Обновим свСдСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ сСрвСра (сСрвСр ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ, //поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ section.Enter; Inc(processed, 1); txtCount.Text:= IntToStr(processed); txtFrom.Text:= AContext.Connection.Socket.Binding.PeerIP; section.Leave; //Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ AContext.Connection.Disconnect; end;

ΠŸΡ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сСрвСр Ρ‚ΠΎΠ»ΡŒΠΊΠΎ повторяСт ΠΏΡ€ΠΈΠ½ΡΡ‚ΡƒΡŽ ΠΎΡ‚ Π½Π΅Π³ΠΎ строку с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ тСкста "ΠŸΡ€ΠΈΠ½ΡΠ»: " Π² Π½Π°Ρ‡Π°Π»ΠΎ строки.

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

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

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

ЕстСствСнно, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ клиСнтского прилоТСния Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ экзСмпляр ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPClient (Π΅Π³ΠΎ имя - IdTCPClient1 ). Бвойству Port этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 12340. ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit ) для Π²Π²ΠΎΠ΄Π° строки, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Π½Π΅ сСрвСр, ΠΈΠΌΠ΅Π΅Ρ‚ имя txtMessage . ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit ), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вводится имя ΠΈΠ»ΠΈ адрСс сСрвСра, Π½Π°Π·Π²Π°Π½ΠΎ txtServer . ПолС со строками ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Memo ) ΠΈΠΌΠ΅Π΅Ρ‚ имя txtResults .

Вся Ρ€Π°Π±ΠΎΡ‚Π° клиСнтского прилоТСния выполняСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ . ВСкст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 2 .

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

Procedure TForm1.Button1Click(Sender: TObject); begin //БоСдиняСмся с сСрвСром ΠΈ посылаСм Π΅ΠΌΡƒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ IdTCPClient1.Host:= txtServer.Text; IdTCPClient1.Connect; IdTCPClient1.Socket.WriteLn(txtMessage.Text); txtMessage.Text:= ""; //ОТидаСм ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Disconnect; end;

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

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ . Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π° Delphi XE.

Π‘Π»Π΅ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΠΏΠΎ сСти (IdTCPServer, IdTCPClient)

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

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

  • Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°;
  • Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ Ρ†Π²Π΅Ρ‚Π° для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°;
  • ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΡƒΡŽ копию экрана;
  • копию экрана, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½ΡƒΡŽ (ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ) Π΄ΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ².

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

  • get_screen_width - для получСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ get_screen_height -для получСния высоты экрана Π² пиксСлах;
  • get_screen_colors - для получСния значСния установлСнной для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ Ρ†Π²Π΅Ρ‚Π° (Π±ΠΈΡ‚ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ);
  • get_screen - для получСния ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ экрана;
  • get_screen: X, Y - для получСния ΠΊΠΎΠΏΠΈΠΈ экрана, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π₯ Ρ… Y .

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

Листинг 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;

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

Листинг 4. БнятиС ΠΊΠΎΠΏΠΈΠΈ экрана

//ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° снимаСт копию экрана, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ //ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΈ отправляСт //ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ клиСнтской ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ procedure SendScreen(width1: Integer; height1: Integer; Connection: TIdTCPServerConnection); var ScreenCopy: TCanvas; gr: TBitmap; stream: TMemoryStream; rcDest, rcSource: TRect; begin rcDest:= Rect(0,0,width1,height1); //ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния rcSource:= Screen.DesktopRect; //исходный Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния //создаСм ΠΊΠ°Π½Π²Ρƒ ΠΈ присоСдиняСм Π΅Π΅ ΠΊ контСксту Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола ScreenCopy:= TCanvas.Create; ScreenCopy.Handle:= GetDC(0); //создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для хранСния ΠΊΠΎΠΏΠΈΠΈ экрана ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ gr:= TBitmap.Create; gr.Height:= height1; gr.Width:= width1; 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 .

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ IdTCPServer (с ΠΈΠΌΠ΅Π½Π΅ΠΌ IdTCPServer1 ) Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ присоСдинСн ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12341 (Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ свойство Active = True ).

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

Рис. 3

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

Π’Π°Π±Π»ΠΈΡ†Π° 1. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° слСТСния ΠΈ ΠΈΡ… свойства

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

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

Procedure TForm1.cmbConnectClick(Sender: TObject); begin if cmbConnect.Caption = "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ" then begin if txtServer.Text = "" then //Π½Π΅ Π²Π²Π΅Π΄Π΅Π½ΠΎ имя сСрвСра MessageDlg("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя ΠΌΠ°ΡˆΠΈΠ½Ρ‹-сСрвСра Π² тСкстовом ΠΏΠΎΠ»Π΅", mtInformation, , 0) else begin //ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ сСрвСру IdTCPClient1.Host:= txtServer.Text; try IdTCPClient1.Connect; except MessageDlg("НС удаСтся ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ сСрвСром", mtError, , 0); Exit; end; end end else //ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΎΡ‚ сСрвСра IdTCPClient1.Disconnect; end;

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

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

Procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin txtServer.Enabled:= False; cmbConnect.Caption:= "ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"; //Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ пСриодичСски Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра Timer1.Enabled:= True; //Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос, Π½Π΅ доТидаясь срабатыввания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Timer1Timer(nil); end;

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

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

Procedure TForm1.IdTCPClient1Disconnected(Sender: TObject); begin txtServer.Enabled:= True; cmbConnect.Caption:= "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ"; Timer1.Enabled:= False; end;

Π‘Π°ΠΌΠΎΠΉ слоТной Ρ‡Π°ΡΡ‚ΡŒΡŽ клиСнтского прилоТСния являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, присылаСмых сСрвСром. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 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); //...копия экрана //.....1-ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ - ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ экрана Π±Π΅Π· сТатия //WriteLn("get_screen"); //.....2-ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ - сТатиС Π½Π° сторонС сСрвСра WriteLn("get_screen:" + IntToStr(imgScreen.Width) + "," + IntToStr(imgScreen.Height)); //....ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ stream:= TMemoryStream.Create; ReadStream(stream); stream.Position:= 0; //....Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ imgScreen.Picture.Bitmap.LoadFromStream(stream); stream.Clear; stream.Free; end; end;

Π’ тСкстС листинга 8 создано большоС количСство ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², поэтому Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΡΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π½Π΅Ρ‚ смысла. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ лишь Π½Π° Ρ‚ΠΎΠΌ, Π·Π°Ρ‡Π΅ΠΌ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ TForm1.Timer1Timer прСдусмотрСно Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° получСния изобраТСния с сСрвСра.

ВсС Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сТатиС (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ экрана наблюдаСмого ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° большС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° imgScreen ) Π½Π° сторонС сСрвСра Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ сСрвСрноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, большСго процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° снятиС ΠΊΠΎΠΏΠΈΠΈ экрана. Π­Ρ‚ΠΎ сниТаСт Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° ΡΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ изобраТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ экономит рСсурсы ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Но качСство сТатого изобраТСния Π² этом случаС получаСтся нСсколько Ρ…ΡƒΠΆΠ΅, Ρ‡Π΅ΠΌ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ прСдоставляСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Image Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Если ΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сТатиС изобраТСния Π½Π° сСрвСрС, возрастаСт Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° ΡΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎΠ»Π½ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ экрана, Π° вся Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΡΠΆΠ°Ρ‚ΠΈΡŽ изобраТСния возлагаСтся Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ imgScreen (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ тратится процСссорноС врСмя Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°). ΠŸΡ€ΠΈ большом Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ экрана наблюдаСмого ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° (ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ наблюдСнии сразу Π·Π° нСсколькими ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ) машина ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ссли ΠΎΠ½Π° нСдостаточно мощная, ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ вСсьма ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ "Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΡ‚ΡŒ". ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ сТатого изобраТСния ΠΏΡ€ΠΈ этом получаСтся Π±ΠΎΠ»Π΅Π΅ высоким.

Π’ качСствС Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ эффСктивного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большиС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ запросами Π΄Π°Π½Π½Ρ‹Ρ… с сСрвСра слСТСния с ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ изобраТСния Π½Π° сСрвСрной сторонС (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ машина сСрвСра Π½Π΅ являСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎΠΌΠΎΡ‰Π½ΠΎΠΉ).

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ . Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π° Delphi 7.

Π Π°Π· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅, Ρ‚ΠΎ я Ρ€Π΅ΡˆΠΈΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π‘Π” MS Jet 4.0 (ΠΏΡ€ΠΎΡ‰Π΅ говоря Π‘Π” MS Access). Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π·Π²Π°Π½ΠΎ Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎ Jet (ΠΏΡ€ΠΎΡˆΡƒ Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с MS Access) являСтся бСсплатным ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠΌ ΠΈ поставляСтся вмСстС с MS Windows (Ρ‚ΠΎ бишь для Ρ€Π°Π±ΠΎΡ‚Ρ‹ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сам Access). Π”Π° ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π‘Π” ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎΠΉ, ΠΈ ядро ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΡƒΡ‡Ρƒ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠΎΠ»Π΅ΠΉ для удовлСтворСния самых ΠΈΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Ρ… ΠΆΠ΅Π»Π°Π½ΠΈΠΉ ΠΏΡ€ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Ρ‚Π°ΠΊ создадим Π½ΠΎΠ²ΡƒΡŽ Π‘Π”, Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ Test ΠΈ сохраним Π΅Π΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ C:\ClientServer\Server\Data (процСсс создания Π½ΠΎΠ²ΠΎΠΉ Π‘Π” Π² АксСсС я, ΠΏΠΎ понятным, ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΎΠΏΡƒΡΠΊΠ°ΡŽ, ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ структуру Ρ‚Π°Π±Π»ΠΈΡ† - входящих Π² Π½Π°ΡˆΡƒ Π±Π°Π·Ρƒ).

1. Π’Π°Π±Π»ΠΈΡ†Π° пСрвая, Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ First (Π½Ρƒ Π½Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ я!)

2. Π’Π°Π±Π»ΠΈΡ†Π° вторая, Π° Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ ΡƒΠΆΠ΅ ΠΏΠΎ Ρ…ΠΈΡ‚Ρ€ΠΎΠΌΡƒ - Second

Ну Π²ΠΎΡ‚, ΠΊΠ°ΠΊ Π±Ρ‹, с Π±Π°Π·ΠΎΠΉ ΠΈ всС.

2. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
2.1. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСрвСр.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ сохраним Π΅Π³ΠΎ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Server Π² ΠΏΠ°ΠΏΠΊΠ΅ C:\ClientServer\Server. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Remote Data Module с Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Multitier рСпозитария (Рис. 1).

ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ RDM мастСр добавлСния запросит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ модуля - Ρ‚Π°ΠΌ Π²Π²Π΅Π΄Π΅ΠΌ имя нашСго сСрвСра "Test".

ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ оставим Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ПослС наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ "Ок" Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ появится Ρ„ΠΎΡ€ΠΌΠ° подобная ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Π΄Π°Ρ‚Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŽ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Test. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Π΅Π΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ RDMFrm.pas .

Π’Ρ‹Π»ΠΎΠΆΠΈΠΌ Π½Π° Π½Π΅Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ADOConnection (ΠΎΠ΄Π½Π° ΡˆΡ‚ΡƒΠΊΠ°), ADOTable ΠΈ DataSetProvider (ΠΏΠΎ Π΄Π²Π΅ ΡˆΡ‚ΡƒΠΊΠΈ). ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ADOTable ΠΈ DataSetProvider ΠΎΠ±Π·ΠΎΠ²Π΅ΠΌ - adotFirst, adotSecond, dspFirst ΠΈ dspSecond соотвСтствСнно. По Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠΊΡƒ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ ADOConnection вывалится мастСр Connection String. Π’Ρ‹Π±Π΅Ρ€Π°Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ "Use Connection String" ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΡƒ Build. Π’ появившСмся ΠΎΠΊΠ½Π΅ "Бвойства связи с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ" Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΏΡƒΠ½ΠΊΡ‚ "Microsoft Jet 4.0 OLE DB Provider" ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΡƒ "Π”Π°Π»Π΅Π΅". На Π²Π»Π°Π΄ΠΊΠ΅ "ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅" Π²Π²Π΅Π΄Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ Π‘Π”, Π½Π°ΠΆΠΌΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΎΡ‡ΠΊΡƒ "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅" ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. ПослС Ρ‡Π΅Π³ΠΎ Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ мастСр ΠΏΡƒΡ‚Π΅ΠΌ наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ ОК. Π•Ρ‰Π΅ Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ADOConnection свойство Π΅ΡΡ‚ΡŒ LoginPrompt, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ установим Π² False ΠΈ Connected - True. Π£ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Ρ‚ΠΎΠ² ADOTable свойство Connection установим Ρ€Π°Π²Π½Ρ‹ΠΌ ADOConnection ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ· Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка. Бвойство TableName установим Π² First ΠΈ Second соотвСтсвСнно. Бвойство CursorType - ctDynamic, свойство TableDirect - True. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ FieldsEditor ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° всС поля.

Π£ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² DataSetProvider:

Π’ΠΎΡ‚ Π½Π° этом процСсс создания ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ MIDAS сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСрвСр Π² подсистСмС DCOM Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ /regserver - Server.exe /regserver.
И послСдний ΡˆΡ‚Ρ€ΠΈΡ…, это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘ΠΎΠΊΠ΅Ρ‚Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΎΡ‚ Π‘ΠΎΡ€Π»Π°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ находится Π² ΠΏΠ°ΠΏΠΊΠ΅ Delphi?/Bin/scktsvr.exe. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠ³ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ сСрвСр Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ scktsvr.exe (Ссли Ρƒ вас установлСна Win NT/w2k/XP Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ слуТбу, для этого Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ scktsvr.exe /install)

2.2. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ сохраним Π΅Π³ΠΎ Π² ΠΏΠ°ΠΏΠΊΠ΅ C:\ClientServer\Client ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ Client. РазмСстим Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΠΎ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ClientDataSet(ΠΎΠ±Π·ΠΎΠ²Π΅ΠΌ ΠΈΡ… cdsFirst, cdsSecond), DataSource(ΠΎΠ±Π·ΠΎΠ²Π΅ΠΌ ΠΈΡ… dsFirst, dsSecond), DBGrid(ΠΎΠ±Π·ΠΎΠ²Π΅ΠΌ ΠΈΡ… dbgFirst, dbgSecond) ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ SocetConnection.

SocetConnection

Если Π²Ρ‹ всС сдСлали ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Ρ‚ΠΎ ΠΏΡ€ΠΈ установкС свойства Connected Π² True, Π΄ΠΎΠ»ΠΆΠ½ΠΎ запустится ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСрвСр.

ClientDataSet

Запустим Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ПолСй (Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ) ΠΈ занСсСм Ρ‚ΡƒΠ΄Π° всС поля. Для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ClientDataSet напишСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ sdsAfterPost

И подставим Π΅Π³ΠΎ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ события AfterPost ΠΎΠ±ΠΎΠΈΡ… ClientDataSet"ΠΎΠ².

DataSource

Бвойство Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
DataSet cdsFirst ΠΈ cdsSecond соотвСтствСнно

DBGrid

Бвойство Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
DataSource dsFirst ΠΈ dsSecond соотвСтствСнно

Запустим Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ (Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ) ΠΈ занСсСм Ρ‚ΡƒΠ΄Π° всС поля.
ПолоТим Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ Π²ΠΎΠ·Π»Π΅ Π“Ρ€ΠΈΠ΄ΠΎΠ² ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΈ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ onClick запишСм.