Нашел ответ на второй вопрос. Конечно, может не самый лучший, но для моих целей пойдет. Вот код клиента:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan, ScktComp, ExtCtrls;
type
TForm1 = class(TForm)
XPManifest1: TXPManifest;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Timer1: TTimer;
Timer2: TTimer;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Get, First, Second, Fl: Boolean;
implementation
{$R *.dfm}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s: String;
begin
while Get do Application.ProcessMessages;
Get:=True;
if First then
begin
First:=False;
Fl:=False;
Timer2.Enabled:=True;
while Timer1.Enabled do Application.ProcessMessages;
ClientSocket1.Socket.SendText('2');
Socket.ReceiveText
end
else
if Second then
begin
s:=Socket.ReceiveText;
if pos('2', s)>0 then
begin
Second:=False;
Form1.Caption:='Клиент - подключен';
Edit1.ReadOnly:=False;
Button1.Enabled:=True
end
end
else
Memo1.Lines.Add(Socket.ReceiveText);
Get:=False
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True;
ClientSocket1.Active:=True
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
while Fl do
begin
ClientSocket1.Socket.SendText('1');
Timer1.Enabled:=True;
while Timer1.Enabled do Application.ProcessMessages
end
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:=False
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text);
Edit1.Text:=''
end;
begin
Get:=False;
First:=True;
Second:=True;
Fl:=True
end.
И код сервера:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, XPMan, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
XPManifest1: TXPManifest;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Timer1: TTimer;
Timer2: TTimer;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Get, First, Second, Fl: Boolean;
implementation
{$R *.dfm}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s: String;
begin
while Get do Application.ProcessMessages;
Get:=True;
if First then
begin
First:=False;
ClientSocket1.Active:=True;
Socket.ReceiveText
end
else
if Second then
begin
s:=Socket.ReceiveText;
if pos('2', s)>0 then
begin
Fl:=False;
Timer2.Enabled:=True;
while Timer1.Enabled do Application.ProcessMessages;
ClientSocket1.Socket.SendText('2');
Second:=False;
Form1.Caption:='Сервер - подключен';
Edit1.ReadOnly:=False;
Button1.Enabled:=True
end
end
else
Memo1.Lines.Add(Socket.ReceiveText);
Get:=False
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True
end;
procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
while Fl do
begin
ClientSocket1.Socket.SendText('1');
Timer1.Enabled:=True;
while Timer1.Enabled do Application.ProcessMessages
end
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled:=False
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text);
Edit1.Text:=''
end;
begin
Get:=False;
First:=True;
Second:=True;
Fl:=True
end.
Единственное примечание, Таймер1 я установил на 1 с, Таймер2 - на 2 секунды. Самое главное, чтоб таймер2 был больше таймера1. Естественно, в самом начале оба таймера надо отключить.
P.S. Тут я уже прогу до мини-чата доработал, просто интересно было

Насчет 6 вопроса. Скачал я себе TNT Unicode Contols, установил (вроде бы). Но почему-то при вставке TNT'вского эдита не компилируется программа - ошибка "Не найден TntStdCtrls.dcu". Куда его вставить надо, чтобы его Делфи мог найти?
П. с. Может на форуме эта тема уже обсуждалась, но я её не нашёл