unit ClientFrmMainUnit;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
  GlobalUnit;const
  WM_CLSYNCHRONIZE = WM_USER + 1;type
  TClientFrmMain = class(TForm)
                     CBClientActive: TCheckBox;
                     IncomingMessages: TMemo;
                     Label1: TLabel;
                     Client: TIdTCPClient;
                     Label2: TLabel;
                     EditCommand: TComboBox;
                     Label3: TLabel;
                     EditMessage: TEdit;
                     Label4: TLabel;
                     EditRecipient: TEdit;
                     ButtonSend: TButton;
                     procedure CBClientActiveClick(Sender: TObject);
                     procedure ButtonSendClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
                     private
                      FormHandle: THandle;
                      procedure DoOnWakeMainThread(Sender: TObject);
                      procedure WMCLSynchronize(var Message: TMessage); message WM_CLSYNCHRONIZE;
                    public
                   end;
  TClientHandleThread = class(TThread)
                         private
                          CB: TCommBlock;
                          FrmHandle: THandle;
                          procedure HandleInput;
                          protected
                          procedure Execute; override;
                        end;var
  ClientFrmMain: TClientFrmMain;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)Function ShowForm(FormHandle: THandle):integer; stdcall;
implementation{$R *.DFM}
{Thread}
procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
    begin
      Terminate;
    end
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
    ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;//---连接服务端
procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
var
  thread: TClientHandleThread;
begin
  if CBClientActive.Checked then
  begin
    try
      Client.Connect(10000);  // in Indy < 8.1 leave the parameter away
      thread := TClientHandleThread.Create(True);      thread.FreeOnTerminate := True;
      //thread.OnTerminate :=HandleTerminate;
      thread.Resume();
    except
      on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    //ClientHandleThread.Terminate;
    Client.Disconnect;
  end;
  ButtonSend.Enabled := Client.Connected;
  CBClientActive.Checked := Client.Connected;
end;
//---发送命令
procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
  CommBlock : TCommBlock;
begin
  CommBlock.Command      := EditCommand.Text;         // assign the data
  CommBlock.MyUserName   := Client.LocalName;
  CommBlock.Msg          := EditMessage.Text;
  CommBlock.ReceiverName := EditRecipient.Text;
  Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;procedure TClientFrmMain.FormCreate(Sender: TObject);
begin
  Classes.WakeMainThread := DoOnWakeMainThread;
end;procedure TClientFrmMain.DoOnWakeMainThread(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_CLSYNCHRONIZE, 0, 0);
end;procedure TClientFrmMain.WMCLSynchronize(var Message: TMessage);
begin
  Classes.CheckSynchronize();
end;//---显示窗体
Function ShowForm(FormHandle: THandle):integer; stdcall;
var
  ClientFrmMain:tClientFrmMain;
begin
  ClientFrmMain:=TClientFrmMain.create(application);
  try
    ClientFrmMain.FormHandle :=FormHandle;
    ClientFrmMain.ShowModal;
    result:= 1;
  except
    ClientFrmMain.free;
    result:= -1;
  end;
end;end.
在form中可以的